【发布时间】:2017-08-04 15:34:10
【问题描述】:
我正在使用 Coverity 静态分析 C++ 项目的一些源代码。我意识到这似乎是一个简单得可笑的问题,但我想如果 Coverity 有这样的问题,我想知道这个错误被标记的根本原因。它不断标记一个错误,我想知道这个错误是否真的需要改变我的编码实践,或者它是否真的没有必要。
它标记的错误示例如下:
unsigned int a;
a = 5;
Coverity 对此有意见,并表示:
“CID 101436 (#1 of 1): 隐式整数转换 (MISRA_CAST) integer_signedness_sharing_conversion:MISRA-2004 规则 10.1 违规:隐式更改表达式的符号。将具有底层类型 char(8 位,有符号)的 5 转换为具有不同符号的 unsigned int(32 位,无符号)类型。"
难道没有任何现代编译器知道在上面的示例中 5 是无符号整数而不是字符吗?这真的是一个有效的错误吗?它会导致编译错误吗? 我添加后错误就会消失:
unsigned int a;
a = 5U;
如果我没有在每个 unsigned int 之后指定“U”,这真的是个问题吗?
【问题讨论】:
-
不,这显然不是问题。你为什么要关注 MISRA?
-
错误是对是错。
5是一个 int 是错误的,因为它是最小的整数文字。虽然5可用于毫无问题地初始化char,但它是正确的,因为它已知在char可以容纳的有效范围内。 -
如果您希望消除有关已签名类型的警告,请附加一个“U”或修改 Coverity 中的检查器(禁用检查器)。
-
我们使用 MISRA 是因为它是用于嵌入式系统的软件。
-
MISRA marmite 规则。编译器将执行隐式转换,但 MISRA 认为这是不安全的。嵌入式系统如此多样化,这掩盖了许多 MISRA 规则背后的原因(通常是历史原因)。您可能正在编写具有 256 字节 RAM、可疑字节序和“专有”实现的 8 位微控制器;那么你会非常感激 MISRA。然而,MISRA 试图阻止的许多问题已经被现代编译器阻止了。
标签: c++ unsigned-integer coverity