MISRA中文网站 > 新手入门 > MISRA C对switch语句有哪些要求 MISRA C switch语句缺少default如何处理
教程中心分类
MISRA C对switch语句有哪些要求 MISRA C switch语句缺少default如何处理
发布时间:2026/08/18 16:28:26

  switch在状态机、通信协议解析和模式选择中使用频率很高,同时也是MISRA C重点约束的控制结构之一。进行“MISRA C对switch语句有哪些要求,MISRA C switch语句缺少default如何处理”时,应关注分支结构是否清晰、异常输入是否有处理路径,以及整改后是否仍存在控制流隐患。以下主要按照MISRA C:2012的Rule 16.x规则说明。

  一、MISRA C对switch语句有哪些要求

 

  MISRA C对switch的要求并不只针对default,还涉及分支终止、标签位置、分支数量和控制表达式等。静态检查出现Rule 16.x告警时,应结合具体规则逐项调整。

 

  1、每个有效分支应明确结束

 

  Rule 16.3要求switch-clause通过无条件break结束,用于降低意外贯穿到下一个分支的风险。官方说明指出,fall-through虽然可能是有意设计,但在人工编写代码中也经常来自遗漏。

 

  推荐保持每个实际处理分支结构完整:

  ①检查每个【case分支】末尾的控制流。

 

  ②正常处理完成后使用【break】明确退出。

 

  ③原代码存在有意贯穿时,重新评估是否可以合并分支或重构公共处理逻辑。

 

  这样在后续新增case时,不容易因为原来的隐式贯穿产生新的执行路径。

 

  2、每个switch都应包含default

 

  Rule 16.4明确要求每个switch具有default,即使从当前变量取值范围判断,default理论上永远不会执行,也仍然要求保留。MISRA将这一设计用于防御异常状态以及未来代码变化。

 

  例如枚举已经覆盖全部正常值,也可以保留:

  default中的处理应根据系统风险决定,可以选择错误记录、安全状态恢复、拒绝执行或其他明确措施。

 

  3、default位置也有限制

 

  Rule 16.5要求default位于switch所有标签中的第一个或最后一个位置。

 

  ①现有default夹在多个case中间时,将其调整到【首个标签】或【最后一个标签】。

 

  ②人工维护代码通常可以统一放在最后,方便阅读正常分支后再处理异常情况。

 

  ③调整位置后重新检查控制流,避免移动代码时遗漏break。

 

  4、同时检查switch整体结构

 

  MISRA C:2012的Rule 16.1要求switch保持良好结构;Rule 16.6要求至少具有两个switch-clause;Rule 16.7则规定switch-expression不应属于本质布尔类型。

 

  如果实际只是在true和false之间选择,通常更适合重新审视是否应该使用条件判断,而不是为了统一形式保留一个只有简单路径的switch。

 

  二、MISRA C switch语句缺少default如何处理

 

  静态分析发现Rule 16.4违规后,优先要确定“异常取值出现时程序应该做什么”,再根据业务风险补充default。

  1、普通状态机补充异常处理

 

  例如原代码:

  可以调整为:

  ①状态机可以把default设置为【进入安全状态】。

 

  ②协议解析可以设置为【拒绝非法命令】。

 

  ③设备控制代码可以采用【记录错误并停止当前操作】。

 

  ④安全相关变量还应确认异常路径确实能够在最终目标代码中执行。

 

  MISRA官方针对防御代码特别提醒,如果编译器能够证明某个default不可达,优化过程可能影响这段防御逻辑,因此特定安全场景还需要检查最终生成的二进制代码。

 

  2、不需要业务动作时也要明确表达意图

 

  如果所有合法枚举值都已经处理,而且异常值无需改变系统状态,可以保留空处理意图:

  ①保留【default】和【break】。

 

  ②使用简洁注释说明为什么这里不执行其他动作。

 

  ③如果项目具有故障诊断要求,优先增加错误记录,避免异常状态完全静默。

 

  这种写法仍然保留了异常入口,后续枚举增加新值时也更容易在代码审查中发现遗漏。

 

  3、不要直接屏蔽静态检查告警

 

  如果代码可以修改,直接补全结构通常比忽略Rule 16.4更加清晰。对于自动生成且不准备由人工阅读、评审或修改的代码,MISRA官方Permits允许在满足限定条件时采用偏离,其中还要求生成代码能够说明default缺失的原因。

 

  ①先判断当前代码是否确实属于【自动生成代码】。

 

  ②无法整改时,按照项目流程建立【偏离记录】。

 

  ③记录规则编号、技术理由、风险判断和验证依据。

 

  ④不要把工具中的【Suppress】或【Ignore】直接当作完成MISRA偏离。

 

  三、MISRA C switch整改后如何检查

 

  完成switch结构调整后,需要确认修改不仅消除了规则告警,也没有引入新的控制流问题。检查重点放在异常分支是否有效,以及静态分析结果是否完整收敛。

 

  1、验证异常分支

 

  ①构造一个不属于任何case的测试值,确认程序能够进入default。

 

  ②检查异常情况下的处理结果是否符合设计,例如进入安全状态、拒绝非法命令或记录错误。

 

  ③对于状态机、通信解析等关键代码,建议把default路径纳入单元测试覆盖范围。

 

  2、重新执行静态检查

 

  ①重新运行MISRA C静态分析工具。

 

  ②确认Rule 16.4告警已经消失,同时检查Rule 16.1、Rule 16.3、Rule 16.5等关联规则。

 

  ③如果某段代码确实无法整改,再按照项目规范建立偏离记录,保留技术理由和风险分析,不要只在工具中屏蔽告警。

  总结

 

  MISRA C对switch的约束重点在于让分支边界清晰,并为异常输入保留明确处理路径。default的作用也不仅是满足规则,它还能减少枚举扩展、数据异常或状态错误带来的不可控行为。对于状态机、协议解析和安全相关代码,建议同时结合静态分析与异常路径测试判断整改是否真正有效。如需进一步了解MISRA C switch语句要求、default缺失处理及相关规则检查方法,欢迎联系咨询。

135 2431 0251