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