是否应考虑由短路引起的代码分支用于代码覆盖?

时间:2016-05-06 07:13:15

标签: unit-testing code-coverage code-analysis

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

2 个答案:

答案 0 :(得分:3)

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

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

因此,假设您的应用程序需要更高的DAL,答案通常是肯定的。另一种方法是构建一个特定的论点,以支持声称不需要此类覆盖来满足您的分析或测试目标 - 并说服审核者接受该论点。可能需要针对每个短路情况构建这样的论证。

答案 1 :(得分:1)

你可以通过各种方式争论这个问题,但对我来说,事实是:

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

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

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

表示您对&&&运算符应与定义等价的答案相同。同样适用于||操作