在MISRA C ++ 2008中,任何人都知道规则5-0-3中出现的专业概念Cvalue表达式?

时间:2016-12-21 06:14:49

标签: c++ misra

从Cvalue的概念中,我意识到了

  

“隐式或显式不应进行进一步转换的表达式称为cvalue表达式。”

但是这个例子提供的例子。

s32 = static_cast < int32_t > ( s8 ) + s8; // Example 2 - Compliant
s32 = s32 + s8; // Example 3 - Compliant

显然,正确的添加表达式会在此处隐式显式转换。而这条规则将它们标记为合规。我认为这与概念cvalue相矛盾。

1 个答案:

答案 0 :(得分:3)

在第57页末尾,MISRA Cpp 2008:

  

类似,除非列出如下:

     
      
  • 。 。

  •   
  • 其他未列出的表达式不是 cvalues ,并且具有该操作的基础类型

  •   

在该段落之后阅读长列表,s8无法应用任何内容。

然后,s8不是 cvalues ,它具有操作的基础类型,在您的示例中,其基础类型为int32_t。促销int32_t并不违反规则。

5-0-3的重点是它希望确保所有操作都在相同的底层类型中执行。

int32_t s32;
int8_t s8;
s32 = static_cast < int32_t > ( s8 ) + s8; // Example 2 - Compliant
s32 = s32 + s8; // Example 3 - Compliant

在上述示例中,+使用基础类型int32_t执行(到目前为止,大多数intint32_tint16_t) ,返回基础类型int32_t,然后分配给int32_t变量,从而符合MISRA Cpp。

在这个例子中:

int32_t s32;
int8_t s8;
s32 = s8 + s8;

它没有合规性,因为加法运算符的执行类型为int,结果将转换为int32_t,这与int不一样,因此不遵守。