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