【问题标题】:Coverity Static Analysis Saying Unsigned Int is Char (C++)Coverity 静态分析说 Unsigned Int 是 Char (C++)
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 那么没有U后缀,编译器会将5解释为char?它必须知道它被分配给一个 unsigned int 权限并自动解析为该类型对吗?我只是想知道如果现代编译器显然对这类事情没有任何问题,为什么会存在这个 MISRA 规则。
  • 您需要获取 MISRA C-2004 的副本并查找“6.10.4 基础类型”部分。太多文字无法粘贴到答案中。
  • 你可以通过在网上搜索“stackoverflow MISRA C”找到一些相关问题
猜你喜欢
  • 2020-08-05
  • 2014-04-28
  • 2013-11-18
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多