博客

MISRA C 2012 与 MISRA C2 的对比——如何进行切换

August 17, 2021
Secure Code Warrior
展示 OpenGL 命令的代码片段,用于创建着色器、设置颜色以及绘制三角形。

在 Secure Code Warrior,我们始终致力于扩展培训覆盖范围。为了赋能嵌入式开发人员和安全管理人员构建安全的嵌入式系统,我们正深入探索嵌入式系统安全领域。在本文中,我们将探讨 MISRA C 2012 标准,以及为何遵循该标准对于构建安全的嵌入式系统至关重要。

在使用 C 语言编写代码时,很容易实现一些看起来正确但本质上却有误的功能。您的代码可能编译顺利,甚至在一段时间内运行良好。但如果输入规模增大或内存占用增加,同样的代码可能会崩溃或表现出未定义的行为。例如,特定的输入数字可能导致整数溢出,或者特定的字符序列可能导致数组越界。

这时,MISRA C 编码标准就能派上用场。该标准所制定的规则、指南和最佳实践,能够帮助开发人员为嵌入式开发编写安全可靠的 C 代码。

MISRA C 2012 是该标准的最新版本,它增加了新规则,增强了现有规则,并解决了部分差异问题。如果您仍在使用旧版本,现在正是迁移到新版本的好时机。

什么是 MISRA C 编码标准?

MISRA C 标准包含了针对 C 语言的代码安全性、可移植性和可靠性指南。首套指南发布于 1998 年,专门针对 C 语言。

然而,自那时起,MISRA 联盟也开始制定 C++ 的编码标准。每一份 MISRA C 文档都包含一系列规则、违规示例,以及关于制定这些规则的背景信息的详细章节。

C 和 C++ 是开发嵌入式软件最广泛使用的语言。主要原因在于它们运行速度快,且仅比机器语言高出 1 到 2 个抽象层。但这同时也意味着编写安全的代码(尤其是使用 C 语言)非常困难且容易出错。例如,在 Java 和 C# 等大多数高级语言中,您无需担心垃圾回收或动态类型等琐事。

然而,在 C 语言中,没有预定义的垃圾回收机制。这意味着如果您为数据结构分配了一块内存,在使用完毕后必须手动释放。否则,与其他语言不同,C 语言不会为您自动释放内存,从而导致内存泄漏。

MISRA C 2004 (C2) 与 MISRA C 2012 (C3) 的区别——有哪些变化?

MISRA C: 2012(也称为 C3)于 2013 年 4 月首次发布。C3 汲取了数千名专家和组织的研究成果,增加了新规则,增强了对现有规则的解释和背景说明,并填补了一些漏洞。

C3 支持 C99 语言版本,同时也保留了对旧版 ISO C90 的规则支持。C3 的核心重点在于降低规则执行的常规成本,同时提高 C 语言在关键系统中的安全性。如果您尚未迁移,现在切换到新标准是非常明智的选择。

总的来说,以下是最显著的变化列表:

  • 修正了 2004 版本中发现的问题。
  • 显著增加了 可判定规则 的数量。如果分析工具能够帮助您确定是否符合某项规则,则该规则即为 可判定的。
  • 规则分为“必要”、“建议”和“强制”三类。强制规则在任何情况下都不得违反。必要规则和建议规则在特殊情况下可以违反,但必须提供合理的理由。
  • 增加了关于如何将规则应用于自动生成代码的指导。这一点非常重要,因为人工编写代码的准则并不总是适用于工具生成的代码。
  • 删除了那些禁止合理用户行为的过度概括规则。例如,以前建议完全不要使用宏,因为它们可能导致各种困难和困惑(无法调试宏、宏没有命名空间等)。这阻碍了宏的使用,即使在某些情况下它们能提供优雅、安全且便捷的解决方案。在 MISRA C: 2012 中,引入了关于宏的新规则,允许人们在适用时谨慎使用它们。请参阅以下摘自 MISRA C 文档的片段,其中建议在某些情况下使用宏而非函数。
Text excerpt about using macros in MMMC tool to implement integrators and suppress warnings with code example.

MISRA C 规则实践

言归正传,现在是时候通过实际示例来深入了解 MISRA C 规则及其应用方式了。

在 memcpy、memmove 和 memcmp 的指针参数中使用兼容类型

标准库函数 memcpy、memmove 和 memcmp 会对指定字节数执行逐字节移动或比较。MISRA C 2012 标准的规则 21.15 规定,这两个函数参数应为指向相同类型的指针。使用不兼容的指针类型调用函数可能意味着存在错误。

请参考以下摘自 MISRA 官方合规文档的图片。该规则属于 必要规则(required)、可判定规则(decidable),且同时适用于 C90 和 C99。

Screenshot of MISRA C Rule 21.15

规则说明后附有示例。

Screenshot of a non-compliant solution.

如您所见,由于对象类型不同(uint8_t 和 uint16_t),这属于不合规的方案。

不接收长度作为输入的字符串处理函数不得导致越界访问

<string.h> 中不接收长度作为输入的字符串处理函数,不应导致越界访问。相关函数包括:strcat、strchr、strcmp、strcoll、strcpy、strcspn、strlen、strpbrk、strrchr、strspn、strrstr 和 strtok。该规则属于 强制规则(mandatory),意味着在任何情况下都不得违反。它同时适用于 C90 和 C99,且属于 不可判定规则(undecidable)。

Screenshot of MISRA C rule 21.17.

相应的示例如下:

Screenshot of a correct example of string handling functions

如您所见,f1 函数中的 strcpy 会执行超出字符串长度的复制,而该字符串仅能容纳 5 个字符。我们还提供了一种合规且安全的 strcpy 用法,即仅在“str”内容能够容纳时才进行复制。

验证外部接收的数据

指令 4.14 建议检查从“外部”来源接收的数据的有效性。外部输入包括:

  • 从文件读取。
  • 从环境变量读取。
  • 任何用户输入。
  • 通过通信通道接收的任何内容。例如通过 TCP 连接或 HTTP API 等。

该指令属于 必要(required)类别,适用于 C90 和 C99。其基本原理是:程序无法控制从外部来源接收的数据,这意味着这些数据可能是无效或恶意的。例如,程序期望用户输入数字,但用户输入了字符串。在处理输入之前,程序必须验证其确实为数字。

Validity Of Values Received From External Sources Shall Be Checked

如何切换至 MISRA C 2012

切换至 MISRA C 2012 需要更新您的编码规范文档。如果您没有相关文档,而是依赖静态分析工具(这是推荐的做法),则可能需要获取该工具的更新版本。以下是三种可检查 MISRA C 2012 合规性的工具:

  1. Cppcheck 是一款开源工具,可以检查 MISRA 规则并检测各种类型的错误。
  2. PC-lint Plus 是一款付费工具,提供 30 天评估期。除了检查 MISRA C 合规性外,它还能帮助识别潜在的错误和漏洞。
  3. CodeSonar 是另一款可同时检查 MISRA C 和 C++ 合规性的工具。

还有一些编译器可以测试 MISRA 合规性。如果检测到规则违规,系统会相应地发出警告或异常。例如,Green Hills Software 提供的编译器支持所有 MISRA 标准,适用于 32 位和 64 位架构。

利用 Secure Code Warrior 提升开发人员的 MISRA C 技能

Secure Code Warrior 的旗舰产品——学习平台——提供了大量互动挑战、课程和评估,旨在帮助开发人员编写安全的 C/C++ 代码。平台内容针对特定框架,且极具参与感。我们的 C/C++:Embed 编码挑战汲取了 MISRA C、AUTOSAR C++ (MISRA C++) 和 IEC 标准的精髓。

开发人员可以开启个性化的学习之旅,识别 C/C++ 特有的漏洞,并更重要的是学习如何修复这些缺陷。在此过程中,开发人员可以跟踪学习进度以发现自身短板,甚至能与同行进行友好的编码竞赛。了解更多关于 我们如何利用解决方案助力汽车和交通行业 的信息。

想了解我们的挑战有多么互动且专注于嵌入式领域吗?立即在学习平台上尝试 一些 C/C++:Embed 挑战 吧!

标语

在 AI 驱动的开发成果发布前实现有效治理

评估 AI 辅助风险,在提交代码时强制执行安全编码策略,并加速整个软件开发生命周期的安全交付。

预约演示
资源库

探索更多博客

获取有关安全编码、人工智能治理和软件风险管理的专家内容。

浏览全部
案例研究
筛选标签
这是 div 块中的一段文本。

Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

了解更多
案例研究
筛选标签
这是 div 块中的一段文本。

Security as culture: How Blue Prism cultivates world-class secure developers

Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed

了解更多
案例研究
筛选标签
这是 div 块中的一段文本。

统一的安全文化:Sage 如何打造其安全倡导者项目

了解 Sage 如何通过灵活且以关系为导向的方法提升安全性,成功培养了 200 多名安全倡导者,并实现了显著的风险降低。

了解更多
博客
筛选标签
这是 div 块中的一段文本。

2026年网络安全意识月:理解人工智能安全对企业防御至关重要

目前,大多数顶级人工智能公司已公开呼吁全球放缓人工智能的发展速度,以便安全防护措施能够跟上步伐。然而事实是,严重的安全问题已经显现。随着人工智能实施带来的经济成本和风险不断累积,无数安全领导者和高管团队正处于紧迫的境地。

了解更多
博客
筛选标签
这是 div 块中的一段文本。

赋能要素 8:打造项目品牌

成功的安全编码项目不仅需要优质的内容。赋能要素 8 展示了如何通过品牌化将参与过程转变为一种令人向往、以地位为驱动的体验。

了解更多
博客
筛选标签
这是 div 块中的一段文本。

每一位员工现在都处于 AI 网络安全的最前线

企业技术格局正以一种鲜有人预料到的速度发生剧变,直到为时已晚。我们已正式跨越了从人工编写代码和基础辅助编程,进入“智能体开发生命周期”(ADLC)的时代。虽然自主 AI 智能体有望在多个职能领域实现前所未有的效率,但它们也带来了全新的安全和监管风险。

了解更多

在产品发布前确保 AI 驱动的开发安全

洞察开发风险,执行安全策略,并在整个软件开发生命周期中预防漏洞。

预约演示
未找到相关项目。