我的静态分析器抛出以下警告:
对于以下代码:
void func(const uint32_t arg)
{
//32U has underlying type uint8_t
const uint32_t u32a = arg % 32U; //warning issued in this line
const uint32_t u32b = (arg % static_cast<uint32_t>(32U)); //same warning issued in this line
const uint32_t u32c = static_cast<uint32_t>(arg % 32U); //compliant
}
根据MISRA底层类型转换规则:
我认为这个警告可能是误报,因为尽管
32U
是 uint8_t
,但表达式应该采用较大类型的基础类型,在这种情况下是 uint32_t
,因此不需要 static_cast
。您是否同意这是误报?还是我看错了?
编辑:
MISRA 标准规定:
第 2 点是我必须假设
32U
具有 uint8_t
基础类型的原因。 最佳答案
您已找到相关部分。文字所在的表达式的类型是无符号的,因此底层类型是可以容纳无符号值 32
的最小类型,即 uint8_t
。如果文字是没有 U 后缀的 32
,它将具有完全相同的基础类型(尽管这会违反其他 MISRA 规则)。
MISRA 在这里的目标是在特定表达式 uint32_t arg; ... arg % 32U
中永远不会发生危险的隐式转换。话虽如此,您可以安全地将文字转换为 uint32_t
,这应该可以消除所有警告。确保您的代码中没有隐式类型提升,无论 MISRA 说什么/不说什么,这都是好的编程实践。
如果静态分析器的目的只是检查一般的隐式促销,那么警告就可以了。如果您的静态分析器的目的是检查 MISRA 合规性,那么它就是误报。
无论工具的用途如何,arg % static_cast<uint32_t>(32U)
行都不应产生任何形式的诊断信息。这当然是误报。
关于c++ - MISRA C++ 规则 5-0-3 误报警告,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43206493/