为了避免MISRA在以下代码中出现此错误,我该怎么做?我尝试使用(unit16_t)进行类型转换。但是后来它不允许显式转换。

在复杂表达式中从基础MISRA类型“unsigned char”非法隐式转换为“unsigned int”(MISRA C 2004规则10.1)

uint8_t速率= 3U;
uint8_t百分比= 130U;
uint16_t basic_units =比率*百分比;

最佳答案

问题在于,整数提升类型为“int”时,费率和百分比都被默默提升。因此,乘法是在有符号类型上执行的。

MISRA兼容代码是将代码重写为

 uint16_t basic_units = (uint16_t)rate * (uint16_t)percentage;

或按照MISRA的建议,立即将表达式的结果转换为其“基础类型”:
 uint16_t basic_units = (uint8_t)(rate * percentage);

编辑:澄清如下。



MISRA-C提供的资料性文字:



我实际上不确定上面的第二行是否可以满足MISRA,第二个想法是我可能将MISRA 10.1与10.5混淆了,后者将立即强制转换为基础类型,但仅在某些按位运算符的情况下。

我用LDRA静态代码分析测试了这两行,并且没有提示(但是给出了一些不正确的,不相关的警告),但是LDRA在MISRA-C上的表现也很差。

无论如何,原始问题的问题在于,整数促销将率和百分比都隐式转换为带符号的 int 类型,因为 int 可以表示uint8_t的所有值。这样就变成了
uint16_t basic units = (int)rate * (int)percentage.

为了防止这种情况,您必须显式键入。经过深思熟虑之后,我将选择上面两个中的第一行。

关于c - 为什么我的工具在这里抛出MISRA错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6359404/

10-11 21:04