含浮点数比较的if语句触发MISRA C 2012 R13.5错误,求解决
MISRA C 2012 R13.5错误分析与解决方法
错误原因
MISRA C 2012 Rule 13.5的核心要求是:逻辑运算符&&或||的右操作数不得包含任何副作用。这里的“副作用”指会改变程序状态的操作,比如变量赋值、自增/自减、带状态修改的函数调用等。
你的代码里虽然只是单纯的浮点数比较,但部分静态分析工具会对数组元素访问、直接嵌套的比较表达式产生误判——或是工具的规则实现中,将“非纯表达式”(即使无实际副作用)也纳入限制范围。另外,最后一个if中的t_A_f、t_B_f等变量未在代码片段中定义,这种未声明变量的情况也可能干扰工具的分析逻辑,但核心触发点还是逻辑运算符右操作数的表达式形式不符合工具的规则判定标准。
合规解决方法
最稳妥的修正方式是将每个比较操作的结果先存储到单独的布尔变量中,再用这些变量进行逻辑运算。这样每个逻辑运算符的操作数都是单纯的变量引用,完全没有副作用,符合Rule 13.5的要求。
修改后的代码示例:
/* 若环境未提供标准布尔类型,自行定义 */ typedef uint8_t bool; #define true 1U #define false 0U static float32_t g_A_pf[4]={0.1f}; static float32_t g_A_f = 0.00001f; static float32_t g_B_f = 0.1f; static float32_t g_C_f = 0.1f; static float32_t g_D_f = 0.1f; /* 补充定义未声明的变量 */ static float32_t t_A_f = 0.0f; static float32_t t_B_f = 0.0f; static float32_t t_C_f = 0.0f; static float32_t t_D_f = 0.0f; /* Float */ bool cond1 = (g_A_pf[0] > g_A_pf[1]); bool cond2 = (g_A_pf[2] < g_A_pf[3]); if (cond1 && cond2) { ; /* 空语句 */ } bool cond3 = (g_A_f > g_B_f); bool cond4 = (g_C_f < g_D_f); if (cond3 && cond4) { ; /* 空语句 */ } bool cond5 = (t_A_f > t_B_f); bool cond6 = (t_C_f < t_D_f); if (cond5 && cond6) { ; /* 空语句 */ }
额外说明
- 若开发环境支持C99标准,可直接包含
stdbool.h头文件,使用标准的bool、true、false,无需自行typedef。 - 确保所有用到的变量都已正确声明和初始化,避免未定义行为干扰静态分析工具的判断。
内容的提问来源于stack exchange,提问作者Shopping
相关产品推荐
相关产品推荐

