gpt4 book ai didi

c++ - MISRA 警告<复杂表达式被隐式转换为不同的基本类型。>

转载 作者:行者123 更新时间:2023-11-28 04:14:22 25 4
gpt4 key购买 nike

MISRA C++ 规则:5_0_3

尝试使用一种符合 MISRA 标准的静态工具分析器,但无法解决。

#include<iostream>
#include<stdlib.h>

using namespace std;

int main()
{
uint32_t num = 0U;
bool Flag =false;

num |= (Flag ? (0b10 << 10):(0b00 << 10));
}

请帮助解决这个问题。错误消息是:1. 此二元按位运算符的非常量操作数具有不同的基本类型。2. 这个复杂的表达式被隐式转换为不同的基本类型。

最佳答案

首先是0b语法是非标准的,所以不知道它会做什么。仅该语法就违反了 MISRA;我建议改用十六进制常量。无论如何,您的代码不应包含任何“魔数(Magic Number)”。

如果我们假设您的编译器处理非标准 0b整数常量,因为它处理常规的十进制整数常量,那么它们的类型是(有符号的)int .您的操作结果是 signed int,正如 MISRA 所说的“本质上已签名”。但是您将其存储在 uin32_t 中这基本上是无符号的,这是 MISRA 违规和错误的原因。

请注意,移位运算符始终具有整数提升左操作数的类型。所以写类似 0b10 << 10u 的东西不会帮助。根据经验,永远不要对有符号操作数使用按位运算符。

另请注意 ?:是奇特的,因为它包含第二个和第三个操作数的隐式转换——它们平衡为同一类型(根据“通常的算术转换”)。这会产生细微的错误,因此最好远离 ?:当使用小整数类型或有符号类型时(或者当使用 MISRA 时)。

我还建议将代码重写为“魔数(Magic Number)”较少的代码:

#define MASK_SOMETHING  (0x2u << 10) // give this some meaningful name
#define MASK_EMPTY (0x0u << 10) // give this some meaningful name

uint32_t num = 0U;
bool Flag = false;

...

if(Flag)
{
num |= MASK_SOMETHING;
}

显然,针对零的按位或不是很有意义,也许您打算在未设置标志的情况下清除这些位?在这种情况下你需要 else { num &= ~MASK_EMPTY; } .

(这也可以进一步优化以摆脱分支。)

关于c++ - MISRA 警告<复杂表达式被隐式转换为不同的基本类型。>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56983555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com