主要内容

遥不可及的代码

在执行期间无法访问代码

描述

遥不可及的代码使用语句覆盖率来确定在执行过程中是否可以到达代码段。语句覆盖检查程序语句是否被执行。如果一条语句具有测试条件,并且至少出现了其中一个条件,则该语句将被执行并可达。没有发生的测试条件不会被认为是死代码,除非它们有相应的代码分支。如果没有出现所有的测试条件,则不会执行语句,并且每个测试条件都是不可访问代码的实例。例如,在开关本代码的声明,案例3从来没有发生:

Void test1 (int a) {int TMP = 0;If ((a!=3)) {switch (a){case 1: tmp++;打破;默认:TMP = 1;打破;/* case 3落到了case 2,没有死代码*/Case 3: Case 2: TMP = 100;打破;}}} void test2 (int a) {int TMP = 0;If ((a!=3)) {switch (a){case 1: tmp++;打破;默认:TMP = 1;打破;//情况3的死代码情况下3.:休息;Case 2: TMP = 100;打破;}}}

test1 ()案例3下降到案例2检查显示没有死代码。在test2 ()时,检查显示为无效代码案例3因为打破语句将不执行。

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

  • 如果测试条件的计算结果总是为false,则无法到达相应的代码分支。在窗格,树枝的张开支柱是灰色的。

  • 如果一个测试条件的值总是为true,则该条件是冗余的。在窗格中,条件关键字,例如如果,灰色。

  • 下面是代码打破返回声明。

如果代码块的左括号在窗格中,要突出显示整个块,请双击大括号。

检查作用于函数内部的代码。的检查函数不叫函数不可以确定函数本身是否没有被调用,或者是从不可访问的代码中调用的。

例子

全部展开

#define True 1 #define False 0 typedef enum {Intermediate, End, Wait, Init} enumState;enumState输入();enumState inputRef ();无效的操作(enumState, int);int checkInit (enumState stateval) {if (stateval == Init)返回True;返回错误;} int checkWait (enumState stateval) {if (stateval == Wait)返回True;返回错误;} void main() {enumState myState = input(),refState = inputRef();如果(checkInit (myState)){如果(checkWait (myState)){操作(myState checkInit (refState));}其他{操作(myState checkWait (refState));}}}

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

修正-删除冗余测试

一个可能的纠正方法是删除多余的测试如果(checkWait (myState))

#define True 1 #define False 0 typedef enum {Intermediate, End, Wait, Init} enumState;enumState输入();enumState inputRef ();无效的操作(enumState, int);int checkInit (enumState stateval) {if (stateval == Init)返回True;返回错误;} int checkWait (enumState stateval) {if (stateval == Wait)返回True;返回错误;} void main() {enumState myState = input(),refState = inputRef();如果(checkInit (myState))操作(myState, checkWait (refState)); }
#include  #include  int roll() {return(rand()%6+1);}无效操作(int);void main() {srand(time(NULL));Int die = roll();如果(die >= 1 && die <= 6) /*不可达代码*/操作(die);}

在这个例子中,卷()返回1到6之间的值。因此,如果测试主要总是计算为真,是多余的。如果有相应的其他的分支时,出现灰色误差其他的声明。没有一个其他的分支时,出现灰色误差如果关键字以表示冗余条件。

修正-删除冗余测试

一个可能的纠正方法是去除这种情况If (die >= 1 && die <=6) / /

#include  #include  int roll() {return(rand()%6+1);}无效操作(int);void main() {srand(time(NULL));Int die = roll();操作(死);}
#include  #include  #define True 1 #define False 0 int roll1() {return(rand()%6+1);} int roll2 ();无效的操作(int, int);void main() {srand(time(NULL));Int die1 = roll1(),die2=roll2();如果((die1>=1 && die1<=6)/*不可达的代码*/操作(die1,die2);}

在这个例子中,roll1 ()返回1到6之间的值。因此,第一部分如果测试中,如果((die1 > = 1) & & (die1 < = 6))总是正确的。因为这两部分如果测试与||,如果不管第二部分是什么,测试总是正确的。因此,第二部分如果测试是遥不可及的。

修正-将测试与&&

一种可能的纠正方法是将这两部分结合起来如果测试&&而不是||

#include  #include  #define True 1 #define False 0 int roll1() {return(rand()%6+1);} int roll2 ();无效的操作(int, int);void main() {srand(time(NULL));Int die1 = roll1(),die2=roll2();如果(die1 > = 1 & & die1 < = 6) & & (die2 > = 1 & & die2 < = 6))操作(die1 die2);}

检查信息

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