打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
12 - 汽车功能安全(ISO 26262)系列: 软件开发 - 软件详细设计及安全测试
userphoto

2022.12.07 上海

关注
本篇属于汽车功能安全专题系列第12篇内容,我们来聊聊汽车功能安全软件详细设计及安全测试相关内容。

开始阅读之前强烈建议参考之前系列文章:

01 - 汽车功能安全(ISO 26262)系列 - 开篇

02 - 汽车功能安全系列之概念阶段开发 - Item Definition & HARA

03 - 汽车功能安全(ISO 26262)系列: 概念阶段开发 - 功能安全需求及方案(FSR&FSC)

04 - 汽车功能安全(ISO 26262)系列: 系统阶段开发 - 技术安全需求(TSR)及安全机制

05 - 汽车功能安全(ISO 26262)系列: 系统阶段开发 - 技术安全方案TSC及安全分析

06 - 汽车功能安全(ISO 26262)系列: 系统阶段开发 - 系统安全架构

07 - 汽车功能安全(ISO 26262)系列: 硬件开发 - 硬件安全需求,安全设计及安全机制

08 - 汽车功能安全(ISO 26262)系列: 硬件开发 - 硬件随机失效概率化评估

09 - 汽车功能安全(ISO 26262)系列: 硬件开发 - 随机硬件失效量化FMEDA

10 - 汽车功能安全(ISO 26262)系列: 软件开发 - 软件开发模型及安全需求

11 - 汽车功能安全(ISO 26262)系列: 软件开发 - 软件架构安全设计

上一篇我们聊完了软件架构安全设计相关内容,接下来以此为基础进行相应软件详细设计和后续的安全测试。

01


软件详细设计

功能安全软件详细设计或者软件单元设计主要任务就是基于软件安全架构,对软件安全需求进行进一步实现。和非功能安全软件详细设计相比,功能安全软件详细设计,除了实现软件安全需求外,最主要的区别就是需要考虑由软件安全需求ASIL等级带来的开发约束,其主要包括:

  • 建模和编码指南约束


  • 不同ASIL等级软件单元设计语言或标记约束


  • 软件单元设计原则的约束


这些内容都比较容易理解,在此不再赘述。

此外,目前汽车软件开发多基于模型开发,即MBD,同样也适用于汽车功能安全软件开发,其开发流程,开发工具等均和正常的应用层软件开发一致,多采用SIMULINK,ASCET或AUTOSAR开发工具链等图形化开发语言进行,再通过RTE技术自动代码生成,这部分内容大家应该都比较熟悉,在此不再赘述。

以AUTOSAR开发工具链为例,MBD开发流程如下图所示:


02


软件安全测试内容及方法

根据软件开发V模型,软件安全详细设计完成之后,需要进行相应的软件验证,集成及测试等内容,即V模型右边内容,具体包括,软件单元验证(Software Unit Verification),软件集成和验证(Software Integration and Verification),软件测试(Testing of the embedded Software),具体如下图所示

细心的朋友可能已经发现了,软件单元,集成后的软件组件用的都是Verification,即验证,非Validation,即确认。最后一部分嵌入式软件用的Testing,即测试,其实也属于验证。


2.1 验证(Verification) vs. 确认(Validation)


很多朋友一直混淆这验证(Verification)和确认(Validation)两个概念,这里首先对这两个概率进行辨析:

1

验证(Verification): 提供客观证据,证明开发过程满足规定要求,旨在回答: Are we building the product right?

简单说就是,关注实现过程,不看结果,即整个开发过程是不是按照规定的要求去做,工作输出物是否完整,至于输出结果是否满足客户预期功能或需求,不属于验证的范畴。

2

确认(Validation): 提供客观的证据,证明开发结果满足客户预期的功能或需求。旨在回答: Are we building the right product?

简单说就是,关注结果,不关心过程,即不管开发过程,关心最终输出结果是否满足客户预期需要功能或需求。

例如: 对于把大象装进冰箱里这个需求,规定的要求是:1)打开冰箱门,2)把大象放进冰箱,3)关上冰箱门。

验证需要做的是,检查你是不是按照这三个规定的步骤做的,如果你漏掉其中某个步骤或执行顺序有问题等等,验证就无法通过。

而确认需要做的是,不管你到底先开的冰箱门还是什么,重点是大象是否被装进了冰箱。有可能验证全部通过,但大象自己又从冰箱里走出来了,最后确认还是没办法通过🤣。

需要注意的是,确认(Validation)多发生在验证(Verification)之后,更多在系统或产品阶段,所以在ISO 26262中,软件,硬件开发V模型右边对应的测试均为验证过程,只有在系统阶段,系统集成后的对应的测试属于确认过程。

2.2 软件安全验证方法

ISO 26262-6:2018针对软件单元验证,集成验证,嵌入式软件验证这三部分内容分别进行了阐述,并根据不同的ASIL等级对其验证方法进行推荐,具体见下面三个表格:


看到这里,很多朋友其实已经发现,虽然它们属于软件开发V模型不同测试层级,但很多测试方法是共通的,例如基于需求测试,接口测试,错误注入测试等等。
为更好地理解,我们可以从测试类型的角度,将以上测试方法分为:

  • 静态分析(Static Analysis)

  • 动态分析(Dynamic Analysis)

对于功能安全软件安全测试,软件单元验证,集成验证,嵌入式软件验证对应测试类型如下:

  • 单元验证: 静态分析 + 动态分析,静态为主

  • 集成验证: 静态分析 + 动态分析,动态为主

  • 嵌入式软件验证: 动态分析

那什么是静态分析和动态分析呢?


2.2.1 静态分析

静态测试属于最基本的测试,是指不用执行程序的测试,它主要采取代码走查、技术评审、代码审查等方法对软件产品进行测试,它主要包括:

1

软件/代码是否满足相关质量标准?

─ 走查,结对编程,检查

─ 控制流分析

─ 数据流分析

─ 静态代码分析

除不同类型的人为分析检查外,静态分析最最要内容为静态代码分析,主要目的是检查代码编写是否符合特定的编程规则。对于大部分车辆控制器代码而言,静态代码分析,即C代码静态分析(如果基于模型开发,则是自动生成的代码),主要是保证代码满足MISRA C(Motor Industry Software Reliability Association, 汽车工业软件可靠性协会)相关的要求。

静态代码分析一般可以直接采用自动化检测软件,例如SIMULINK, Model Advisor; Vector, VectorCAST; Perforce, Helix QAC等,通过配置代码检测规则,然后导入源文件进行自动化分析,如果不满足相关要求,则需要对代码进行修改直至满足为止。


2.2.2 动态分析

动态分析是指实际运行程序,并通过观察程序运行的实际结果来发现错误的软件测试技术,它包括了以下几个方面:

1

软件/代码是否做了它应该做的?

─ 基于需求测试
─ 接口测试
─ Back-to-Back测试

2

软件/代码是否做了它不应该做的?

─ 鲁棒性测试

3

软件/代码是否足够?

─ 结构覆盖性测试

重要的动态测试包括:

   基于需求测试  

     ─ 基于分配的安全需求和测试环境,制定安全测试用例,测试用例一般包括5个关键参数,即: 初始状态或前提条件,数据设置,输入,预期输出,实际输出。

     ─ 需管理需求和测试用例及结果的可追溯性,进行覆盖率解析。

 

        接口测试      

     ─ 不同软件层次接口,包括信号名称,数目,数据类型,范围测试。


    错误注入测试   

    ─ 即鲁棒性测试,故障注入测试主要目的是验证系统设计、软件设计过程所提出安全机制或安全措施的有效性,通过在特定位置注入错误,包括错误的数值,方向,频率等,对系统功能安全机制响应时间、诊断覆盖等内容进行验证。


Back-to-Back测试

    ─ 基于模型设计的测试,验证模型和生成的代码的一致性,即采用相同的测试用例,同时输入模型和生成的代码进行执行,对二者输出结果进行比较,一致则通过,否则存在不一致。

除基本测试方法外,ISO 26262-6:2018对不同阶段的软件安全测试环境也有相应的要求:

  • 单元验证及集成验证: 基于开发环境的软件测试,包括模型在环,软件在环,处理器在环,硬件在环。

  • 嵌入式软件验证: 硬件在环或车辆

2.3 软件安全测试用例导出


静态测试多自动化完成,多不需要测试用例,相对比较简单,而动态测试基本上都需要用到测试用例,那如何导出测试用例,用尽可能少的测试用例,覆盖尽可能多的测试场景,这是个很重要的问题。

在ISO 26262-6:2018中,根据不用ASIL等级,对于软件单元,集成测试,嵌入式软件这三个层次的用测试用例导出方法基本类似,包括:
  • 需求分析
  • 等价类的生成和分析
  • 边界值分析
  • 基于经验的错误猜想
  • 功能相关性分析
  • 操作用例的分析

其中,等价类的生成和分析,可以基于划分输入输出来识别等价类,为每个等价类选择一个有代表性的测试值,这样可以有效降低测试用例数目,降低测试成本和时间。

03


如何保证软件安全测试完整性


为了评估验证的完整性并提供证据证明已有测试用例已充分实现相应测试目标,必须对测试完整性进行评估,这里就得提到结构覆盖率这个概念。

首先明确一点,这里的结构覆盖率不是指我们对百分之多少的测试用例或者需求进行了测试,这是属于基于需求的测试覆盖率,它和结构覆盖率有本质区别。

结构覆盖率用于度量我们设计的测试用例在多大程度上可以覆盖我们的代码,包括代码的语句,函数,分支等等。因此,结构覆盖率又可以进一步分为:

  • 语句覆盖率用于统计每个代码语句被测试用例执行的比例

  • 分支覆盖率用于统计每个判定分支(即If...else等)测试用例执行的比例

  • 函数覆盖率用于统计代码中所有函数被测试用例执行的比例

  • 调用覆盖率用于统计每个函数调用端被测试用例执行的比例

  • MC/DC(修改条件/判定覆盖率): 这个比较复杂,我们单独来讲


其中,很多朋友搞不清函数覆盖率和调用覆盖率的区别,以及MC/DC意义,接下来我们结合实例重点来聊聊这两部分内容

1) 函数覆盖率 vs. 调用覆盖率

例如,对于测试对象: 

if A==1, then f1, f2, else if (0), then f3,else, then f4,end 
其中,f1,f2,f4均被定义,f3定义不存在。

该情况下,由于elseif (0), 函数f3永远不会被执行,所以函数调用覆盖率为3/4=75%,但所有定义的函数均被执行,所以函数覆盖率为100%。

所以,函数覆盖率多用于检测未被调用的多余函数,而调用覆盖率用于检测死代码。

2MC/DC(修改条件/判定覆盖率)

MC/DC是分支测试的进一步补充,适用于判定类代码覆盖检测,它要求较为复杂

  • 在一个程序中每一种所有可能的输入和输出至少出现一次。

  • 每一个判定中的每一个条件必须能够独立影响判定输出,即在其他条件不变的前提下,仅改变条件中一个值,而使判定结果改变。

什么意思呢,我们来看个实例。例如,对于测试对象: 

if A and (B or C), thenelse,⋯end

理论上,对于三个输入判定条件(A, B, C),一共存在8种测试Case,为实现MC/DC全覆盖,其实只需要以下4个测试用例,即Case1 - 4,就能使得A,B,C输入和判定输出结果true和false都出现一次,且只要A,B,C一个条件值发生改变,就会最终判定结果发生变化。

所以,MC/DC较复杂,但错误检出率高,适合那些大型的并且要求测试非常精确的软件测试。

为保证软件安全测试完整性,ISO 26262-6:2018还对软件单元,集成软件的测试覆盖率进行相应要求,具体包括

可以看出,软件单元层面结构覆盖率多基于语句,分支等最基本的代码组成部分测试,而集成后的软件架构层级的结构覆盖率多基于函数,其层级更高。二者逐步递进,可以有效评估软件安全测试的完整性和充分性。

需要注意的是:

1

结构覆盖率不需要一味追求100%,高结构覆盖率并不完全说明代码已经进行高质量充分测试,它只说明哪些代码没有被测试用例有效执行。

2

构覆盖率测试可以帮我们反推前期测试用例设计是否充分,是否存在盲点,哪些地方需要进行补充,增加测试完整性。

3

结构覆盖率测试并不能解决软件事先没有考虑到的情形及功能不足

写在最后:

功能安全软件开发阶段软件详细设计及安全测试内容我们就聊完了
到此为止汽车功能安全系列主要开发阶段,包括概念,系统,硬件,软件相关的内容就结束了下期我们来看功能安全管理相关的一些内容。

奈何现有公众号没有留言功能,感兴趣的朋友可以直接公众号私信我或者通过公众号下方菜单栏''联系我'',添加好友,加入'读者交流社区',共同探讨



END



点赞【在看】= 原创的动力

                                 多谢点赞和【在看

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
ISO26262 功能安全各个阶段测试要求
常用嵌入式软件白盒测试工具介绍
灰盒测试技术
项目测试基础:白盒测试相关知识笔记
符合功能安全要求的动态测试工具-TESSY
探索式测试的若干问题
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服