代码覆盖范围是否应考虑短路引起的代码分支



常规分支覆盖将需要两个单元测试来覆盖一个简单的if语句。但如果存在像if (A && B)这样的组合条件,从控制流图的角度来看,如果使用短路,则存在额外的分支。这与圈复杂度计数一致,后者给出3(也应用了每个逻辑运算符将复杂度增加1的规则,因为在短路的情况下会创建决策节点)。但据我所知,代码分析器并不考虑这些分支。无论如何,是否值得覆盖它们,以确保对表达的部分评估不会产生副作用?

这当然取决于您分析代码的目的。

FAA通常建议(例如DOT/FAA/AR-06/54"软件验证工具评估研究",最终报告,2007年6月。第4.2.5节),短路运算符的所有操作数(包括C的三元运算符以及布尔运算符)都被解释为决策——就像你所描述的那样。对于更高的设计保证水平(特别是灾难性和危险性),根据相关标准(DO178、DO254等)需要满足的目标具有要求覆盖所有可能的决策的效果,在更高的DAL下具有更大的独立性。

因此,假设您的申请需要更高的DAL,答案通常是肯定的。另一种选择是构建一个具体的论点来支持这样一种说法,即满足分析或测试的目标不需要这样的覆盖范围,并说服评审人员接受这一论点。可能需要为每一个短路实例构建这样的论点。

你可以用各种方式对此进行争论,但对我来说,事实是:

if (a && b) { X=... }

完全等效(通常定义为):

if (a)
{  if (b) { X=... }
}

是指您对&运算符应与定义等价项的答案相同。类似于||运算符。

最新更新