ISO26262理解上的一处探讨
笔者在《功能安全量产落地的三座大山》系列文章中,曾经提到过ISO 26262标准里的一个很有意思的问题。很多人都认为是标准写错了,但笔者经过仔细思考和分析,最终得出的结论并不是标准有误,而是我们没理解到位。下文针对这个问题展开讨论。
在功能安全软件开发过程中,软件验证是不可或缺的一个环节。ISO 26262标准里将软件验证分为三个阶段:软件单元验证、软件集成验证和软件需求验证,按照“V”流程进行推进:
软件验证的主要方法包括:审查、分析和测试,其中测试是最为常用、也是最为重要的验证方法。
提到测试,就不得不提到测试覆盖率。ISO 26262标准分别在软件单元层级和软件架构层级规定了相应的结构覆盖率指标(要求达到100%)。通常来说,所有“++”、也就是“highly recommended”的项目,都是需要执行的。
细心的人可能已经发现问题了,按理说ASIL等级越高,要求就越严格。所以“++”的数量排序应该是:ASILD >= ASIL C >= ASIL B >= ASIL A。查遍ISO 26262-2018所有的表格,基本上都符合这个规律,唯一的例外就是软件单元层级的结构覆盖率指标,ASIL C要求分支覆盖率,ASIL B反而同时要求语句覆盖率和分支覆盖率。
这是怎么回事?难道标准写错了?查一下ISO 26262-2011,发现这个地方并没有区别:
那就不合理了。从ISO 26262-2011到ISO26262-2018,经历了7年的修订时间,不太可能还留有这么明显的错误。所以,大概率是我们理解有误,而不是标准有误。接下来,让我们一起探讨一下。
语句覆盖(Statement Coverage):这是最常用也是最常见的一种覆盖方式,就是统计能够执行的代码被执行了多少行。
分支覆盖(Branch Coverage):又称为判定覆盖,是指使得程序中每个判断的取真分支和取假分支至少经历一次,即判断的真假均曾被满足。
二者的关系是:满足分支覆盖要求的测试用例一定能满足语句覆盖要求。
弄清楚语句覆盖率和分支覆盖率的相互关系后,让我们再次对问题进行分析:
ASILA的要求很明确:语句覆盖率-100%。
ASILC的要求也很明确:分支覆盖率-100%。
ASIL B的要求应该介于ASIL A和ASIL C之间,而且同时包含语句覆盖率和分支覆盖率的要求。所以,首先要达到ASIL A的要求,同时向ASIL C的要求靠拢。
也就是说,软件单元层级结构覆盖率指标(ASIL B)的要求是:语句覆盖率要达到100%,同时分支覆盖率要有测试(可以低于100%)。
以上是笔者对这个问题的理解,欢迎大家交流讨论。
The End
说明:
* 文章仅代表作者个人观点,不代表'仨人谈起'立场