exponenta event banner

Недоступный код

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

Описание

Недоступный код использует покрытие инструкции, чтобы определить, может ли быть достигнут раздел кода во время выполнения. Функция покрытия инструкций проверяет, выполняется ли инструкция программы. Если оператор имеет тестовые условия и хотя бы одно из них происходит, оператор выполняется и доступен. Условия тестирования, которые не возникают, не считаются мертвым кодом, если они не имеют соответствующей ветви кода. Если все тестовые условия не выполняются, инструкция не выполняется, и каждое тестовое условие является экземпляром недостижимого кода. Например, в 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 инструкция в следующей строке не выполняется.

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

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

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

  • Код следует за break или return заявление.

Если открывающая фигурная скобка блока кода отображается серым цветом на панели «Источник», то для выделения всего блока дважды щелкните фигурную скобку.

Проверка работает с кодом внутри функции. Проверка Функция не вызвана и Функция не доступна определяет, не вызвана ли сама функция или вызвана из недостижимого кода.

Примеры

развернуть все

#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