Coverity 静态分析说 Unsigned Int 是 Char (C++)
Coverity Static Analysis Saying Unsigned Int is Char (C++)
我正在使用 Coverity 静态分析 C++ 项目的一些源代码。我意识到这可能看起来像一个荒谬的简单问题,但我想如果 Coverity 有这样的问题,我想知道标记此错误的根本原因。它一直在标记一个错误,我想知道这个错误是否真的需要改变我的编码实践,或者它是否真的没有必要。
它标记的错误示例是:
unsigned int a;
a = 5;
Coverity 对此有疑问并表示:
"CID 101436(第 1 个,共 1 个):隐式整数转换 (MISRA_CAST)
integer_signedness_changing_conversion:违反 MISRA-2004 规则 10.1:隐式更改表达式的符号。将基础类型 char(8 位,有符号)的 5 转换为具有不同符号的 unsigned int(32 位,无符号)类型。"
任何现代编译器都不知道上面示例中的 5 是一个 unsigned int 而不是 char 吗?这真的是一个有效的错误吗,它会导致编译错误吗?
我添加后错误就会消失:
unsigned int a;
a = 5U;
如果我不在每个 unsigned int 后面指定 "U" 真的是个问题吗?
根据定义,没有后缀的数字整数常量是有符号的量。您将需要转换常量或附加 'U' 后缀。
另一个问题是常量被分配为包含值的最小类型。例如,5 适合 int8_t
或 signed char
。但是,260 对于 signed char
来说太大了,所以它的最小类型是 int
。
签名问题解决后,第二个警告可能会消失。
我正在使用 Coverity 静态分析 C++ 项目的一些源代码。我意识到这可能看起来像一个荒谬的简单问题,但我想如果 Coverity 有这样的问题,我想知道标记此错误的根本原因。它一直在标记一个错误,我想知道这个错误是否真的需要改变我的编码实践,或者它是否真的没有必要。
它标记的错误示例是:
unsigned int a;
a = 5;
Coverity 对此有疑问并表示:
"CID 101436(第 1 个,共 1 个):隐式整数转换 (MISRA_CAST) integer_signedness_changing_conversion:违反 MISRA-2004 规则 10.1:隐式更改表达式的符号。将基础类型 char(8 位,有符号)的 5 转换为具有不同符号的 unsigned int(32 位,无符号)类型。"
任何现代编译器都不知道上面示例中的 5 是一个 unsigned int 而不是 char 吗?这真的是一个有效的错误吗,它会导致编译错误吗? 我添加后错误就会消失:
unsigned int a;
a = 5U;
如果我不在每个 unsigned int 后面指定 "U" 真的是个问题吗?
根据定义,没有后缀的数字整数常量是有符号的量。您将需要转换常量或附加 'U' 后缀。
另一个问题是常量被分配为包含值的最小类型。例如,5 适合 int8_t
或 signed char
。但是,260 对于 signed char
来说太大了,所以它的最小类型是 int
。
签名问题解决后,第二个警告可能会消失。