c - MISRA 违规 "441 - Float cast to non-float "

标签 c misra

我正在尝试更正使用以下代码发生的 MISRA 违规“441 - float 转换为非 float ”:

tULong frames = (tULong)(runTimeSeconds * 40.0f);

runTimeSeconds 是一个float,显然 40.0f 被指定为一个float。有什么想法吗?

最佳答案

有一条规则 (MISRA-C:2004 10.4) 说明浮点类型的复杂表达式的值只能转换为更窄的浮点类型。

(runTimeSeconds * 40.0f) 就是这样一个所谓的复杂表达式(MISRA-C:2004 术语)。为了避免违反 MISRA,您可以引入一个临时变量:

float tmp = runTimeSeconds * 40.0f;
tULong frames = (tULong)tmp; // no complex expression, this is fine

这条规则的基本原理是复杂的表达式可能包含隐式类型提升和类似的危险事物。

MISRA-C:2004 也担心/偏执于认为更改代码如 uint8_t u8a, u8b; 的无能程序员; ... u8a + u8b(uint32_t)(u8a + u8b) 会以某种方式导致加法作为无符号 32 位类型执行。


这些规则在 MISRA-C:2012 中得到了改进,并且在那里更加合理。根据 MISRA-C:2012 10.5,从浮点表达式到无符号表达式的转换没问题。

关于c - MISRA 违规 "441 - Float cast to non-float ",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41578027/

相关文章:

c - 规则 14.2 for 循环应符合 MISRA C 2012 的格式

c++ - 将指向 X 的指针转换为 X 的数组

c++ - 覆盖按位运算符时的 MISRA 警告

c - 将 %u 说明符与浮点变量一起使用时出现意外输出?

c - #define FUNC(x,y) x=^y; y^x;在c中

c - 米斯拉 11.3 : cast from int to pointer

c - do while(0) or if else 哪一个适合单一导出点?

c - 覆盖文本文件的一部分

比较两个空指针

c - Libev,如何将参数传递给相关回调