You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:06:02