Unreachable code

Код не может быть достигнут во время выполнения

Описание

Недоступный код использует переадресацию оператора, чтобы определить, может ли раздел кода быть достигнут во время выполнения. Переадресация оператора проверяет, выполняется ли инструкция программы. Если оператор имеет условия тестирования, и, по крайней мере, один из них происходит, оператор выполняется и достижим. Условия тестирования, которые не происходят, не считаются мертвым кодом, если у них нет соответствующей ветви кода. Если все условия тестирования не выполняются, оператор не выполняется, и каждое условие тестирования является образцом недоступного кода. Для примера, в switch операторы этого кода, case 3 никогда не происходит:

void test1 (int a) {
	int tmp = 0;
	if ((a!=3)) {
		switch (a){
			case 1:
				tmp++;
				break;
			default:
				tmp = 1;
				break;
/* case 3 falls through to 
   case 2, no dead code */
			case 3:
			case 2:
				tmp = 100;
				break;
		}
	}
}

void test2 (int a) {
	int tmp = 0;
	if ((a!=3)) {
		switch (a){
			case 1:
				tmp++;
				break;
			default:
				tmp = 1;
				break;
// Dead code on case 3
			case 3:
				break;
			case 2:
				tmp = 100;
				break;
		}
	}
}

В test1(), case 3 падает до case 2 и проверка показывает отсутствие мертвого кода. В test2()проверка показывает мертвый код для case 3 потому что break оператор в следующей линии не выполняется.

Другие примеры недоступного кода включают:

  • Если условие тестирования всегда оценивается как ложное, соответствующая ветвь кода не может быть достигнута. На Source панели начальная скобка ветви серого цвета.

  • Если условие тестирования всегда оценивается как true, условие является избыточным. На панели Source ключевое слово условия, например if, выглядит серым.

  • Код следует break или return оператор.

Если открывающая скобка блока кода выглядит серой на панели Source, чтобы подсветить весь блок, дважды щелкните скобку.

Проверка работает с кодом внутри функции. Проверки Function not called и Function not reachable определить, не вызывается ли сама функция или вызывается из недоступного кода.

Примеры

расширить все

#define True 1
#define False 0
 
typedef enum {
  Intermediate, End, Wait, Init
} enumState;
 
enumState input();
enumState inputRef();
void operation(enumState, int);
  
int checkInit (enumState stateval)  {
  if (stateval == Init) 
    return True;
  return False;
}
 
int checkWait (enumState stateval)  {
  if (stateval == Wait) 
    return True;
  return False;
}
  
void main()  {
  enumState myState = input(),refState = inputRef() ;
  if(checkInit(myState)){
    if(checkWait(myState)) {
      operation(myState,checkInit(refState));	
    } else {
      operation(myState,checkWait(refState));
    }
  }
} 

В этом примере main входит в ветвь if(checkInit(myState)) только если myState = Init. Поэтому внутри этой ветви Polyspace® считает, что myState имеет значение Init. checkWait(myState) всегда возвращается False и первой ветви if(checkWait(myState)) недоступен.

Коррекция - удаление избыточного теста

Одной из возможных коррекций является удаление избыточного теста if(checkWait(myState)).

#define True 1
#define False 0
 
typedef enum {
  Intermediate, End, Wait, Init
} enumState;
 
enumState input();
enumState inputRef();
void operation(enumState, int);

int checkInit (enumState stateval)  {
  if (stateval == Init) 
    return True;
  return False;
}
 
int checkWait (enumState stateval)  {
  if (stateval == Wait) return True;
  return False;
}
   
void main()  {
  enumState myState = input(),refState = inputRef() ;
  if(checkInit(myState))
    operation(myState,checkWait(refState));
} 
#include <stdlib.h>
#include <time.h>

int roll() {
  return(rand()%6+1);
}

void operation(int);
     
void main()   {
    srand(time(NULL));
    int die = roll();
    if(die >= 1 && die <= 6)
      /*Unreachable code*/
      operation(die);
  }

В этом примере roll() возвращает значение от 1 до 6. Поэтому if тест в main всегда определяет значение true и является избыточным. Если существует соответствующее else ветвь, серая ошибка появляется на else оператор. Без else ветвь, серая ошибка появляется на if ключевое слово, указывающее на избыточное условие.

Коррекция - удаление избыточного теста

Одной из возможных коррекций является удаление условия if(die >= 1 && die <=6).

#include <stdlib.h>
#include <time.h>

int roll() {
  return(rand()%6+1);
}

void operation(int);
     
void main()   {
  srand(time(NULL));
  int die = roll();
  operation(die);
}
#include <stdlib.h>
#include <time.h>
#define True 1
#define False 0

int roll1() {
  return(rand()%6+1);
}

int roll2();
void operation(int,int);
    
void main()   {
  srand(time(NULL));
  int die1 = roll1(),die2=roll2();
  if((die1>=1 && die1<=6) || 
     (die2>=1 && die2 <=6))
  /*Unreachable code*/
    operation(die1,die2);
}

В этом примере roll1() возвращает значение от 1 до 6. Поэтому первая часть if тест, if((die1>=1) && (die1<=6)) всегда верно. Потому что две части if тест объединяются с ||, а if тест всегда верен независимо от второй части. Поэтому вторая часть if тест недоступен.

Коррекция - объединение тестов с &&

Одной из возможных коррекций является объединение двух частей if тест с && вместо ||.

#include <stdlib.h>
#include <time.h>
#define True 1
#define False 0

int roll1() {
  return(rand()%6+1);
}

int roll2();
void operation(int,int);
    
void main()   {
  srand(time(NULL));
  int die1 = roll1(),die2=roll2();
  if((die1>=1 && die1<=6) && 
     (die2>=1 && die2<=6))
    operation(die1,die2);	
}

Проверяйте информацию

Группа: Поток данных
Язык: C | C++
Акроним: UNR