当前位置: 首页 > news >正文

MISRA C vs CERT C 是两种广泛使用的 C 语言编码规范对比介绍

在这里插入图片描述

在另外一篇文章中对几种c语言的安全编码规范进行了汇总介绍,这里详细介绍misra c和cert c两种。
MISRA C 和 CERT C 是两种广泛使用的 C 语言编码规范,均以提高代码的安全性和可靠性为目标,但它们的侧重点、应用场景和规则设计存在显著差异。以下是两者的详细对比:


1. 背景与目标

规范MISRA CCERT C
制定机构汽车工业软件可靠性协会 (MISRA)美国计算机应急响应小组 (CERT)
主要目标提高嵌入式系统(尤其是汽车电子)的可靠性和安全性防止软件漏洞,提升代码安全性(通用领域)
适用领域汽车电子、航空航天、工业控制等嵌入式系统通用软件开发(尤其是安全敏感系统)

2. 规则分类与严格性

规范规则分类严格性
MISRA C分为三类:
- 强制 (Mandatory)
- 必需 (Required)
- 咨询 (Advisory)
规则严格,部分规则允许例外(需记录原因),但通常要求完全遵守。
CERT C分为两类:
- 建议 (Recommendations)
- 规则 (Rules)
规则灵活,允许根据风险分析选择性遵守,更关注安全漏洞的预防。

3. 核心规则对比

(1) 内存管理
规范规则示例解释
MISRA C禁止动态内存分配(如 malloc/free)。
(规则 21.1)
避免内存泄漏和碎片化,适用于资源受限的嵌入式系统。
CERT C允许动态内存,但需安全使用(如检查分配结果、避免释放后使用)。
(规则 MEM30-C)
关注内存操作的漏洞(如缓冲区溢出、释放后使用)。
(2) 类型安全
规范规则示例解释
MISRA C禁止隐式类型转换(如 intunsigned)。
(规则 10.1)
避免因类型转换导致的数据丢失或逻辑错误。
CERT C要求显式处理类型转换(如使用 static_cast)。
(规则 EXP36-C)
防止因类型不匹配引发的未定义行为。
(3) 未定义行为
规范规则示例解释
MISRA C禁止使用未定义行为(如修改字符串字面量)。
(规则 22.1)
确保代码的可移植性和确定性。
CERT C禁止依赖未定义行为(如除零操作)。
(规则 INT33-C)
防止因未定义行为导致的安全漏洞。
(4) 代码结构
规范规则示例解释
MISRA C禁止使用 goto 和递归。
(规则 15.1、16.2)
简化代码逻辑,提高可维护性。
CERT C允许 goto,但需避免复杂跳转逻辑。
(规则 MSC20-C)
更关注代码的可读性和漏洞风险,而非完全禁止特定语法。

4. 典型场景对比

示例 1:动态内存分配
// MISRA C 禁止以下代码:
int* ptr = (int*)malloc(sizeof(int)); // 违反规则 21.1

// CERT C 允许但要求安全检查:
int* ptr = (int*)malloc(sizeof(int));
if (ptr == NULL) { /* 处理错误 */ } // 符合 MEM30-C
示例 2:隐式类型转换
// MISRA C 禁止隐式转换:
unsigned int a = 10;
int b = -5;
if (a > b) { /* 违反规则 10.1 */ }

// CERT C 要求显式处理:
if (a > (unsigned int)b) { /* 符合 EXP36-C */ }

5. 工具支持

规范工具链
MISRA CPolyspace、LDRA、Coverity、Parasoft 等,通常集成在嵌入式开发工具链中。
CERT CClang Static Analyzer、CodeSonar、Coverity 等,更通用且支持开源工具。

6. 总结:异同对比

维度MISRA CCERT C共同点
核心目标嵌入式系统的可靠性和确定性通用软件的安全性和漏洞预防均关注代码安全性和可维护性
规则严格性严格,部分规则不可豁免灵活,允许基于风险的选择性遵守均要求静态分析工具支持
适用领域汽车电子、工业控制等嵌入式系统金融、医疗、网络等安全敏感系统均适用于高可靠性要求的场景
典型规则禁用动态内存、goto、递归安全使用内存、输入验证、并发安全禁止未定义行为和危险操作

7. 如何选择?

  • 选择 MISRA C
    适用于汽车电子、航空航天等嵌入式系统,需满足行业强制合规性要求(如 ISO 26262)。
  • 选择 CERT C
    适用于通用软件开发(如金融、医疗),需防范安全漏洞(如 CWE/SANS Top 25)。
  • 结合使用
    在安全关键系统中,可同时遵守 MISRA C(可靠性)和 CERT C(安全性),例如自动驾驶系统。

通过理解两者的差异,开发者可以根据项目需求选择合适的规范,或结合两者以实现更高的代码质量。

相关文章:

  • RabbitMQ服务异步通信
  • 修改时无条件,可以自定义id条件(通过查询)
  • C++ Primer 访问控制与封装
  • 防御保护第三次练习
  • 【大学生职业规划大赛备赛PPT资料PDF | 免费共享】
  • 论文阅读 DOES END-TO-END AUTONOMOUS DRIVING REALLY NEED PERCEPTION TASKS?
  • 还在为AI模型部署发愁?VSCode插件让你轻松拥有DeepSeek和近百种AI模型!
  • sql注入中,如果information_schema被过滤,该怎么绕过
  • 【Linux系统】—— 调试器 gdb/cgdb的使用
  • 腾讯云大模型知识引擎×DeepSeek赋能文旅
  • 筛选相同项
  • 深入解析TCP/IP协议:从理论到实践的全链路剖析
  • Pytorch论文实现之GAN-C约束鉴别器训练自己的数据集
  • 机器学习的数学基础(三)——概率与信息论
  • SP字体UI放大代码
  • ComfyUI的安装
  • 基于Electron+Vue3创建桌面应用
  • C语言.h头文件的写法
  • 物联网技术赋能预测性维护的深度剖析与前景展望
  • 华为FusionCompute虚拟化平台
  • 苹果用户,安卓来“偷心”
  • 德国联邦议院6日下午将举行总理选举第二轮投票
  • 香港金紫荆广场举行五四升旗礼
  • 南京大屠杀幸存者刘贵祥去世,享年95岁
  • 党政机关停车场免费、食堂开放,多地“五一”游客服务暖心周到
  • 市场监管总局出手整治涉企乱收费,聚焦政府部门及下属单位等领域