Jul*_*ien 2 c bit-shift klocwork
通过klocwork分析时,以下行
pTxData[index] = ( UINT8_C(0) << UINT8_C(4) );
Run Code Online (Sandbox Code Playgroud)
给出错误
按位运算的操作数的类型为“符号字符”,而不是“无符号整数”
我已经通过删除任何问题将问题减少到最低程度,#define并且完全不知道为什么会发生这种情况。
对于那些不知道的人,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)请参阅隐式类型提升规则
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |