Этот пример показывает, как определить, связаны ли переменные в произвольной операции в вашем коде ранее.
Например, рассмотрите эту операцию:
return(var1 - var2);
В вашем IDE можно поместить точки останова, чтобы остановить выполнение и определить значения var1 и var2
для определенного запуска.
В Polyspace®, после того, как вы анализируете свой код, подсказки на var1 и var2 покажите их область значений значений для всех запусков, что верификация рассматривает.
Однако информации об области значений недостаточно, чтобы определить, связаны ли переменные. Необходимо выполнить дополнительные шаги, чтобы определить отношение.
В этом примере считайте операцию подсвеченной. Вы не можете сказать от быстрого взгляда если wheel_speed и wheel_speed_old связаны. Однако эта информация крайне важна, чтобы изучить возможную ошибку в последующих операциях.
#define MAX_SPEED 120
#define TEST_TIME 10000
int wheel_speed;
int wheel_speed_old;
int out;
int update_speed(int new_speed) {
if(new_speed < MAX_SPEED)
return new_speed;
else
return MAX_SPEED;
}
void increase_speed(void)
{
int temp, index=1;
while(index<TEST_TIME) {
temp = wheel_speed - wheel_speed_old;
if(index > 1) {
if (temp < 0)
out = 1;
else
out = 0;
}
wheel_speed_old = update_speed(wheel_speed);
index++;
}
}
Изучать, почему вам нужно отношение между wheel_speed и wheel_speed_old и как найти отношение:
Ограничьте область значений переменной wheel_speed к начальному значению 0.. 100 для анализа Polyspace. Используйте опцию анализа Constraint setup (-data-range-specifications).
Запустите анализ этого кода и откройте результаты. Выберите серую проверку Unreachable code.
if (temp < 0)
out = 1;Проверка указывает что переменная temp является неотрицательным. temp прибывает из предыдущей операции:
temp = wheel_speed - wheel_speed_old;
Смотрите область значений wheel_speed и wheel_speed_old. Установите свой курсор на эти переменные. Вы видите эти области значений:
wheel_speed: 0..100
wheel_speed_old: Полный спектр int переменная.
Это не ясно из этих областей значений почему wheel_speed - wheel_speed_old является всегда неотрицательным. Необходимо узнать, связаны ли переменные так или иначе.
Вставьте прагму перед линией, где вы хотите переменное отношение. Добавьте следующую линию незадолго до if(temp < 0):
#pragma Inspection_Point wheel_speed wheel_speed_old
Повторно выполните анализ и откройте результаты. Установите свой курсор на wheel_speed_old в линии, которую вы добавили.
Подсказка подтверждает тот wheel_speed и wheel_speed_old связаны:
wheel_speed_old <= wheel_speed
Чтобы найти, как эти две переменные были связаны, ищите все экземпляры wheel_speed_old. На панели Source щелкните правой кнопкой по wheel_speed_old и выберите Search For All References.
Просмотрите экземпляры. В этом случае вы видите, что линия, которая связывает wheel_speed и wheel_speed_old :
wheel_speed_old = update_speed(wheel_speed);
while цикл, wheel_speed_old меньше чем или равно wheel_speed_old. Ветвь if(index > 1) вводится от второго запуска вперед. В этой ветви, отношении между wheel_speed и wheel_speed_old отражается посредством серой проверки Unreachable code.
Совет
Проигнорируйте детали отношения, показанного в подсказке. Используйте подсказку, чтобы подтвердить, связаны ли определенные переменные. Затем поиск инстанцируют переменной, чтобы найти, как они связаны.
Можно использовать прагму Inspection_Point определить отношение между переменными в любой точке в коде. Можно ввести столько переменных, сколько вы хотите в #pragma оператор:
#pragma Inspection_Point var1 var2 ... varn
Попробуйте этот метод на других примерах. Например, выберите Help> Examples> Code_Prover_Example.psprj. Сгруппируйте результаты файлом. В файле single_file_analysis.c, вы видите этот код:
if (output_v7 >= 0) { #pragma Inspection_Point output_v7 s8_ret saved_values[output_v7] = s8_ret; return s8_ret; }
s8_ret в последних двух операторах вы находите что области значений s8_ret отличаются. Узнайте то, что изменилось между этими двумя операторами.Подсказка: подсказка в #pragma оператор указывает что переменная s8_ret связан с переменной output_v7. Отметьте оранжевую проверку, которая уменьшает область значений output_v7.