exponenta event banner

Неопределенная ошибка идентификатора

Проблема

Проверка Polyspace ® на этапе компиляции завершается сбоем с сообщением о неопределенных идентификаторах.

Сообщение указывает, что Polyspace не может найти определение переменной. Поэтому он не может идентифицировать тип переменной.

Возможная причина: отсутствующие файлы

Указанный исходный код не содержит определения переменной. Например, переменная определяется в файле включения, который Polyspace не может найти.

Если вы #include-d файл включения в исходный код, но не был добавлен в проект Polyspace, отображается предыдущее предупреждение:

Warning: could not find include file "my_include.h"

Решение

Если определение переменной находится во включенном файле, добавьте папку, содержащую включенный файл.

Возможная причина: нераспознанное ключевое слово

Переменная представляет ключевое слово, распознаваемое компилятором, но не являющееся частью стандарта ANSI ® C. Поэтому Polyspace его не признает.

Например, некоторые компиляторы интерпретируют __SP в качестве ссылки на указатель стека.

Решение

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

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

  • Замените или удалите каждое отдельное неизвестное ключевое слово с помощью опции анализа. Замените ключевое слово, специфичное для компилятора, эквивалентным ключевым словом из стандарта ANSI C.

    Сведения о опции анализа см. в разделе Preprocessor definitions (-D).

  • Объявить неизвестные ключевые слова в отдельном файле заголовка с помощью #define директивы. Укажите этот файл заголовка с помощью опции анализа.

    Сведения о опции анализа см. в разделе Include (-include). Пример файла заголовка см. в разделе Эффективное получение параметров компиляции.

Возможная причина: Декларация встроена в #ifdef Заявления

Переменная объявляется в ветви #ifdef macro_name директива препроцессора. Например, объявление переменной max_power происходит следующим образом:

#ifdef _WIN32
  #define max_power 31
#endif

В цепочке инструментов компиляции может учитываться макрос macro_name как неявно определено и выполнить #ifdef филиал. Однако компиляция Polyspace может не считать макрос определенным. Следовательно, #ifdef ветвь не выполнена, и переменная max_power не объявлен.

Решение

Чтобы обойти ошибку компиляции, выполните одно из следующих действий.

  • Используйте параметры Target & Compiler для непосредственного указания компилятора. Например, для эмуляции компилятора Visual C++ ® установите для компилятора значениеvisual12.0. См. раздел Цель и компилятор.

  • Явное определение макроса с помощью опции Preprocessor definitions (-D).

Примечание

При создании Polyspace путем трассировки команд построения большинство параметров Target & Compiler устанавливаются автоматически.

Возможная причина: Проект, созданный из неэкологической сборки

Это может быть возможной причиной, только если неопределенный идентификатор находится в assert оператор (или эквивалентный макрос Visual C++, такой как ASSERT или VERIFY).

Как правило, эту ошибку можно обнаружить следующим образом. Проект Polyspace создается из системы построения в режиме, отличном от режима отладки. При выполнении анализа проекта возникает ошибка компиляции из неопределенного идентификатора в assert заявление. Вы обнаружите, что идентификатор my_identifier определяется в #ifndef NDEBUG оператор, например, следующим образом:

#ifndef NDEBUG
int my_identifier;
#endif

Стандарт C указывает, что, когда NDEBUG макрос определен, все инструкции assert должны быть отключены.

Большинство IDE определяют NDEBUG макро в их системах построения. При построении исходного кода в среде IDE в режиме, отличном от отладки, код в #ifndef NDEBUG оператор удаляется во время предварительной обработки. Например, в предыдущем примере my_identifier не определен. Если my_identifier встречается только в операторах assert, также не используется, потому что NDEBUG отключает утверждения. Отсутствуют ошибки компиляции из неопределенных идентификаторов, и система построения успешно выполняется.

Polyspace не отключает assert заявления, даже если NDEBUG макрос определен, так как программа использует assert внутренние заявления для улучшения проверки.

При создании проекта Polyspace из системы сборки, если система сборки определяет NDEBUG макрос также определен для проекта Polyspace. Polyspace удаляет код в #ifndef NDEBUG оператор во время предварительной обработки, но не отключает assert заявления. Если assert операторы в коде зависят от кода в #ifndef NDEBUG , могут возникать ошибки компиляции.

В предыдущем примере:

  • Определение my_identifier удаляется во время предварительной обработки.

  • assert операторы не отключены. Когда my_identifier используется в assert инструкция, вы получаете ошибку из-за неопределенного идентификатора my_identifier.

Решение

Чтобы обойти эту проблему, создайте проект Polyspace из системы сборки в режиме отладки. При запуске системы сборки в режиме отладки NDEBUG не определен. При создании проекта Polyspace из этого построения NDEBUG не определен для проекта Polyspace.

В зависимости от параметров проекта используйте опцию, которая позволяет строить в режиме отладки. Например, если ваша система сборки gcc-на основе можно определить DEBUG макро и недефинирование NDEBUG:

gcc -DDEBUG=1 -UNDEBUG *.c

Кроме того, можно отключить assert операторы в предварительно обработанном коде с помощью опции Preprocessor definitions (-D). Однако Polyspace не сможет эмулировать assert заявления.