Этот пример показывает, как определить, связаны ли переменные в произвольной операции в вашем коде ранее.
Например, рассмотрите эту операцию:
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.