C++ 米斯拉C++;规则5-0-3误报警告
我的静态分析器抛出以下警告: MCPP规则5-0-3:此复杂表达式隐式转换为 不同本质类型 对于以下代码:C++ 米斯拉C++;规则5-0-3误报警告,c++,misra,C++,Misra,我的静态分析器抛出以下警告: 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>
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
}
void函数(const uint32\u t参数)
{
//32U具有基础类型uint8\t
const uint32_t u32a=arg%32U;//此行发出警告
const uint32_t u32b=(arg%static_cast(32U));//此行发出相同的警告
const uint32\u t u32c=静态强制转换(arg%32U);//兼容
}
根据MISRA基础类型转换规则:
否则,如果两个操作数都是整数类型,则
可以使用以下命令找到表达式:
–如果
操作数大小相同,且任一操作数无符号,结果为
没有签名
–否则,结果类型为较大的结果类型
类型
我认为这个警告可能是误报,因为尽管32U
是uint8\u t
,表达式应该采用较大类型的底层类型,在本例中是uint32\u t
,因此不需要静态转换
你同意这是假阳性吗?还是我看错了
编辑:
MISRA标准规定:
因此,整型常量表达式的基础类型为
定义如下:
如果表达式的实际类型是有符号整数,则基础类型定义为最小的有符号整数类型,即
能够表现其价值
如果表达式的实际类型是无符号整数,则基础类型被定义为
能够体现其价值
在所有其他情况下,表达式的基础类型定义为与其实际类型相同
第二个原因是我必须假设32U
具有uint8\t
的底层类型
我认为这个警告可能是误报,因为尽管32U
是uint8\u t
32U
不是任何平台上的uint8\t
。对于整数文本,可以表示的最小类型是int
/无符号int
<代码>nnnnU
可以
a无符号整数
,无符号长整数
,或无符号长整数
。它确实选择了文本可以存储的第一种类型,因此32U
是无符号int
因此,如果您想保证
32U
与uint32\u t
的类型相同,那么您需要在右侧进行强制转换。32U
的类型为无符号
,这可能是与uint32\u t
不同的类型。与您的陈述相反,它从来不是uint8\u t
无符号的仅保证能够表示0
到65535
范围内的值,尽管允许它支持更大的范围。它实际上可以表示的是实现定义的。但是,它不能是uint8\u t
,因为uint8\u t
不能表示无符号
所需的范围
这意味着,实际上有三种可能性是,无符号
可以是16位类型、32位类型,甚至64位类型,它们分别比uint32\t
小、大小相同或大
因此表达式arg%32U
的结果可能是uint32\u t
类型(如果无符号
为16位),uint32\u t
(如果无符号
和uint32\u t
都是相同的32位类型),或者无符号
(如果无符号
为64位类型)。在最后一种情况下,初始化u32a
需要从unsigned
转换为uint32\t
您的静态分析仪警告您系统间行为的潜在变化
因此,不,这不是假阳性。您已经找到了相关部分。文本所在的表达式类型是无符号的,因此基础类型是可以适合无符号值32
,意思是uint8\t
的最小类型。如果文本是32
而没有U后缀,那么它将具有非常相同的底层类型(尽管这会违反其他MISRA规则)
MISRA在这里的目标是在特定表达式uint32\u t arg。。。arg%32U
永远不会发生危险的隐式转换。也就是说,您可以安全地将文本强制转换为uint32\t
,这将使所有警告静音。确保代码中没有隐式类型提升,无论MISRA说/不说什么,这都是好的编程实践
如果静态分析仪的目的只是检查一般情况下的隐性提升,则警告正常。如果静态分析仪的目的是检查MISRA合规性,则为假阳性
无论工具的用途如何,行arg%static\u cast(32U)
都不应产生任何形式的诊断。这肯定是误报。在您的体系结构中,32U
可能是64位。为什么说“32U具有基础类型uint8_t”?如果您的int大于uint32_t
,则arg%32U
的类型为unsigned int
,而不是uint32_t
,我对米斯拉并不熟悉,所以我不能确定,但我认为这只是在谈论32
<代码>32可以被视为有效的uint8\t
,正如您在编译时所知道的,它将适合。虽然你告诉编译器你希望它是一个