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

Should branches of code caused by short-circuiting be considered for code coverage?

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

自然要看你分析代码的目的了。

FAA 通常建议(例如 DOT/FAA/AR-06/54 "Software Verification Tools Assessment Study",最终报告,2007 年 6 月。第 4.2.5 节)短路运算符(包括 C 的三元运算符,以及作为布尔运算符)被解释为决定 - 就像你描述的那样。对于更高的设计保证级别(特别是灾难性和危险性),相关标准(DO178、DO254 等)要满足的目标具有要求覆盖所有可能的决策的效果——在更高的 DAL 上增加独立性。

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

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

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

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

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

意味着您对 && 运算符覆盖率的回答应该与定义等价物的回答相同。同样对于 ||运算符。