Global variable not assigned a value in initialization code

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

Описание

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

Чтобы указать на конец кода инициализации, вы вводите линию

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

Проверка на глобальной переменной:

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

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

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

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

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

Просмотрите все экземпляры неинициализированного или возможно неинициализированной переменной на панели Variable Access (или панели Global Variables в веб-интерфейсе 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 появление как инициализированный (зеленый) согласно проверке Global variable not assigned a value in initialization code.

Постараться не вводить в заблуждение интерпретацию зеленых результатов для инициализации:

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

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