Misra C++:2023

MISRA C++:2023 是一套面向安全关键嵌入式系统(尤其是汽车领域)中使用 C++17 的付费指南,引发了关于其价值、范围和实际影响的讨论。评论者将其描述为更严格、更安全的 C++ 子集,改进了 2008 版并与 AUTOSAR C++14 对齐,但批评者认为某些规则适得其反、落后于 ISO 标准,而且主要让合规工具供应商受益。大量讨论集中在异常处理、动态内存、ISO 26262 等标准的工具认证,以及对新规则提供完整支持的开源静态分析器数量有限。

MISRA C++:2023 概述

  • 用于在关键/与安全相关系统中使用 C++17 的指南(尤其是汽车/嵌入式)。
  • 定义哪些语言特性和实践被允许、受限或禁止,以提高可预测性、安全性和可靠性。
  • 被视为较 MISRA C++:2008 的重大改进,并深受 AUTOSAR C++14 影响。

与 C++ 标准及其他指南的关系

  • 目标是 C++17,尽管更新的 C++ 标准已经存在;评论者指出许多工具链仍在追赶,因此在安全关键场景下这是可以接受的。
  • 与其他编码标准相比:SEI CERT C 被描述为“如何安全地使用 X”,而 MISRA 则倾向于禁止或严格约束危险 API。
  • 有人提到免版税替代方案(例如日本的嵌入式编码指南),但这些大多以 C 为主,对 C++ 的帮助较少。
  • 一种观点认为:每一类此类指南实际上都定义了一个“子集语言”,从而加剧了 C/C++ 的碎片化。

工具、许可与开源

  • 该标准需要付费,并且不是开放标准;有人认为这会抑制 FOSS 工具的发展。
  • 静态分析生态主要由专有工具主导;很少有开源工具能很好地支持 MISRA。
  • 提到了开源分析器(例如 NaiveSystems Analyze、Cppcheck、基于 CodeQL 的规则),但覆盖范围和版本支持可能滞后,或者在社区版与付费版之间分裂。

异常、动态内存与错误处理

  • MISRA C++:2023 禁止动态内存;异常却出人意料地被允许,甚至被建议用于满足规则。
  • 争论非常激烈:
    • 支持异常:在多线程或大型系统中进行合理错误传播不可或缺;有助于 RAII 和不变量。
    • 反对异常:在嵌入式中有问题,因为代码体积、性能、确定性和工具链限制;许多大型 C++ 项目和嵌入式系统都禁用了异常。
  • 关闭异常(-fno-exceptions)可以减小二进制体积,但会与标准库产生糟糕交互,导致潜在的 UB 或依赖未指定的 std::terminate 行为。

汽车与安全关键场景

  • MISRA 通常应用于安全关键 ECU(发动机、刹车、安全气囊等),而不是信息娱乐系统。
  • 有人批评汽车软件质量,但大多数人同意 MISRA 不是主要问题;流程、管理、外包、AUTOSAR 和复杂性才是更大的问题。
  • 工具认证与 ISO 26262 合规是主要约束;在安全关键代码中使用主流编译器需要大量文档和测试。

C++ 与“安全语言”

  • 有人认为 C++ 的复杂性和未定义行为使其从根本上不适合安全用途,因而建议 Rust 作为“安全的 C++”。
  • 也有人提出“面向 Rust 的 MISRA”之类的想法,并指出即使在更安全的语言中,风格指南和子集仍然会很有价值。