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

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

3天内不再提示

安全关键软件的非侵入式代码覆盖

星星科技指导员 来源:嵌入式计算设计 作者:Benjamin M. Brosgol 2022-06-28 15:50 次阅读

商业航空电子设备的 DO-178B 等认证标准要求有证据表明系统源代码完全通过源自需求的测试来执行。传统工具通过代码检测来获取覆盖率数据,但这会使分析变得复杂,因为被测试的代码并不是最终将执行的代码。

主机驻留两部分技术提供了一种高效且具有成本效益的替代解决方案:目标仿真器与非侵入式覆盖分析器相结合。模拟器不是解释器;相反,它将目标代码动态转换为本地主机指令。因此,测试套件通常比在实际目标硬件上执行得更快。覆盖分析器从从模拟器上的程序执行中检索到的对象分支信息中获取源覆盖数据,并执行符合最严格覆盖要求所需的任何附加分析。

简化目标平台的最终验证;它需要重新运行测试并显示结果与模拟器上的相同。这种方法完全支持 DO-178B 及其即将修订的 DO-178C 的所有级别的安全认证。

验证挑战

DO-178B 等安全认证标准中规定的一项主要验证活动是测试覆盖率分析,这涉及证明每个软件需求都得到满足,并表明基于需求的测试完全覆盖了源代码。覆盖率分析提出了几个问题:

· 插装:一种常见的方法是使用生成应用程序源代码的修改(插装)版本的工具,或者使用特殊开关编译应用程序以生成插装目标代码。添加的代码包含对适当日志记录函数的调用。但是,检测代码不是将在最终系统上运行的代码。要使用覆盖数据,开发人员必须证明它也适用于未检测的可执行文件。这不一定是一项简单的任务。

· 目标硬件:虽然最终的软硬件集成测试必须在实际部署的配置上进行,但在组件开发过程中需要目标板既昂贵又不方便。基于主机的解决方案更简单且更具成本效益。

· 源代码与对象覆盖率: DO-178B 要求源代码覆盖率,但覆盖率数据是根据执行程序计算得出的。在最高安全关键性(A 级)下,可能需要进行特殊分析来证明修改后的条件/决策覆盖率 (MC/DC)。

此处描述的技术解决了这些问题。它基于从运行未检测版本的应用程序软件的主机驻留目标仿真器生成的执行跟踪数据中获取源覆盖率指标。

DO-178B 测试覆盖率分析

DO-178B 规定了两种类型的测试覆盖分析 [1, §6.4.4]:

· 基于需求的测试覆盖分析:开发人员必须展示从每个需求到实现需求的源代码以及测试套件的可追溯性,该套件的执行提供了正确实现需求的信心。

· 结构覆盖分析:开发人员必须证明代码结构已经完全通过基于需求的测试。如果这些测试没有完全覆盖源代码,那么开发人员必须添加更多需求、添加更多测试和/或删除代码——称为“死代码”(DO-178B)或“无关代码”代码”(DO-178C)——不能追溯到需求。

所需覆盖范围取决于软件组件的安全关键级别。在 C 级,只需要声明覆盖率;即程序中的每条语句必须至少执行一次。

在 B 级,需要决策覆盖。在 DO-178B 用语中,决策是一个完整的布尔表达式,由原子布尔项(条件)和布尔运算符组成。例如,以下布尔表达式是具有三个条件的决策:

(B1然后B2)或者B3

此示例使用 Ada和 then和或 else短路形式,仅在必要时评估其右操作数,分别对应于 && 和 || C 中的运算符。决策覆盖要求程序中的每个决策都通过真假测试来执行。

在 A 级,需要 MC/DC:

· 程序中的每个条件都必须通过真假测试来执行。

· 程序中的每一个决定都必须经过真假测试。

· 必须证明每个条件独立地影响决策的结果(该条件变化,而所有其他条件保持不变)。

MC/DC 并不要求每个决策都使用其构成条件的每个可能的真值组合进行测试。这对于复杂的决策是不现实的,并且在条件耦合时(当相同的输入变量出现在多个条件中时)可能是不可能的。

图 1 显示了一个程序片段,说明了各种结构覆盖之间的差异。MC/DC 具有一些微妙的特征,在 Hayhurst等人[2] 的教程和Chilenski [3] 的详细研究中进行了全面讨论。

图 1:程序片段显示了不同种类的 DO-178B 结构覆盖。

pYYBAGK6svuAeMVgAAKkp_C-gnY924.png

源与对象覆盖

DO-178B 中一个通常被误解的要求涉及必须在 A 级证明的覆盖类型(源代码与目标代码)。第 6.4.4.2 节指出:

可以对源代码执行结构覆盖分析,除非软件级别为 A 并且编译器生成的目标代码不能直接追溯到源代码语句。然后,应该对目标代码执行额外的验证,以建立这些生成的代码序列的正确性。目标代码中编译器生成的数组绑定检查是不能直接追溯到源代码的目标代码示例。

这一要求(其措辞在 DO-178C 中正在修订)并不是说必须为 A 级证明对象覆盖。相反,它解决了源语言构造的问题,其编译的目标代码包含条件分支或从源代码。在这种情况下,开发人员必须验证生成的代码,例如通过解释每个不可追踪的目标代码序列的效果。但是覆盖分析仍然必须与源代码结构相关。仅显示目标代码覆盖率是不够的,除非进一步分析可以证明其与源代码覆盖率等价。

通过虚拟化进行目标仿真

在主机系统上模拟目标处理器的概念并不新鲜,但虚拟化技术的最新进展催生了一种高效且可移植的方法,例如开源 Quick EMUlator (QEMU) 工具。QEMU 支持客户操作系统的完整系统仿真,并允许通过机器描述模拟特定的嵌入式设备。它在主机平台上运行,并在一个两阶段的过程中,使用缓存方案将目标代码动态转换为本地主机指令以提高效率。该工具首先将目标代码翻译成中间语言,然后将中间表示编译成主机二进制指令。

动态翻译器一次对未插桩的目标代码段进行操作,将翻译(或高速缓存提取)与翻译后的指令的执行交错。当 QEMU 开始处理一段目标代码时,它会将指令转换为宿主代码,直到它到达下一个分支。翻译后的目标代码(称为翻译块)存储在缓存中(如果尚未存在),并执行其相应的主机指令。QEMU 然后继续翻译它停止的地方。由于缓存,目标指令块只需要解码一次。在实践中,由于主机处理器通常比嵌入式目标硬件更快,QEMU 的虚拟化方法提供了比直接在目标上执行更好的性能。

QEMU 是可以扩展以提供附加功能的开源技术。为了处理 DO-178B 要求的结构覆盖分析,一个有用的增强是支持生成执行跟踪。两种跟踪信息是相关的:

· 摘要跟踪:输出标识已执行指令的地址范围,以及对于条件分支,哪些分支被(被)采用。输出数据的大小是有限的(实际上与目标程序大小呈线性关系),因为它只显示执行了哪些指令/分支,而不是整个执行历史。

· 指定地址范围的完整历史跟踪:除了指示已执行的指令外,输出还显示了在每次评估相关条件表达式时采用了哪个分支。输出数据的大小取决于执行历史。

生成这些执行跟踪的 QEMU 的改编版本是覆盖分析技术的关键组成部分。

覆盖分析

尽管执行跟踪数据提供了对象指令覆盖率和对象分支覆盖率信息,但仍需要进一步分析以满足 DO-178B 的覆盖率目标:

· 跟踪必须映射到源代码结构,尤其是源代码中具有覆盖要求的结构(语句、决策、条件)。

· 必须评估所达到的覆盖水平——声明、决定、MC/DC。

为了启用这种分析,编译器可以在对象控制流图中保留源程序的决策结构并生成两种输出:

· 调试信息(DWARF),它将每个目标代码指令与源代码位置(文件、行、列)相关联。

· Source Coverage Obligations (SCO),它提供了计划结构的简洁表示,需要证明实现某些覆盖目标的证据。SCO 捕获程序中所有决策的结构。

使用来自仿真器的跟踪数据以及编译器提供的 DWARF 和 SCO 信息,覆盖分析工具可以推断测试的执行是否达到了所需的覆盖级别(语句、决策、MC/DC)。

确定执行跟踪数据是否暗示 MC/DC 存在一些挑战。一个问题是如何从对象分支覆盖范围推断源条件评估。如果程序统一使用短路形式(“然后”、“或其他”)而不是非短路运算符(“和”、“或”),则可以处理此问题。根据选项的指示,编译器在生成的目标代码中保留源代码的条件结构。第二个问题是,出于效率原因,是否可以仅使用摘要跟踪而不使用完整的历史跟踪。一般来说,答案是“不”,一个相对简单的决定说明了原因:

(B1然后B2)或者B3

该决策的目标代码可以仅由三个测试用例覆盖,如表 1 所示。

表 1:(B1 和 B2)或 B3 的对象分支覆盖测试。

poYBAGK6swWAS52zAACHdLN10t4179.png

但是,当有n 个独立条件时, MC/DC 至少需要n+1次测试,因此这里需要进行 4 次(再次参见图 1)。这意味着跟踪摘要数据(对象分支覆盖率)是不够的;需要完整的历史跟踪数据。Bordin等人和 Comar等人[7]给出了何时对象分支覆盖足以推断 MC/DC 的数学表征。

当提出目标代码覆盖率作为 MC/DC 的证据时要解决的其他问题记录在多个认证机构报告中[8,第 20 节]。

把它们放在一起

目标虚拟化方法已作为 Couverture (Coverage) 项目 的一部分实施,旨在为安全关键型软件开发的覆盖分析提供一个开放框架。AdaCore 的 GNATemulator 工具是对 QEMU 的改编,用于收集执行跟踪数据。GNAT 编译器编译带有开关的应用程序源程序,这些开关保留目标代码中的条件控制流并生成 DWARF 和 SCO 数据。然后在 GNATemulator 上运行未检测的可执行文件,生成执行跟踪数据。使用编译器和仿真器生成的信息,GNATcoverage 工具评估是否已实现所需的结构覆盖。如有必要,该工具会分析完整的历史跟踪数据以验证 MC/DC。图 2 描述了一个典型的开发场景。

图 2:虚拟化和覆盖分析准确评估结构覆盖。

pYYBAGK6swuAOhv_AAKWGh6ObW8278.png

这些工具目前适用于用 Ada 编写的应用程序,Ada 是一种在安全关键领域中经常使用的语言。未来版本将支持其他语言,包括 C。目前支持的目标架构包括 PowerPC 和 LEON。

高效的目标虚拟化,再加上一个从执行跟踪数据中推断出精确的源级覆盖率指标的工具,用于非仪器化/未修改的用户程序,标志着现有技术的进步。该技术在安全关键环境中特别有价值,支持各级安全认证,同时简化认证工作。

审核编辑:郭婷

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

    关注

    68

    文章

    18219

    浏览量

    221940
  • 代码
    +关注

    关注

    30

    文章

    4553

    浏览量

    66665
  • 模拟器
    +关注

    关注

    2

    文章

    813

    浏览量

    42689
收藏 人收藏

    评论

    相关推荐

    SCADE—产品级安全关键系统的MBD开发套件

    安全关键零部件的嵌入式产品级软件提供了SCADE开发套件,支持嵌入式软件详细设计和代码自动生成,有效缩短产品研制周期,提高产品研制效率,提高
    的头像 发表于 01-05 14:12 194次阅读
    SCADE—产品级<b class='flag-5'>安全</b><b class='flag-5'>关键</b>系统的MBD开发套件

    安全关键软件开发中实现 ASPICE 和 ISO 26262 的协同

    (ASPICE) 和 ISO 26262。ASPICE 用于评估并改进汽车软件的开发流程,而 ISO 26262 则着重解决安全关键型系统的功能安全问题。本文探讨了这两个框架的互补性,
    的头像 发表于 11-22 16:37 190次阅读

    代码覆盖率记录

    为确保具体的产品(例如,医疗或航空电子市场)质量合格, 通常需要提供语句覆盖与判定覆盖认证证明。对于各种嵌 入式系统,规范要求高度优化的代码需要实时测试。禁止 代码插装和运行时篡
    发表于 11-03 11:02 0次下载
    <b class='flag-5'>代码</b><b class='flag-5'>覆盖</b>率记录

    使用VectorCAST MATLAB Toolbox获取代码覆盖度的基本步骤

    程序与硬件的交互。在SIL或PIL验证的过程中,可以使用VectorCAST MATLAB Toolbox来捕获代码覆盖数据,从代码覆盖的角度体现SIL/PIL验证的充分性。
    的头像 发表于 10-26 11:06 467次阅读
    使用VectorCAST MATLAB Toolbox获取<b class='flag-5'>代码</b><b class='flag-5'>覆盖</b>度的基本步骤

    面向OpenHarmony终端的密码安全关键技术

    最重要的密码安全层面,提出完整的解决思路与方案;创新地在智能终端中实现了软件随机数生成;构建软硬件双机制的敏感参数保护机制与技术,同时在性能上也进行了代码实现的优化与提升;提出全国产智能
    发表于 09-13 19:20

    如何入门STM32CubeU5 TFM应用程序

    (STSAFE-A110 微控制器(以下统称为 STSAFE))可增强安全性。安全服务是一种可升级的代码,提供了一组服务,安全应用程序可以
    发表于 09-06 07:52

    软件代码结构化覆盖测试-分支覆盖

    本篇我们介绍分支覆盖,从测试技术对代码的测试程度上来说,在复杂代码中,分支覆盖比语句覆盖效果要好。
    的头像 发表于 09-01 11:34 390次阅读
    <b class='flag-5'>软件</b><b class='flag-5'>代码</b>结构化<b class='flag-5'>覆盖</b>测试-分支<b class='flag-5'>覆盖</b>

    如何提高嵌入软件单元测试效率

    有用。 在为嵌入系统开发软件时,准确和高效的测试是必不可少的,特别是对于持续集成和功能安全流。 来自全面回归测试套件的快速通过或失败结果使团队能够开发高质量的软件,而无需浪费工程资源
    发表于 08-28 06:31

    软件代码结构化覆盖测试-语句覆盖

    本篇将深入到代码层面,讲解单元测试中的一项重要工作-软件代码测试。
    的头像 发表于 08-25 11:50 382次阅读
    <b class='flag-5'>软件</b><b class='flag-5'>代码</b>结构化<b class='flag-5'>覆盖</b>测试-语句<b class='flag-5'>覆盖</b>

    Simulink模型测试、C/C++代码测试,都有喔#嵌入软件测试技术

    嵌入软件代码
    北汇信息POLELINK
    发布于 :2023年08月24日 09:59:39

    Arm密钥管理单元规范

    设备来执行加密操作。存储在KMU中的关键材料可以导出到分布硬件对抗组件。 KMU实现的键槽可以定义为硬件键槽或软件键槽。 KMU只能通过安全软件
    发表于 08-09 06:43

    片上软件需要什么安全完整性?

    STL(软件测试库)是一段代码,可能由IC供应商或第三方提供,用于对其运行的uC / DSP进行诊断覆盖。您可以尝试争辩说,由于STL的故障不会直接导致安全功能的故障,因此此类
    的头像 发表于 06-28 14:50 257次阅读

    PX5的ARM TrustZone支持让嵌入系统变得更加安全

    活动。它帮助开发者将关键安全固件、资源和私有信息与应用程序的其他部分分割开来。PX5 RTOS将这些技术能力扩展到软件中,正在申请专利的指针/数据验证(PDV)技术帮助开发者发现和控制代码
    发表于 05-18 13:44

    代码覆盖检测

    1 代码覆盖率概述 覆盖率(code coverage rate)是反映测试用例对被测软件覆盖程度的重要指标,也是衡量测试工作进展情况的重要
    的头像 发表于 05-12 22:26 2474次阅读
    <b class='flag-5'>代码</b><b class='flag-5'>覆盖</b>检测

    测量嵌入式系统中的代码覆盖

    许多 软件 开发 人员 测量 嵌入式 系统 中 的 代码 覆盖 率 使用 的 测试系统 与 其 原始 设计 非常 不同。工程师知道这是一种糟糕的方法,但它很容易发生。就像沸腾的青蛙寓言一样,不被注意的增量温度变化会导致可怜的青蛙
    的头像 发表于 04-23 10:50 614次阅读