覆盖性静态分析说无符号的int是char(C++)



我正在使用Coverity来静态分析我们C++项目的一些源代码。我意识到这似乎是一个非常简单的问题,但我想如果 Coverity 有这样的问题,我想知道标记此错误的根本原因。它不断标记错误,我想知道此错误是否真的需要改变我的编码实践,或者是否真的没有必要。

它标记的错误示例是:

unsigned int a;
a = 5;

Coverity对此有问题,并说:

"CID 101436(#1 of 1(:隐式整数转换 (MISRA_CAST( integer_signedness_changing_conversion:MISRA-2004 规则 10.1 违规:隐式更改表达式的符号性。将具有基础类型字符(8 位,有符号(的 5 转换为具有不同符号的无符号 int(32 位,无符号(类型。

难道任何现代编译器都不知道在上面的示例中,5 是一个无符号的 int 而不是一个字符吗?这真的是一个有效的错误吗,它会导致编译错误吗? 一旦我添加,错误就会消失:

unsigned int a;
a = 5U;

如果我在每个无符号 int 之后不指定"U",这真的是一个问题吗?

根据定义,不带后缀的数字整数常量是有符号数量。 您需要强制转换常量或附加"U"后缀。

另一个问题是常量被分配了包含该值的最小类型。 例如,5 适合int8_tsigned char。 然而,260对于signed char来说太大了,所以它的最小类型是int

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

最新更新