-check-globals-init
)Проверяйте, что глобальные переменные являются присвоенными значениями в спроектированном коде инициализации
Эта опция влияет на анализ Программы автоматического доказательства Кода только.
Укажите, что Polyspace® должен проверять, инициализируются ли все глобальные переменные неconst (и локальные статические переменные) явным образом в объявлении или в разделе кода, отмеченного как код инициализации.
Чтобы указать на конец кода инициализации, вы вводите линию
#pragma polyspace_end_of_init
main
функция (только однажды). Код инициализации запускается с начала main
и продолжается до этой прагмы.Поскольку компиляторы игнорируют нераспознанные прагмы, присутствие этой прагмы не влияет на выполнение программы.
Пользовательский интерфейс (только десктопные решения): В вашей настройке проекта опция находится на узле Check Behavior.
Командная строка: Используйте опцию -check-globals-init
. Смотрите информацию о командной строке.
В горячей перезагрузке, чтобы сэкономить время, не загружается bss сегмент программы, которая может содержать значения переменных от предыдущего состояния. Вместо этого программа, как предполагается, явным образом инициализирует все переменные неconst без значений по умолчанию перед выполнением. Можно использовать эту опцию, чтобы разграничить код инициализации и проверить, что все глобальные переменные неconst действительно инициализируются в горячей перезагрузке.
Например, в этом простом примере, глобальная переменная aVar
инициализируется в секции кода инициализации, но переменной anotherVar
не.
int aVar; const int aConst = -1; int anotherVar; int main() { aVar = aConst; #pragma polyspace_end_of_init return 0; }
Polyspace проверяет, инициализируются ли все глобальные переменные в обозначенном коде инициализации. Код инициализации начинает с начала с main
и продолжает до прагмы polyspace_end_of_init
.
О результатах сообщают с помощью проверки Global variable not assigned a value in initialization code
.
Polyspace не проверяет на инициализацию глобальных переменных в обозначенной секции кода.
Однако верификация продолжает проверять, инициализируется ли переменная во время использования. О результатах сообщают с помощью проверки Non-initialized variable
.
Можно использовать эту опцию и определять раздел кода как код инициализации только если:
Ваша программа содержит main
функционируйте и вы используете опцию Verify whole application
(неявно установите по умолчанию в командной строке).
Вы устанавливаете Source code language (-lang)
toc
.
Обратите внимание на то, что прагма должна появиться только однажды в main
функция. Прагма может появиться прежде или после объявлений переменной, но должна появиться после определений типа (typedef
S.
Вы не можете использовать эту опцию со следующими опциями:
Можно использовать эту опцию наряду с опцией Verify initialization section of code only (-init-only-mode)
проверять код инициализации прежде, чем проверять остающуюся программу.
Этот подход обладает следующими преимуществами по сравнению с проверкой целого кода в одном запуске:
Ошибки времени выполнения в коде инициализации могут делать недействительным анализ остающегося кода. Можно осуществить сравнительно более быструю проверку кода инициализации прежде, чем проверять остающуюся программу.
Можно рассмотреть результаты средства проверки Global variable not assigned a value in initialization code
относительно легко.
Рассмотрите этот пример. На var
существует оранжевая проверка потому что
var
может остаться неинициализированным когда if
и else if
операторы пропущены.
int var;
int checkSomething(void);
int checkSomethingElse(void);
int main() {
int local_var;
if(checkSomething())
{
var=0;
}
else if(checkSomethingElse()) {
var=1;
}
#pragma polyspace_end_of_init
var=2;
local_var = var;
return 0;
}
Рассмотреть эту проверку и понять когда x
может быть не инициализирован, необходимо просмотреть все экземпляры x
на панели Variable Access. Если вы проверяете один только код инициализации, только код полужирным проверяется, и необходимо просмотреть только экземпляры в коде инициализации.
Проверка только так же хороша как ваше размещение прагмы polyspace_end_of_init
. Например:
Поместите прагму только после того, как код инициализации закончится.
В противном случае, переменная сила кажутся ложно неинициализированными.
Попытайтесь поместить прагму непосредственно в main
функция, то есть, вне блока. Если вы помещаете прагму в блок, проверка рассматривает только те пути, которые заканчиваются в блоке.
Всем путям, которые заканчиваются в блоке, можно было инициализировать переменную, но пути, которые пропускают блок, могут позволить переменному неинициализированному движению. Если вы действительно помещаете прагму в блок, убедитесь, что это хорошо, если переменная остается неинициализированной вне блока.
Например, в этом примере, переменной var
инициализируется на всех путях, которые заканчиваются в местоположении прагмы. Проверка является зеленой несмотря на то, что if
блокируйтесь может быть пропущен, позволение переменному движению деинициализировало.
int var;
int func();
int main() {
int err = func();
if(err) {
var = 0;
#pragma polyspace_end_of_init
}
int a = var;
return 0;
}
Проблема обнаруживается средством проверки, если вы помещаете прагму после if
концы блока.
Не помещайте прагму в цикл.
Если вы помещаете прагму в цикл, вы видите результаты, которые затрудняют, чтобы интерпретировать. Например, в этом примере, обоих aVar
и anotherVar
инициализируются в одной итерации цикла. Однако прагма только рассматривает первую итерацию цикла, когда это показывает зеленую проверку на инициализацию. Если переменная инициализируется на более поздней итерации, проверка является оранжевой.
int aVar; int anotherVar; void main() { for(int i=0; i<=1; i++) { if(i == 0) aVar = 0; else anotherVar = 0; #pragma polyspace_end_of_init } }
Чтобы определить инициализацию структуры, регулярный анализ Программы автоматического доказательства Кода только рассматривает поля, которые используются.
Если вы проверяете код инициализации только с помощью опции Verify initialization section of code only (-init-only-mode)
, анализ покрывает только фрагмент кода и не может определить, используется ли переменная вне этого фрагмента. Поэтому проверки на инициализацию рассматривают все поля структуры, или используемый или нет.
Параметр:
-check-globals-init |
Значение по умолчанию: 'off' |
Пример (Программа автоматического доказательства Кода):
Polyspace Code Prover - источники |
Пример (Сервер Программы автоматического доказательства Кода):
сервер программы автоматического доказательства полипробела кода - источники |
Global variable not assigned a value in initialization code
| Verify initialization section of code only (-init-only-mode)