我正在使用Coverity静态分析C ++项目的一些源代码。我意识到这可能看起来像一个非常简单的问题,但我想如果Coverity有这样的问题我想知道这个错误被标记的根本原因。它不断标记错误,我想知道这个错误是否真的改变了我的编码实践,或者它是否真的没必要。
它标记的错误示例是:
unsigned int a;
a = 5;
Coverity有一个问题,并说:
“CID 101436(#1 of 1):隐式整数转换(MISRA_CAST) integer_signedness_changing_conversion:MISRA-2004规则10.1违规:隐式更改表达式的签名。转换5,使用基础类型char(8位,有符号),键入具有不同签名的unsigned int(32位,无符号)。“
在上面的例子中,没有任何现代编译器知道5是unsigned int而不是char吗?这真的是一个有效的错误,它是否会导致编译错误? 一旦我添加错误就会消失:
unsigned int a;
a = 5U;
如果我在每个unsigned int之后没有指定“U”,那真的是一个问题吗?
答案 0 :(得分:3)
根据定义,没有后缀的数字积分常数是有符号数量。你要么需要施放常数,要么追加“' U'后缀。
另一个问题是常量被分配了包含该值的最小类型。例如,5适合int8_t
或signed char
。但是,对于signed char
而言,260太大,因此其最小类型为int
。
签名问题解决后,第二个警告可能会消失。