-check-globals-init
)Проверяйте, что глобальным переменным присвоены значения в разработанном коде инициализации
Эта опция влияет только на анализ Code Prover.
Задайте, что Polyspace® необходимо проверить, все ли неконстатические глобальные переменные (и локальные статические переменные) явно инициализированы при объявлении или в разделе кода, отмеченного как код инициализации.
Чтобы указать конец кода инициализации, вы вводите линию
#pragma polyspace_end_of_init
main
функция (только один раз). Код инициализации начинается с начала main
и продолжается до этой прагмы.Поскольку компиляторы игнорируют непризнанные прагмы, наличие этой прагмы не влияет на выполнение программы.
Пользовательский интерфейс (только для настольных продуктов): В строении проекта опция находится на узле Check Behavior.
Командная строка и файл опций: Используйте опцию -check-globals-init
. См. «Информация о командной строке».
При теплой перезагрузке, чтобы сэкономить время, сегмент bss программы, который может удерживать значения переменных от предыдущего состояния, не загружается. Вместо этого программа должна явным образом инициализировать все неконстовые переменные без значений по умолчанию перед выполнением. Можно использовать эту опцию, чтобы разделить код инициализации и проверить, что все неконстатные глобальные переменные действительно инициализированы при теплой перезагрузке.
Например, в этом простом примере глобальная переменная 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)
на C
.
Обратите внимание, что прагма должна появиться только один раз в main
функция. Прагма может появиться до или после объявлений переменных, но должна появиться после определений типов (typedef
-с).
Вы не можете использовать эту опцию со следующими опциями:
Можно использовать эту опцию наряду с опцией 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 } }
Чтобы определить инициализацию структуры, регулярный анализ Code Prover рассматривает только используемые поля.
Если вы проверяете код инициализации только с помощью опции Verify initialization section of code only (-init-only-mode)
анализ охватывает только фрагмент кода и не может определить, используется ли переменная за пределами этого фрагмента. Поэтому при проверке на инициализацию учитываются все используемые или нет структурные поля.
Параметр:
-check-globals-init |
По умолчанию: Off |
Пример (Code Prover):
Polyspace Code Prover -sources |
Пример (Код Prover Server):
Полипространство -code-prover-server -sources |
Global variable not assigned a value in initialization code
| Verify initialization section of code only (-init-only-mode)