exponenta event banner

Проверьте, что глобальные переменные инициализируются после теплой перезагрузки (-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 file_name -check-globals-init
Пример (сервер проверки кода): polyspace-code-prover-server -sources file_name -check-globals-init
Представлен в R2020a