主要内容

遥不可及的代码

代码执行期间不能达成

描述

遥不可及的代码使用语句覆盖率来确定一段代码是否可以达到在执行期间。语句覆盖检查是否执行一个程序语句。如果一个语句测试条件,至少其中之一发生时,执行该语句和可及。测试条件不发生不被认为是死代码,除非他们有一个相应的代码分支。如果所有的测试条件不发生,语句不执行每个测试条件是不可到达的实例代码。例如,在开关语句的代码,案例3从来没有发生:

空白test1 (int) {int tmp = 0;如果((! = 3)){开关(a){案例1:tmp + +;打破;默认值:tmp = 1;打破;/ * 3失败案例2,没有死代码* /例3:例2:tmp = 100;打破;}}}无效test2 (int) {int tmp = 0;如果((! = 3)){开关(a){案例1:tmp + +;打破;默认值:tmp = 1;打破;/ /死代码情况3情况下3:休息;案例2:tmp = 100;打破;}}}

test1 (),案例3下降到案例2和检查显示没有死代码。在test2 ()检查显示,死代码案例3因为打破声明不执行下一行。

其他不可到达的代码的例子包括:

  • 如果一个测试条件总是的求值结果为false,对应的代码分支不能达成。在窗格中,分公司的开括号是灰色的。

  • 如果一个测试条件总是评估为true,条件是多余的。在面板中,条件的关键字,比如如果,灰色。

  • 之前的代码打破返回声明。

如果一个代码块的开括号出现灰色的窗格中,强调整个块,双击撑。

检查操作代码在一个函数。的检查函数不叫函数不可以确定函数本身并不是调用或从遥不可及的调用代码。

诊断这张支票

检查和修复的代码检查

例子

全部展开

#定义对1 #定义错0 typedef enum{中间、结束等,Init} enumState;enumState输入();enumState inputRef ();无效的操作(enumState, int);int checkInit (enumState stateval){如果stateval = = Init()返回True;返回错误;}int checkWait (enumState stateval){如果(stateval = =等)返回True;返回错误;}void main () {enumState myState =输入(),refState = inputRef ();如果(checkInit (myState)){如果(checkWait (myState)){操作(myState checkInit (refState));}其他{操作(myState checkWait (refState));}}}

在这个例子中,主要进入的分支如果(checkInit (myState))只有在myState =初始化。因此,在这个分支,Polyspace®认为myState是有价值的初始化checkWait (myState)总是返回和第一个分支机构如果(checkWait (myState))是遥不可及的。

修正-删除冗余的测试

一个可能的修正是删除冗余的测试如果(checkWait (myState))

#定义对1 #定义错0 typedef enum{中间、结束等,Init} enumState;enumState输入();enumState inputRef ();无效的操作(enumState, int);int checkInit (enumState stateval){如果stateval = = Init()返回True;返回错误;}int checkWait (enumState stateval){如果(stateval = =等)返回True;返回错误;}void main () {enumState myState =输入(),refState = inputRef ();如果(checkInit (myState))操作(myState, checkWait (refState)); }
# include < stdlib。h > # include <时间。h > int辊(){返回(rand () % 6 + 1);}无效操作(int);void main(){将srand(时间(NULL));int死=辊();如果(死> = 1 & &死< = 6)/ *遥不可及的代码* /操作(死);}

在这个例子中,卷()返回一个值介于1和6。因此,如果测试主要总是评估为true,是多余的。如果有一个对应的其他的错误出现在分支,灰色的其他的声明。没有一个其他的错误出现在分支,灰色的如果关键字表示冗余条件。

修正-删除冗余的测试

一个可能的修正是删除的条件如果(死> = 1 & &死< = 6)

# include < stdlib。h > # include <时间。h > int辊(){返回(rand () % 6 + 1);}无效操作(int);void main(){将srand(时间(NULL));int死=辊();操作(死);}
# include < stdlib。h > # include <时间。h > # define真1 #定义假0 int roll1(){返回(rand () % 6 + 1);}int roll2 ();无效的操作(int, int);void main(){将srand(时间(NULL));int die1 = roll1 (), die2 = roll2 ();如果((die1 > = 1 & & die1 < = 6) | |(die2 > = 1 & & die2 < = 6)) / *遥不可及的代码* /操作(die1 die2);}

在这个例子中,roll1 ()返回一个值介于1和6。因此,的第一部分如果测试中,如果((die1 > = 1) & & (die1 < = 6))总是正确的。因为两个部分如果试验相结合| |,如果无论第二部分测试总是如此。因此,的第二部分如果测试是遥不可及的。

修正,结合测试& &

一个可能的修正是组合的两个部分如果测试& &而不是| |

# include < stdlib。h > # include <时间。h > # define真1 #定义假0 int roll1(){返回(rand () % 6 + 1);}int roll2 ();无效的操作(int, int);void main(){将srand(时间(NULL));int die1 = roll1 (), die2 = roll2 ();如果((die1 > = 1 & & die1 < = 6) & & (die2 > = 1 & & die2 < = 6))操作(die1 die2);}
typedef enum {init、运行完成};int getAnInput ();州=初始化;空白f (int b){开关(a){案例init:{如果(b = = 3){=完成;}打破;}案例完成:{if (b = = 1){/ /访问代码/ / ....}打破;}/ /……}}void main () {int b = getAnInput ();f (b);f (b);}

有时,一块可以遥不可及的,因为变量值都受制于之前操作的代码。如果你不理解为什么总是一个条件或真或假,看看变量的条件限制,因为之前的一些操作。

在这个例子中,函数getAnInput ()存根以来没有得到定义。的变量b,这是通过初始化getAnInput (),可以采取任何int值允许的数据类型。看起来,在调用f (),b可以有任何价值包括1和3的值。然而,条件(b = = 1)出现错误和相应的块遥不可及的。

检查两个调用f ()。在第一次调用f ()switch语句选择例初始化。在例初始化,b可以全面。如果b= 3,一个设置完成。第二次函数f ()被称为,switch语句可以选择例初始化情况下完成。因为唯一的方法情况下完成可以选择是什么时候b以前等于3,因为没有操作的b外的例初始化,Polyspace假定b仍然是等于3。因此,if语句的条件(b = = 1)永远不能见过导致内遥不可及的代码吗情况下完成

检查信息

组:数据流
语言:C | c++
缩略词: