我的静态分析器是投掷以下警告:MISRA C++规则5-0-3假阳性警告
MCPP规则5-0-3:该复合物的表达隐式转换为 不同必不可少类型
为以下代码:
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
的原因。
在你的架构,'32U'可能是64位。你为什么说“_32U有基础类型uint8_t_”? – YSC
如果你的int是比'uint32_t'越大,则'ARG%32U'是类型'无符号int'而不是'uint32_t'的。 – Jarod42
要检查,只是'的std ::法院<<的sizeof(unsigned int类型)<< “\ n”;'。 – YSC