0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MISRA C在安全和安全编程中的位置

星星科技指导员 来源:嵌入式计算设计 作者:Yannick Moy 2022-07-01 10:07 次阅读

C 是 Linux 内核中使用的主要语言,因漏洞无穷无尽而臭名昭著。只需查看由模糊机器人 syzbot 自动报告的一长串未解决的错误,这些错误仍在等待修复。

小组讨论围绕适用于内核开发的替代更安全的语言(如 Ada 和 Rust),以及形式验证的需求超出了编译器可以提供的保证。事实上,目前在 Linux 内核上报告的许多内存和安全漏洞会在 Ada 或 Rust 中完全停止程序,这只是稍微好一点。查看内核补丁可以发现,通过在代码上指定简单属性可以检测到许多问题,例如哪些调用在哪种模式下是合法的、应该保留的数据不变量的类型以及如何使用适当的工具静态验证它们。

令人惊讶的是,在讨论中根本没有提到 MISRA C,尽管它已成为许多行业的必备工具,以防止 C 语言的错误。MISRA C 于 1998 年作为 C 的编码标准出现,最初用于汽车行业,经过两次修订。当前版本是 MISRA C:2012。它侧重于避免 C 编程语言容易出错的特性,而不是强制执行特定的编程风格。Les Hatton编写的 C 编码标准研究发现,与十种典型的 C 编码标准相比,MISRA C 是唯一一个专注于避免错误而不是风格强制的标准,而且差距很大。

C 编程语言的流行,以及它的许多陷阱和陷阱,导致 MISRA C 在 C 用于高完整性软件的领域中取得巨大成功。这一成功促使工具供应商提出了许多相互竞争的 MISRA C 检查器实施方案。工具尤其在它们帮助执行的 MISRA C 指南的覆盖范围内竞争,因为不可能执行 MISRA C 的所有 16 条指令和 143 条规则(统称为指南)。

特别是,143 条规则中有 27 条是不可判定的,因此没有任何工具能够始终检测到所有违反这些规则的行为,而不同时对不构成违规的代码报告“错误警报”。不可判定规则的一个例子是规则 1.3:“不得发生未定义或关键的未指定行为”。MISRA C:2012 的附录 H 列出了 C 编程语言标准中数百个未定义和关键未指定行为的案例,其中大多数无法单独确定。在大多数情况下,MISRA C 检查器会忽略无法确定的规则,例如规则 1.3,尽管众所周知,违反这些规则会对软件质量产生巨大影响。

但是,对于其他编程语言,可以使用静态分析技术来应对这一挑战,而不会因误报而淹没用户。一个例子是由 AdaCore、Altran 和 Inria 开发的 SPARK 工具集,它基于四个原则:

基础语言 Ada 通过定义明确的语言标准、强类型和丰富的规范特性为静态分析提供了坚实的基础。

Ada 的 SPARK 子集通过控制歧义的来源(例如函数的副作用和名称的别名)以支持静态分析的基本方式限制了基础语言。

静态分析工具主要以单个函数的粒度工作,使分析更加精确,并最大限度地减少误报的可能性。

静态分析工具是交互式的,允许用户在必要或需要时指导分析,并在用户提供的合约无法证明时提供反例。

SPARK 可以在 C 代码库中逐步采用,通过SPARK 采用的五个级别逐步获得保证,并通过支持将形式分析 (SPARK) 与传统的基于测试的方法 (C) 相结合的“混合验证”。

SPARK Stone Level - 基本保证

SPARK 采用的第一级称为 Stone Level。它对应于符合 Ada 的 SPARK 子集的代码。仅仅采用这个级别就可以保证许多 C 语言无法强制执行的一致性属性。其中包括:

使用适当的包系统,而不是 C 使用基于文本的文件包含,并且没有跨翻译单元的一致性要求;

严格且易读的语法强调清晰并最大限度地减少“陷阱”,而不是 C 的非常宽松的语法,这使得编写效果与预期不符的程序变得容易,

遵守 Ada 和 SPARK 的强类型规则,而不是 C 的“较差的类型安全性 [that] 允许发生广泛的隐式类型转换 [which] 可能会损害安全性,因为它们的实现定义方面可能会导致开发人员混淆。 “(MISRA C:2012,附件 C)

MISRA C 试图通过各种指导来驯服 C 语言的这些可能的不一致。它特别定义了更强的类型规则(“基本类型模型”)并限制函数参数/结果和控制结构的使用。虽然这些避免了开发人员混淆的常见来源,但它们故意不是防弹的,否则它们会使大多数 C 程序非法。

由于定义了 Ada 的 SPARK 子集的更强大的规则,这些基本保证很容易在 SPARK 中通过一个名为 GNATprove 的工具进行类似编译器的简单分析来实现。

SPARK 银级 - 强大的安全保障

MISRA-C 指南还旨在防止更细微的错误、未初始化数据的读取、表达式中的冲突副作用以及未定义的行为,例如除以零或缓冲区溢出(可能具有安全性和安全性后果)。所有这些都属于不可判定规则的范畴,很少有 MISRA C 检查器能提供完整的检测。

这些在 SPARK 采用的 Silver 级别上完全被阻止,这对应于使用流分析(达到 SPARK 采用的第二级,称为 Bronze)和不存在运行时错误的证明(达到第三级,即银)。为了达到这个水平,开发人员通常需要定义具有特定约束的类型,这些约束旨在支持和提供文件之间导出的函数的合同——使用所谓的前置条件来指定调用者的义务,并使用后置条件来指定调用者的义务。被叫方的义务。

达到 Silver 级别的过程涉及与 IDE 的交互。开发人员可能在程序的子集上运行 GNATprove 工具,调查 GNATprove 诊断,相应地更新程序,然后重复。GNATprove 在每一步都提供了详细的信息来指导开发人员,从而促进了此类交互。以下是 GNATprove 显示的消息示例:

pYYBAGK-VvSALUOkAAE0JPxg_Zs972.png

在找到可能导致溢出的加法运算后,GNATprove 给出了一个触发问题的值的示例,这里是最大的 Integer 值(在 SPARK 中表示为 Integer‘Last)。“检查原因”清楚地解释了加法的结果应该适合机器整数,如果 X 是加法之前的最大整数值,则情况并非如此。然后,GNATprove 建议向函数 Incr 添加合适的前提条件可能会解决问题,方法是在此处指定 X 不能是那个最大值。

SPARK 超越白银级

使用 SPARK 还有其他好处,远远超出 MISRA C 检查器所能提供的。在 Gold 和 Platinum 级别,开发人员通过 SPARK 合同指定程序的属性,然后可以使用 GNATprove 来保证这些属性将得到满足。开发人员还可以启用 GNATprove 警告以检测死代码(也是 MISRA C 追求的目标)和代码中的不一致,使用构成 GNATprove 分析基础的强大证明技术。

结论

从本质上讲,MISRA C 追求的所有目标都在 SPARK 中得到了最好的实现,结合了更强大的基础语言 (Ada) 和强大的分析工具 (GNATprove)。计划使用 MISRA C 规则的开发人员可以通过在其部分应用程序中采用 SPARK 来获得更高的保证。

MISRA C 中的规则代表了一项令人印象深刻的集体努力,旨在提高关键应用程序中 C 代码的可靠性,重点是避免容易出错的功能,而不是强制执行特定的编程风格。然而,从根本上说,MISRA C 仍然建立在一种基础语言之上,而这种语言并不是真正为支持大型高保证应用程序而设计的。很难将可靠性、安全性和安全性改造成一门从一开始就没有这些目标的语言。

由于 C 仍将是 Linux 内核等大型程序的基础语言,我们可以预见两种趋势的共存,以更好地防止 C 程序中的错误,其中 MISRA C 可以发挥作用,并用更安全的语言(如 Rust 和SPARK Ada 用于部分代码。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11216

    浏览量

    208761
  • 编译器
    +关注

    关注

    1

    文章

    1617

    浏览量

    49021
  • MISRA
    +关注

    关注

    0

    文章

    21

    浏览量

    6956
收藏 人收藏

    评论

    相关推荐

    socket编程安全性考虑

    Socket编程安全性是一个至关重要的考虑因素。以下是一些关键的安全性考虑和措施: 1. 数据加密 使用TLS/SSL协议 :TLS/
    的头像 发表于 11-01 16:46 165次阅读

    C2000™ MISRA-C策略

    电子发烧友网站提供《C2000™ MISRA-C策略.pdf》资料免费下载
    发表于 10-11 11:43 0次下载
    <b class='flag-5'>C</b>2000™ <b class='flag-5'>MISRA-C</b>策略

    embOS的MISRA-C:2012一致性

    MISRA C是汽车工业软件可靠性协会(MISRA)开发的一套针对C编程语言的软件开发指南,目的是提升嵌入式系统的
    的头像 发表于 08-20 11:35 399次阅读

    whitepaper-perforce-what-is-misra

    如果您熟悉嵌入式软件的世界,您可能听说过安全关键系统的MISRA编码准则和合规性。最初为汽车嵌入式软件行业,MISRA C for
    发表于 08-08 15:54 0次下载

    Perforce静态代码分析专家解读MISRA C++:2023®新标准:如何安全、高效地使用基于范围的for循环,防范未定义行

    Frank van den Beuken博士的博客系列,本期为第三篇。 在前两篇系列文章,我们向您介绍了 新的MISRA C++ 标准 和 C++简史 。本文,我们将仔细研究
    的头像 发表于 06-18 12:57 335次阅读

    ESP32-C3安全启动v2支持三个密钥签名的提交,请问具体怎么操作?

    IDFv4.3.2版本安全启动V2的文档中提到\"How To Enable Secure Boot V2\",但是在其中只有指定密钥,没有提到密钥烧录的位置。 那么我想烧录三
    发表于 06-17 06:19

    MISRA-C-:2004文版

    MISRA-C-:2004 中文版
    发表于 06-04 11:52 1次下载

    使用 MISRA C++:2023® 避免基于范围的 for 循环中的错误

    在前两篇博客,我们 向您介绍了新的 MISRA C++ 标准 和 C++ 的历史 。在这篇博客,我们将仔细研究以
    的头像 发表于 03-28 13:53 717次阅读
    使用 <b class='flag-5'>MISRA</b> <b class='flag-5'>C</b>++:2023® 避免基于范围的 for 循环中的错误

    安全监测系统城市燃气的应用

    系统、视频监控等环节,系统不仅实现了对安全自动化运行监控与管理,而目支持以B/S和C/S结构的数据传输,公司级的调度服务器上可远程实时监控整个生产及运营环节的气体状况。
    的头像 发表于 03-19 18:56 299次阅读
    <b class='flag-5'>安全</b>监测系统<b class='flag-5'>在</b>城市燃气<b class='flag-5'>中</b>的应用

    汽车电子行业的MISRA C标准解读

    之前分享了一些编程规范相关的文章,有位读者提到了汽车电子行业的MISRA C标准,说这个很不错。
    的头像 发表于 01-17 11:03 1107次阅读

    C++简史:C++是如何开始的

    MISRA C++:2023 博客系列的第二部分。 在这篇博客,我们将深入探讨 C++ 的历史、编程语言多年来的发展历程以及它的下一
    的头像 发表于 01-11 09:00 517次阅读
    <b class='flag-5'>C</b>++简史:<b class='flag-5'>C</b>++是如何开始的

    详解全志R128 RTOS安全方案功能

    具有安全与非安全状态,非安全软件只能访问非安全内存。与 Arm A 处理器的 TrustZone 技术不同, Arm M33 Star 的
    发表于 12-28 15:59

    汽车网络安全:防止汽车软件的漏洞

    汽车网络安全汽车开发至关重要,尤其是 汽车软件 日益互联的情况下。在这篇博客,我们将分享如何防止汽车网络
    的头像 发表于 12-21 16:12 1048次阅读
    汽车网络<b class='flag-5'>安全</b>:防止汽车软件<b class='flag-5'>中</b>的漏洞

    LabVIEW开发地铁运行安全监控系统

    通过LabVIEW软件平台的高效数据处理和分析能力,结合先进的传感器技术和监控设备,为地铁系统提供了一个全面的安全监控解决方案。LabVIEW在此系统的应用突出了其实时数据处理、用户界面设计、数据
    发表于 12-16 21:06

    汽车行业软件代码满足功能安全与信息安全的最佳实践

    21434信息安全的必要性。这两种功能标准都需要使用诸如MISRA CC++之类的编码标准。因此,我们将讨论最新的MISRA规则,以及如
    的头像 发表于 11-23 20:05 577次阅读
    汽车行业软件代码满足功能<b class='flag-5'>安全</b>与信息<b class='flag-5'>安全</b>的最佳实践