Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
随着功能安全标准的日益严格,如何在安全关键系统中合理使用C++语言成为嵌入式开发领域的核心挑战。CAN CSA ISO/IEC TR 18120-18(等同采纳ISO/IEC TR 18120:2018)提供了针对安全关键系统的C++编程语言使用指南,旨在帮助开发团队在符合功能安全标准(如IEC 61508、ISO 26262、DO-178C)的前提下,安全地利用C++的现代特性。本文从标准概况、技术内容、实施要点及与其他标准的关系四个方面进行深度解析。
CAN CSA ISO/IEC TR 18120-18 是加拿大标准委员会(SCC)采纳的国际电工委员会/国际标准化组织技术报告,全称为《Information technology — Programming languages — Guidance for the use of the C++ programming language in safety-critical systems》。该技术报告于2018年发布,2026年进行了最新确认和修订,目前仍是安全关键C++开发领域的重要参考文件。
该标准适用于所有需要开发高可靠性嵌入式软件、且计划使用C++的行业,包括但不限于:
标准将C++(基于ISO/IEC 14882:2017及后续版本)的各种特性划分为三个安全等级:推荐使用(Mandatory/Recommended)、有条件使用(Conditional)和禁止使用(Prohibited)。每一类都给出了详细的理由和替代方案。下表总结了部分关键分类:
| 语言特性 | 安全等级 | 说明 | 典型替代方案 |
|---|---|---|---|
| 基本类型、枚举、简单控制流(if, for, while) | 推荐 | 无歧义、可预测,适合安全关键代码 | — |
| 类、继承、虚函数(有限制) | 有条件使用 | 需避免多重继承、虚基类,且必须禁用RTTI | 通过接口类和组合替代复杂继承 |
| 异常处理(try/catch) | 禁止 | 异常会使控制流不透明,破坏实时性 | 采用错误码、std::optional或期望值模式 |
| 动态内存分配(new/delete、std::vector等) | 有条件使用 | 仅允许在系统初始化阶段使用,运行时禁止 | 静态分配、内存池、栈容器 |
| Lambda表达式(只捕获值、无状态) | 有条件使用 | 允许无状态lambda,有状态捕获可能破坏局部性 | 函数对象或函数指针 |
| 模板元编程、SFINAE、变参模板 | 有条件使用 | 需严格限制递归深度,避免编译期无限循环 | 使用constexpr函数或手动特化 |
| 标准库容器(动态大小) | 有条件使用 | 仅允许静态大小或运行时可确定的固定大小 | std::array、静态数组、内部固定缓冲区 |
| nullptr、auto、范围for循环 | 推荐 | 安全、可读性强,减少错误 | — |
| reinterpret_cast、C风格强制转换 | 禁止 | 完全绕过类型系统,导致未定义行为 | static_cast或安全的bit_cast(有条件) |
标准推荐基于其分类体系建立一份项目专用的编码规范(coding standard)。该规范应包含:
对于每个被禁止或限制的特性,标准要求提供可追踪的豁免机制(deviation process),即如果某个特性在特定上下文中不可避免,需要提交正式的偏差申请,并附上风险分析和测试证据。
要在实际项目中有效应用CAN CSA ISO/IEC TR 18120-18,建议采取以下步骤:
MISRA C++:2008(现已更新至MISRA C++:2023)是另一个广泛使用的安全关键C++编码标准。CAN CSA ISO/IEC TR 18120-18与MISRA C++有大量重叠,但视角不同:
表2总结了TR 18120-18与主要功能安全标准的关联:
| 基础标准 | 领域 | 编程语言相关要求 | TR 18120-18的对应作用 |
|---|---|---|---|
| IEC 61508-3 | 通用工业 | 必须采用语言子集、编程指南 | 提供语言子集定义和指南(直接引用) |
| ISO 26262-6 | 道路车辆 | 表6/7/8 要求避免未定义行为等 | 可作为满足“语言子集”要求的可行方法 |
| DO-178C / DO-331 | 航空 | 增加基于模型的开发语言约束 | 用于C++代码部分的子集定义 |
| IEC 62304 | 医疗软件 | 要求采用经过风险评估的语言特性 | 可作为风险评估的输入(风险分析表) |