我的静态分析器抛出以下警告:



对于以下代码:

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底层类型转换规则:



我认为这个警告可能是误报,因为尽管 32Uuint8_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/

10-13 00:01