了解Klocwork按位操作符号

Jul*_*ien 2 c bit-shift klocwork

通过klocwork分析时,以下行

pTxData[index] =  ( UINT8_C(0) << UINT8_C(4) );
Run Code Online (Sandbox Code Playgroud)

给出错误

按位运算的操作数的类型为“符号字符”,而不是“无符号整数”

我已经通过删除任何问题将问题减少到最低程度,#define并且完全不知道为什么会发生这种情况。

Lun*_*din 5

对于那些不知道的人,UINT8_C是C标准宏1)用于获取类型的整数常量uint_least8_t而不是default int

因此UINT8_C(0)等于(uint_least8_t)0。这将是一个小的整数类型。因此,当作为左操作数传递给时,它会受到整数提升2)的影响<<。晋升后最终成为类型int,等同于写作0

永远不要将带符号的操作数与按位运算符一起使用,因此这是错误消息的核心原因。更正后的代码应如下所示0u << 4。尽管此代码对于除自我记录代码以外的任何东西当然毫无意义。(当然,将值偏移为0总是无害的。)

使用UINT8_C上的右操作数<<是无稽之谈-操作数不以任何类型的推广结果的分享。如果您只需要使用无符号文字来确定编码标准,则可以使用4u。值得注意的是,像MISRA-C标准并没有要求u这是从工具误报的常见原因-在你其实并不需要一个无符号类型的情况下,后缀。

摘要-使用此:

pTxData[index] =  0u << 4;
Run Code Online (Sandbox Code Playgroud)

此外,Klockwork提供了错误的诊断消息。表达式中的运算符既可能等同于工具,unsigned char也绝对signed char不像工具所说的那样。


1)在C99 7.18.4.1中引入

2)请参阅隐式类型提升规则