“功能安全产品实现技术”系列讲座第9讲 安全相关产品的软件实现(三)
2014-04-03
(上海工业自动化仪表研究院1,上海 200233;上海仪器仪表自控检验测试所功能安全中心2,上海 200233)
0 引言
功能安全软件的一切验证和确认活动主要是为检验与评估软件是否已正确执行其产品的安全功能。软件验证主要针对安全完整性等级要求的程度,测试和评估软件安全生命周期在给定阶段的输出,保证该阶段输出对于相应输入的正确性和一致性;软件确认主要是为了证明安全相关产品在软硬件集成后符合软件安全要求规定。本文所述的软件验证是指狭义的软件安全生命周期中后期的静态代码复审、模块测试、集成测试阶段的验证技术,主要是动态的,与上述安全生命周期的早期的几个阶段不同,因为前期的验证主要是静态的。
本文的软件验证技术主要是软件测试,它是软件代码实现后(除代码复审外)一切验证与确认活动的主要方法,其首要条件是最好考虑到软件验证的独立性,必须由开发人员外的专业领域测试人员进行,避免陷入开发人员既定的编程思维,从而不利于算法优化、代码优化,避免代码重用等错误。
1 代码复审
代码复审可依靠多种代码检查方式来完成,包括软件审查、人工走查和形式化检查。代码复审是针对软件的整个源代码,不管是一般芯片自带的、编译器自动生成的和人工开发的代码,都要进行软件走查和人工走查,一般同时进行,相辅相成;而形式化检查是否需要,则按安全完整性等级和软件模块设计规范选择。
为达到软件安全完整性等级的要求,源代码应需具有以下代码属性:可读、可理解、可测试性;满足软件模块设计的规定要求;满足编码标准的规定要求;满足安全计划编制中规定的所有相关要求。
软件走查的主要任务是依据制定好的软件编码标准和已选择的软件测试工具对源代码进行分析,从而生成代码复审报告;然后让开发人员针对违背编码标准的语句在不会影响整个模块设计的前提下(如果确认为模块设计的问题,则重回模块设计阶段修改验证)进行修改,直到顺利通过编码标准为止;最后如果存在软件和硬件的实际需求而无法通过编码标准的语句,则须针对每条语句给予违背编码规则说明文档记录。
人工走查的主要工作是依据《软件详细设计说明》对源代码进行分析,确保所有代码是执行预定功能且不执行其非预定功能,去除一切重复、无用、错误的代码;除此之外还要针对软件走查的代码复审报告进行逐条语句验证与确认,该条语句是否确实违背编码规则。这个检查工作非常关键,需复审人员耐心地读懂程序并仔细地推敲其是否与《软件详细设计说明》达成一致性、正确性、完整性。
形式化检查一般在安全相关产品规定的软件安全功能和软件系统性能能力较高且软件系统比较复杂的情况下使用,是一种动态的分析方法;使用某种严格的数学方法来证明复杂的软件不存在数据溢出、内存泄露、未初始化的内存、被零除和指针越界等运行时错误。该方法也能靠软件测试工具支持。
代码复审的执行过程如图1所示。
图1 代码复审的执行过程
2 模块测试
测试软件模块是对代码实现和软件模块设计的验证,与代码复审相结合,用于确保软件模块设计满足其相关规范。该阶段重点是选用合适的测试方法对软件模块的具体实现、内部的逻辑结构、数据流向等进行全面的测试,除了功能需求,还要增加非正常逻辑的测试,而这些是影响到软件单元测试充分性的关键,最终确保软件执行其预定功能且不执行其非预定功能。
功能安全软件的模块测试在开始前一般应具备以下条件:模块测试规范及计划(模块设计阶段已生成);所提交的被测软件版本受控(源代码清单);源代码已正确通过编码规则检查(代码复审报告);源代码已正确通过编译或汇编;软件详细设计说明;已搭建好的测试环境(包括测试的运行环境和测试工具环境)。采用的测试方法为白盒,在其基础上确定测试需要的其他配套技术及方法,如测试数据生成与验证技术、测试数据输入技术、测试结果获取技术。
设计测试用例一般需考虑下面几个方法:边界值分析;控制流分析;接口分析;等价类方法;形式化证明或断言;量化的统计证据。
功能安全软件的模块测试活动流程如图2所示。模块测试各阶段的输入、输出如图3所示。
图2 软件模块测试活动流程
图3 模块测试中各阶段的主要数据流
根据模块测试计划中测试须达到的覆盖率水平等进行结果核对,判断是否出现异常或需要补充测试用例情况,如出现相应的情况应做出对应的处理,其具体流程如图4所示。
图4 结果核对活动的控制流程
最后应对测试执行活动、模块测试文档(包括模块测试报告、测试用例、测试记录、测试日志和测试异常报告等)进行评审。评审一般包括下面几点内容:测试执行活动的有效性;测试结果的正确性、完备性和合理性;整个测试过程是否达到了模块测试规范的要求;测试中所有生成的文档是否符合规范。
结束模块测试工作一般应具备以下条件:已按要求完成了模块测试规范所规定的测试任务;实际测试过程遵循了原定的软件测试计划要求;客观、详细地记录了测试过程和测试中发现的所有问题;测试文档齐全、符合规范;测试的全过程自始至终在控制下进行;测试中的问题或异常有合理解释或正确有效的处理;全部测试工具、被测软件、测试支持软件和评审结果已纳入配置管理。
3 集成测试
功能安全软件由于通常是嵌入式软件,所以集成有两个概念,一个是纯粹的软件模块集成,一个是硬件和软件相结合的可编程电子集成,本文所述的集成是没有硬件参与的软件集成。软件集成测试主要是验证所有软件模块相互作用以实现其预定功能而不实现非预定功能,确保软件系统满足安全功能和系统性能力的特定要求。功能安全软件的集成测试活动流程如表1所示。
对具体的安全相关产品的软件,可根据软件安全功能和软件系统性能力选择适当的集成测试技术。软件集成测试一般应符合以下要求:①对集成软件进行必要的静态分析;②采用自底向上增量集成法,测试新组装的软件集成;③逐项测试软件概要设计文档规定的软件的功能、性能等特性;④测试软件之间、软件和硬件之间的所有接口;⑤测试运行条件(如数据结构、输入/输出通道容量、内存空间、调用频率等)在边界状态下和人为设定的状态下软件的功能和性能;⑥应按概要设计文档要求,对软件的功能、性能进行强度测试;⑦对执行安全功能代码进行安全性分析,明确每一个故障状态和导致故障的可能原因,并对执行安全功能代码进行针对性、重复性的测试。
表1 软件集成测试活动流程
4 结束语
功能安全软件的验证与确认贯穿于安全相关产品软件实现的全过程。由于该活动是可重复性的,所以配置管理至关重要,以便后期如果出现事故查找故障出处。
同时,还要注重安全软件本身的特性:
① 无移植性,针对软件使用的特定环境而开发的功能安全软件,其如需移植,则必须重新测试使用平台;
② 灵活性,在保证完成安全功能的前提下要保持软件操作等的灵活性;
③ 效率性,安全软件主要是实现安全功能,如果没有产品特别需求,这个不需太强求;
④ 正确性,这个是必须要遵循的,整个验证和确认过程都是为了证明这一点。