修改for循环体内变量i触发MISRA C-2012 Rule 14.2违规如何解决?
MISRA C-2012 规则14.2 违规问题解析
违规判定依据
- MISRA C-2012 Rule 14.2 明确约束:for循环的循环控制变量仅允许在循环头部的增量子句中修改,禁止在循环体内部修改循环控制变量,避免破坏for循环的明确语义约定。
- 本次代码中
i是for循环的控制变量,循环体内存在i = FLASH-1;的赋值操作,直接修改了循环控制变量,因此触发两类检测告警:一是违反规则14.2的专项告警,二是修改循环控制表达式关联变量的通用告警。
潜在运行风险
- 可读性大幅下降:for循环的迭代逻辑默认约定在头部定义,维护人员不会默认检查循环体内是否修改了控制变量,极易误判代码逻辑。
- 易引入边界错误:后续迭代中如果修改循环头部的终止条件、增量步长,或者调整
FLASH宏的取值,很容易忽略体内修改i的逻辑,引发数组越界、死循环、逻辑漏判等问题。 - 无法满足功能安全合规要求:汽车电子、工业控制等需要功能安全认证的场景,该类违规会直接阻断合规性校验流程。
合规修改方案
原代码修改i的目的是提前终止循环,直接使用break语句即可实现等价逻辑,无需修改循环控制变量,完全符合规则要求:
for( i = 0; i < FLASH; i++ ) { if( name.see[i] == 0xFF ) { name.see[ i ] = faultId | mnemonicType; break; /* 直接退出循环,不修改循环控制变量 */ } }
如果存在多条件提前退出的复杂场景,也可以新增独立的布尔控制标志位配合break使用,全程不修改循环控制变量i即可。
内容的提问来源于stack exchange,提问作者Sharon Deborah
相关产品推荐
相关产品推荐

