-check-globals-init)Проверьте, что глобальным переменным присвоены значения в разработанном коде инициализации.
Этот параметр влияет только на анализ программы проверки кода.
Укажите, что Polyspace ® должен проверять явную инициализацию всех глобальных переменных, отличных от const (и локальных статических переменных), в объявлении или в разделе кода, помеченном как код инициализации.
Для указания конца кода инициализации введите строку.
#pragma polyspace_end_of_init
main функция (только один раз). Код инициализации начинается с начала main и продолжается до этой прагматики.Поскольку компиляторы игнорируют нераспознанные прагматики, наличие этой прагматики не влияет на выполнение программы.
Пользовательский интерфейс (только для настольных ПК): в конфигурации проекта параметр находится в узле Проверить поведение.
файл командной строки и параметров: Использовать параметр -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) кому C.
Обратите внимание, что прагматика должна появиться только один раз в 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 на панели «Доступ к переменной». При проверке только кода инициализации проверяется только код, выделенный полужирным шрифтом, и необходимо просматривать только экземпляры кода инициализации.
Чек только так хорошо, как ваше размещение pragma 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 |
| По умолчанию: Откл. |
Пример (проверка кода):
polyspace-code-prover -sources |
Пример (сервер проверки кода):
polyspace-code-prover-server -sources |
Global variable not assigned a value in initialization code | Verify initialization section of code only (-init-only-mode)