Вы используете volatile
ключевое слово, чтобы сообщить компилятору, что значение переменной силы изменяется в любое время без явной операции записи. Когда вы запускаете анализ, Polyspace® Bug Finder™ делает эти предположения об энергозависимых переменных:
Глобальные энергозависимые переменные
Если вы объявляете глобальную энергозависимую переменную как const
, Polyspace использует значение инициализации переменной или области значений инициализации, если вы используете PERMANENT
Init Mode, чтобы ограничить область значений переменной внешне. Polyspace использует значение инициализации или область значений для каждого чтения переменной. Смотрите Внешние Ограничения для Анализа Polyspace.
Например, в этом коде:
const volatile volatile_var; // Global variable initialized to 0
const volatile volatile_var_10=10;
const volatile volatile_var_drs=3; // Variable constrained to range [-5 .. 5]
int func(void){
int i= 10 % volatile_var; // Defect
int j= 10 % volatile_var_10; // No defect
int k= 10 % volatile_var_drs; // Defect
return i+j+k;
}
volatile_var
поскольку это инициализируется, чтобы обнулить. Polyspace обнаруживает Integer division by zero для volatile_var_drs
потому что это внешне ограничивается к области значений [-5.. 5]. Все чтения volatile_var_10
не вызовите дефект.Для non-const
глобальные энергозависимые переменные, Polyspace игнорирует значение инициализации переменной, и затем считает вход неизвестным для каждого чтения переменной. Если вы используете PERMANENT
Init Mode, чтобы ограничить область значений переменной внешне, Polyspace использует эту область значений для каждого чтения переменной. Смотрите Внешние Ограничения для Анализа Polyspace.
Например, в этом коде:
volatile volatile_var; // Global variable initialized to 0
volatile volatile_var_drs=3; // Variable constrained to range [-5 .. 5]
int func(void){
int i= 10 % volatile_var; // No defect
int j= 10 % volatile_var_drs; // Defect
return i+j;
}
Polyspace обнаруживает дефект Integer division by zero для volatile_var_drs
потому что это внешне ограничивается к области значений [-5.. 5]. Все чтения volatile_var
не вызовите дефект.
Локальные энергозависимые переменные
Polyspace игнорирует значение инициализации локальных энергозависимых переменных, и затем считает вход неизвестным для каждого чтения переменной. Например, в этом коде:
int foo(void){
volatile var=0;
return 1/var; // No defect
}
За счет возможно более длинного времени выполнения можно выполнить более исчерпывающий анализ, где Polyspace рассматривает все значения для каждого чтения энергозависимой переменной. Смотрите Run stricter checks considering all values of system inputs (-checks-using-system-input-values)
. Когда вы используете эту опцию, чтобы анализировать все предыдущие примеры кода, Polyspace обнаруживает дополнительные дефекты Integer division by zero на линиях, помеченных комментарием // No defect
, включая для локального энергозависимого переменного примера.
Аналитические предположения Bug Finder | Входные параметры в Polyspace Bug Finder