主要内容

遥不可及的代码

在执行期间无法访问代码

描述

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

Void test1 (int a) {int TMP = 0;If ((a!=3)) {switch (a){case 1: tmp++;打破;默认值:TMP = 1;打破;/*情况3变成情况2,没有死代码*/案例3:案例2:TMP = 100;打破;}}} void test2 (int a) {int TMP = 0;If ((a!=3)) {switch (a){case 1: tmp++;打破;默认值:TMP = 1;打破;// case 3上的错误代码情况下3.:休息;案例2:TMP = 100;打破;}}}

test1 ()案例3掉进了案例2检查显示没有死代码。在test2 (),检查显示死代码案例3因为打破语句将不执行。

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

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

  • 如果测试条件的计算结果总是为真,则该条件是冗余的。在窗格中,condition关键字,例如如果,显示为灰色。

  • 代码遵循一个打破返回声明。

上的代码块的开大括号显示为灰色窗格中,双击大括号以突出显示整个块。

检查操作的是函数内部的代码。的检查未调用的函数而且函数不可达确定函数本身没有被调用,还是从不可访问的代码中调用。

例子

全部展开

#define True 1 #define False 0 typedef enum{中间,结束,等待,初始化}枚举状态;enumState输入();enumState inputRef ();void操作(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));}else{操作(myState,checkWait(refState));}}}

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

修正-删除冗余测试

一种可能的纠正方法是去掉冗余测试如果(checkWait (myState))

#define True 1 #define False 0 typedef enum{中间,结束,等待,初始化}枚举状态;enumState输入();enumState inputRef ();void操作(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(){返回(rand()%6+1);}无效操作(int);void main() {srand(时间(NULL));Int die = roll();如果(die >= 1 && die <= 6) /*不可达代码*/操作(die);}

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

修正-删除冗余测试

一种可能的纠正方法是删除条件If (die >= 1 && die <=6)

#include  #include  int roll(){返回(rand()%6+1);}无效操作(int);void main() {srand(时间(NULL));Int die = roll();操作(死);}
#include  #include  #define True 1 #define False 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之间的值。因此,第一部分如果测试中,If ((die1>=1) && (die1<=6))总是正确的。因为这两部分如果试验与||,如果不管第二部分如何,测试总是正确的。因此,第二部分如果测试不可达。

更正-将测试与& &

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

#include  #include  #define True 1 #define False 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);}
类型定义枚举{init, run, completion}状态;int getAnInput ();声明a = init;Void f(int b) {switch (a) {case init: {if (b == 3) {a =完成;}打破;} case completion: {if (b == 1)//不可达代码//....}打破;} / /……}} void main() {int b = getAnInput();f (b);f (b);}

有时,一个块可能无法访问,因为变量值受到代码中先前操作的约束。如果您不理解为什么一个条件总是true或false,请查看条件中的变量是否因为某些先前的操作而受到约束。

在这个例子中,函数getAnInput ()是存根的,因为没有给出它的定义。的变量b,通过初始化getAnInput (),可以取int数据类型允许的任何值。这似乎是在呼唤f ()b可以是任意值,包括1和3。然而,这种情况(b == 1)显示为false,对应的块不可达。

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

检查信息

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