Coverity静态分析说无符号Int是Char(C ++)

时间:2017-08-04 15:34:11

标签: c++ unsigned-integer coverity

我正在使用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”,那真的是一个问题吗?

1 个答案:

答案 0 :(得分:3)

根据定义,没有后缀的数字积分常数是有符号数量。你要么需要施放常数,要么追加“' U'后缀。

另一个问题是常量被分配了包含该值的最小类型。例如,5适合int8_tsigned char。但是,对于signed char而言,260太大,因此其最小类型为int

签名问题解决后,第二个警告可能会消失。