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

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

3天内不再提示

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

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

小组讨论围绕着适合内核开发的替代更安全的语言(如 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 显示的消息示例:

pYYBAGKwKt2AYDVTAAE3CZSjSrk663.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

    文章

    10973

    浏览量

    206669
  • 代码
    +关注

    关注

    30

    文章

    4552

    浏览量

    66637
  • 编译器
    +关注

    关注

    1

    文章

    1569

    浏览量

    48598
收藏 人收藏

    评论

    相关推荐

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

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

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

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

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

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

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

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

    基本安全 Basic Safety 与 基本性能 essential performance

    基本性能识别以及需要怎么做,虽然有定义,标准实施过程,却一直存在困难。这样的困难一个在于涉及到临床功能,就远大于基本安全相关的危害种类;二个基本性能的确定,通过风险管理实现,牵涉到风险管理,又是一个
    发表于 10-08 09:07

    安全光幕如何进行安全保护?

    指示灯。 将电源开关调到“关闭”的状态,在安全光幕安装完成之后,打开电源,给设备供电,安全光幕的指示灯会亮起。 2:光幕对光。 安全光幕的电源开启,调整好发射器和接收器的位置,将他们统
    的头像 发表于 08-30 09:35 280次阅读
    <b class='flag-5'>安全</b>光幕如何进行<b class='flag-5'>安全</b>保护?

    Arm安全报警管理器规范

    Arm®安全警报管理器(SAM)允许您对多达64个安全事件的检测应用编程响应。 其中一些安全事件是子系统内以数字方式检测的,其他可选事件可
    发表于 08-09 06:43

    Arm平台安全架构固件框架1.0

    基于行业最佳实践的配方,允许在这两个方面一致地设计安全性 硬件和固件级别。 PSA固件框架规范定义了标准编程环境和固件用于设备的信任根内实现和访问安全服务的接口。
    发表于 08-08 07:14

    更改嵌入图像的异常级别和安全状态

    本指南是一系列相关指南中的第四本: •构建您的第一个嵌入式图像 •将输出重新定向到UART •创建事件驱动的嵌入式图像 •更改嵌入图像的异常级别和安全状态(本指南) 在前面的指南中,我们构建了一个
    发表于 08-08 07:09

    基于分级安全的OpenHarmony架构设计

    大的风险:一是机密的数据分布式系统处理可能会泄露,分布式系统的弱安全设备很容易被攻陷成为肉鸡跳板来窃取数据,机密数据超级终端中流转时
    发表于 08-04 10:39

    ARMv8系统安全

    安全扩展模型允许系统开发人员对设备硬件进行分区软件资源,以便它们存在于安全子系统的安全世界,或者存在于其他一切都是正常的。正确的系统设计可以确保没有
    发表于 08-02 18:10

    安全光幕如何进行安全保护?

    ”的状态,在安全光幕安装完成之后,打开电源,给设备供电,安全光幕的指示灯会亮起。 2:光幕对光。 安全光幕的电源开启,调整好发射器和接收器的位置,将他们统一平行在同一水平
    的头像 发表于 07-31 14:50 222次阅读

    遵守 MISRA 如何提高C++应用的安全

    MISRA提供了一套适用于任何软件应用程序的全面指南,在确保软件安全性和稳定性方面发挥着至关重要的作用。这些准则包含各个方面,例如避免比较运算符右侧的副作用,以及不执行任何指针算术。虽然开发团队通常
    的头像 发表于 07-26 14:12 671次阅读
    遵守 <b class='flag-5'>MISRA</b> 如何提高C++应用的<b class='flag-5'>安全</b>性

    安全光幕如何进行安全保护?

    ”的状态,在安全光幕安装完成之后,打开电源,给设备供电,安全光幕的指示灯会亮起。 2:光幕对光。 安全光幕的电源开启,调整好发射器和接收器的位置,将他们统一平行在同一水平
    的头像 发表于 07-14 14:23 292次阅读
    <b class='flag-5'>安全</b>光幕如何进行<b class='flag-5'>安全</b>保护?

    如何将MISRA C:2023整合到您的嵌入式开发流程中

    MISRA C不是编码风格指南,而是一套规则和指令,用于最小化或消除已知危险的编码实践。鉴于对安全和安保关键型系统的这种重要性,AMD4 和 MISRA C:2023 版本使开发人员有机会重新审视其流程,以改进对有效和高效地证明
    的头像 发表于 05-04 09:58 1706次阅读
    如何将<b class='flag-5'>MISRA</b> C:2023整合到您的嵌入式开发流程中