exponenta event banner

Глобальной переменной не присвоено значение в коде инициализации

Глобальной переменной не присвоено значение в разделе инициализации программы

Описание

Эта проверка определяет, все ли глобальные переменные, отличные от const (и локальные статические переменные), явно присваиваются значению в объявлении или в разделе кода, обозначенном как код инициализации.

Для указания конца кода инициализации введите строку.

#pragma polyspace_end_of_init
в main функция. Код инициализации начинается с начала main и продолжается до этой прагматики. Чтобы включить эту проверку, используйте опцию Check that global variables are initialized after warm reboot (-check-globals-init).

Проверка глобальной переменной выполняется следующим образом:

  • Красный цвет, если переменная не инициализирована вообще, либо явно в объявлении, либо в коде инициализации (или инициализирована в мертвом коде в коде инициализации).

  • Оранжевый, если переменная не инициализирована на определенных путях выполнения через код инициализации. Например, переменная инициализируется в if ветвь условного оператора, но не else филиал.

  • Зеленый, если переменная всегда инициализируется после завершения выполнения кода инициализации.

При теплой перезагрузке, чтобы сэкономить время, сегмент данных программы, который может содержать переменные значения из предыдущего состояния, не загружается. Вместо этого программа должна явным образом инициализировать все переменные, не являющиеся const, перед выполнением. Эта проверка проверяет, что все глобальные переменные, отличные от const, действительно инициализируются при теплой перезагрузке.

Диагностика этой проверки

Просмотрите все экземпляры неинициализированной или, возможно, неинициализированной переменной на панели «Доступ к переменной» (или на панели «Глобальные переменные» в веб-интерфейсе Polyspace ® Access). Проверьте, есть ли какая-либо из ссылок перед прагматикойpolyspace_end_of_init встречается.

См. также раздел Доступ к переменным.

Примеры

развернуть все

int aVar;
const int aConst = -1;
int anotherVar;

int main() {
      aVar = aConst;
#pragma polyspace_end_of_init
      return 0;
}

В этом примере глобальная переменная aVar инициализируется в разделе кода инициализации, но переменная anotherVar не является.

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;
}

Проверка на var оранжевый, потому что var может оставаться неинициализированным, когда if и else if операторы пропускаются.

int aVar;
int anotherVar;

int checkSomething();

init0() {
  if (checkSomething())
      aVar = 0;
}
init1() {
  anotherVar = aVar; //Orange check: Non-initialized variable
}
main() {
  init0();
  init1();
#pragma polyspace_end_of_init
}

В этом примере обе переменные aVar и anotherVar отображаются инициализированными (зеленая проверка). Однако следующий путь приводит к тому, что обе переменные не инициализируются:

  • if оператор в init0 пропускается, что приводит к aVar не инициализирован.

  • Если aVar не инициализирован, anotherVar также не инициализирован (инициализирован с непредсказуемыми значениями).

Проблема выделяется другой проверкой, Non-initialized variable. Чек оранжевый на этой строке:

anotherVar = aVar;
После оранжевой проверки, путь выполнения, где aVar не инициализирован удален из рассмотрения. Это удаление приводит к anotherVar отображается как инициализированный (зеленый) в соответствии со всеми проверками и aVar отображается как инициализированный (зеленый) в соответствии с проверкой Глобальная переменная не присвоена значение в коде инициализации.

Чтобы избежать ошибочной интерпретации зеленых результатов для инициализации:

Проверить информацию

Группа: Поток данных
Язык: C
Акроним: GLOBAL_SET_AT_INITIALIZATION