Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 米斯拉C++;规则5-0-3误报警告_C++_Misra - Fatal编程技术网

C++ 米斯拉C++;规则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>

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

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
}
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
    ,正如您在编译时所知道的,它将适合。虽然你告诉编译器你希望它是一个