Global variable not assigned a value in initialization code

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

Описание

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

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

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

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

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

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

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

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

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

Просмотрите все образцы неинициализированной или, возможно, неинициализированной переменной на панели Variable Access (или панели Global Variables в Polyspace® Доступ к веб-интерфейсу). Посмотрите, происходит ли какая-либо из ссылок перед прагмой 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 отображается инициализированным (зеленая проверка). Однако следующий путь приводит к тому, что обе переменные не инициализируются:

  • The 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