当用klocwork进行分析时,如下一行
pTxData[index] = ( UINT8_C(0) << UINT8_C(4) );给出误差
按位操作操作数的类型为“有符号字符”,而不是“无符号整数”。
通过删除任何#define,我已经将问题降到了最低限度,并且完全不知道为什么会发生这种情况。
发布于 2019-02-27 10:55:08
在大多数表达式中,秩小于int的整数类型被转换为int (如果int可以表示所有值而不损失)或unsigned int (否则)。
为了简化它,考虑排序对应于类型中的位数,位数越多,排名就越高(对于术语的明确处理,请参见语言引用(例如,您可以启动这里))。
这里的情况似乎是这样的,UINT8_C()返回的类型(可能是伪装的unsigned char )的级别比int小,因此您最终会得到一个有符号的类型。
现在,发出警告的原因是,在所有情况下都不是很好地定义了移位的有符号整数类型。转移负值时留下的或溢出的行为构成了未定义的行为,这意味着如果遇到这两种情况中的任何一种,程序可能会以多种方式出现错误行为。(在转换无符号类型时,溢出是合法的,您将得到一个截断的值)。
而且,轮班计数不可能是负的。
但是,如果这是确切的代码,则警告是不必要的,因为很明显,将0左移4个位置是完全安全的。如果您使用变量而不是常量,编译器(或工具)并不总是能够推断这种转移的安全性,在这种情况下,您应该注意警告并重写代码,这样既不会出现未定义的行为,也不会出现警告。
https://stackoverflow.com/questions/54903162
复制相似问题