Анализ программы автоматического доказательства кода после Красных и оранжевых проверок

Polyspace® полагает, что все пути к выполнению, которые содержат ошибку времени выполнения, оконечную в местоположении ошибки. Для данного пути к выполнению Polyspace подсвечивает первое вхождение ошибки времени выполнения как красная или оранжевая проверка и исключает тот путь из фактора. Поэтому:

  • После красной проверки Polyspace не анализирует остающийся код в том же осциллографе как проверка.

  • После оранжевой проверки Polyspace анализирует остающийся код. Но это рассматривает только уменьшаемое подмножество путей к выполнению, которые не содержали ошибку времени выполнения. Поэтому, если зеленая проверка происходит на операции после оранжевой проверки, это означает, что операция не вызывает ошибку времени выполнения только для этого уменьшаемого набора путей к выполнению.

    Исключения к этому поведению могут произойти. Например:

Путь, содержащий ошибку времени выполнения, отключен по следующим причинам:

  • Состояние программы неизвестно следующий за ошибкой. Например, после Незаконно разыменованной ошибки указателя на операции x=*ptr, значение x неизвестно.

  • Можно рассмотреть ошибку максимально рано в коде, потому что первую ошибку на пути к выполнению показывают в результатах верификации.

  • Вы не должны рассмотреть и затем зафиксировать или выровнять по ширине тот же результат несколько раз. Например, рассмотрите эти операторы, где вертикальный замещающий знак представляет код в который переменная i не изменяется.

    x = arr[i];
    .
    .
    y = arr[i];
    Если апельсин За пределы проверка индекса массива появляется на x=arr[i], это означает тот i может найтись вне границ массивов. Вы не хотите рассматривать другую оранжевую проверку на y=arr[i] являясь результатом той же причины.

Используйте эти два правила, чтобы изучить ваши проверки. Следующие примеры показывают, как два правила могут привести к проверкам, которые могут вводить в заблуждение, когда просматривается из контекста. Изучите примеры ниже полностью к практике, рассмотрев регистрации контекста остающегося кода.

Код после Красной проверки

Следующий пример показывает то, что происходит после красной проверки:

void red(void)
{
int x;
x = 1 / x ;
x = x + 1;
}

Когда верификация Polyspace достигает деления xX еще не был инициализирован. Поэтому программное обеспечение генерирует красный Non-initialized local variable проверяйте на x.

Пути к выполнению вне деления x останавливаются. Никакие чеки не генерируются для оператора x = x + 1;.

Зеленая проверка после оранжевой проверки

Следующий пример показывает, как зеленая проверка может следовать из предыдущей оранжевой проверки. Оранжевая проверка отключает пути к выполнению, которые содержат ошибку. Зеленая проверка на операции после оранжевой проверки означает, что операция не вызывает ошибку времени выполнения только для остающихся путей к выполнению.

extern int Read_An_Input(void);
void propagate(void)
{
	int x;
	int y[100];
	x = Read_An_Input();
	y[x] = 0;
	y[x] = 0;
}

В этой функции:

  • x присвоен возвращаемое значение Read_An_Input. После этого присвоения программное обеспечение оценивает область значений x как [-2^31, 2^31-1]

  • Первый y[x]=0; показывает Out of bounds array index ошибка, потому что x может иметь отрицательные величины.

  • После первого y[x]=0;, от размера y, программное обеспечение оценивает x быть в области значений [0,99].

  • Второй y[x]=0; показывает зеленую проверку потому что x находится в диапазоне [0,99].

Серая проверка после оранжевой проверки

Следующий пример показывает, как серая проверка может следовать из предыдущей оранжевой проверки.

Рассмотрите следующий пример:

extern int read_an_input(void);

void main(void)
{
	int x;
	int y[100];
	x = read_an_input();
	y[x] = 0; 
	y[x-1] = (1 / x) + x ;
	if (x == 0)
		y[x] = 1;
}
 От серой проверки можно проследить назад можно следующим образом:

  • Линия y[x]=1; недостижимо.

  • Поэтому тест, чтобы оценить, ли x = 0 является всегда ложным.

  • Возвращаемое значение read_an_input() никогда не равно 0.

Однако read_an_input может возвратить любое значение в полной целочисленной области значений, таким образом, это не правильное объяснение.

Вместо этого рассмотрите продвижение пути к выполнению к коду Грея:

  • Оранжевый Out of bounds array index проверяет y[x]=0; средние значения, что последующие линии имеют дело с x в [0,99].

  • Оранжевый Division by Zero проверяет деление x средние значения, что x не может быть равно 0 на последующих линиях. Поэтому следующий за той линией, x находится в [1,99].

  • Поэтому x никогда не равно 0 в if условие. Кроме того, доступ к массиву через y[x-1] показывает зеленую проверку.

Красная проверка после оранжевой проверки

Следующий пример показывает, как красная ошибка может показать ошибку, которая произошла на предыдущих линиях.

%% file1.c %% 

void f(int); 
int read_an_input(void); 

int main()  { 
    int x,old_x; 
    x = read_an_input();
    old_x = x; 
    if (x<0 || x>10) 
      return 1; 
    f(x); 
    x = 1 / old_x; 
    // Red Division by Zero
    return 0;    
} 
%% file2.c %% 

#include <math.h> 

void f(int a) { 
    int tmp; 
    tmp = sqrt(0-a); 
} 

Красная проверка происходит на x=1/old_x; в file1.c из-за следующей последовательности шагов во время верификации:

  1. Когда x присвоен old_x в file1.c, верификация принимает тот x и old_x имейте полный спектр целого числа, которое является [-2^31 , 2^31-1].

  2. После if пункт в file1.cX находится в [0,10]. Поскольку x и old_x равны, Polyspace рассматривает тот old_x находится в [0,10] также.

  3. Когда x передается f в file1.c, единственное возможное значение, что x может иметь 0. Все другие значения приводят к исключению на этапе выполнения в file2.c, это - tmp = sqrt(0–a);.

  4. Красная ошибка происходит на x=1/old_x; в file1.c потому что программное обеспечение принимает old_x быть 0 также.

Красные регистрации недостижимого кода

Программа автоматического доказательства кода может иногда показывать красные регистрации кода, который, как предполагается, является недостижимым и серым. При распространении переменных диапазонов Программа автоматического доказательства Кода иногда делает приближения. В создании этих приближений Программа автоматического доказательства Кода может рассмотреть в противном случае недостижимую ветвь как достижимую. Если ошибка появляется в той недостижимой ветви, это окрашено в красный.

Рассмотрите оператор:

if (test_var == 5) {
  // Code Section
}
Если test_var не имеет значения 5, if ветвь недостижима. Если Программа автоматического доказательства Кода делает приближение из-за который test_var получает значение 5, ветвь теперь достижима и может показать проверки других цветов.

Используйте этот рисунок, чтобы изучить эффект приближений. Из-за приближений цвет проверки, который выше, может заменить цвета ниже. Проверка, которая должна быть красной или зеленой (указание на определенную ошибку или определенное отсутствие ошибки) может стать оранжевой, потому что переменная получает дополнительные значения, которые не могут произойти во время выполнения. Проверка, которая должна быть серой, может показать красные, зеленые и оранжевые проверки, потому что Программа автоматического доказательства Кода рассматривает недостижимую ветвь как достижимую.

Похожие темы