Вы используете volatile
ключевое слово, информирующее компилятор о том, что значение переменной может измениться в любое время без явной операции записи. Когда вы запускаете анализ, Polyspace® Bug Finder™ делает следующие предположения о изменчивых переменных:
Глобальные переменные летучести
Если вы объявляете глобальную волатильную переменную как const
Polyspace использует значение инициализации переменной или область значений инициализации, если вы используете PERMANENT
Init Mode для ограничения области значений переменной извне. Polyspace использует значение инициализации или область значений для каждого чтения переменной. Смотрите Внешние ограничения для Polyspace Analysis.
Например, в этом коде:
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
не вызывайте дефекта.Для не- const
глобальные переменные волатильности, Polyspace игнорирует значение инициализации переменной, а затем рассматривает вход неизвестным для каждого чтения переменной. Если вы используете PERMANENT
Init Mode для ограничения области значений переменной извне, Polyspace использует эту область для каждого чтения переменной. Смотрите Внешние ограничения для Polyspace Analysis.
Например, в этом коде:
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