Check that global variables are initialized after warm reboot (-check-globals-init)

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

Описание

Эта опция влияет на анализ Программы автоматического доказательства Кода только.

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

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

#pragma polyspace_end_of_init
в main функция (только однажды). Код инициализации запускается с начала main и продолжается до этой прагмы.

Поскольку компиляторы игнорируют нераспознанные прагмы, присутствие этой прагмы не влияет на выполнение программы.

Установите опцию

Пользовательский интерфейс (только десктопные решения): В вашей настройке проекта опция находится на узле Check Behavior.

Командная строка: Используйте опцию -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;
}

Настройки

On

Polyspace проверяет, инициализируются ли все глобальные переменные в обозначенном коде инициализации. Код инициализации начинает с начала с main и продолжает до прагмы polyspace_end_of_init.

О результатах сообщают с помощью проверки Global variable not assigned a value in initialization code (Polyspace Code Prover Access).

От (значения по умолчанию)

Polyspace не проверяет на инициализацию глобальных переменных в обозначенной секции кода.

Однако верификация продолжает проверять, инициализируется ли переменная во время использования. О результатах сообщают с помощью проверки Non-initialized variable (Polyspace Code Prover Access).

Зависимости

Можно использовать эту опцию и определять раздел кода как код инициализации только если:

  • Ваша программа содержит main функционируйте и вы используете опцию Verify whole application (Polyspace Code Prover) (неявно набор по умолчанию в командной строке).

  • Вы устанавливаете Source code language (-lang) toc.

Обратите внимание на то, что прагма должна появиться только однажды в main функция. Прагма может появиться прежде или после объявлений переменной, но должна появиться после определений типа (typedefS.

Вы не можете использовать эту опцию со следующими опциями:

Советы

  • Можно использовать эту опцию наряду с опцией Verify initialization section of code only (-init-only-mode) проверять код инициализации прежде, чем проверять остающуюся программу.

    Этот подход обладает следующими преимуществами по сравнению с проверкой целого кода в одном запуске:

    • Ошибки времени выполнения в коде инициализации могут делать недействительным анализ остающегося кода. Можно осуществить сравнительно более быструю проверку кода инициализации прежде, чем проверять остающуюся программу.

    • Можно рассмотреть результаты средства проверки Global variable not assigned a value in initialization code (Polyspace Code Prover Access) относительно легко.

      Рассмотрите этот пример. На 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
          }
      }
      Проверка является красной, если вы проверяете один только код инициализации и не инициализируете переменную в первой итерации цикла. Чтобы избежать этих неправильных красных или оранжевых проверок, не помещайте прагму в цикл.

    • Чтобы определить инициализацию структуры, регулярный анализ Программы автоматического доказательства Кода только рассматривает поля, которые используются.

      Если вы проверяете код инициализации только с помощью опции Verify initialization section of code only (-init-only-mode) (Polyspace Code Prover), анализ покрывает только фрагмент кода и не может определить, используется ли переменная вне этого фрагмента. Поэтому проверки на инициализацию рассматривают все поля структуры, или используемый или нет.

Информация о командной строке

Параметр: -check-globals-init
Значение по умолчанию: Off
Пример (Программа автоматического доказательства Кода): Polyspace Code Prover - источники file_name - check-globals-init
Пример (Сервер Программы автоматического доказательства Кода): сервер программы автоматического доказательства полипробела кода - источники file_name - check-globals-init
Введенный в R2020a