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

Проблема

Верификация 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, чтобы непосредственно задать ваш компилятор. Например, чтобы эмулировать Визуальный C ++® компилятор, установите Compiler на 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 макрос задан, все операторы контроля должны быть отключены.

Большинство ИД задает NDEBUG макрос в их системах сборки. Когда вы создаете свой исходный код в вашем IDE в нережиме отладки, код в #ifndef NDEBUG оператор удален во время предварительной обработки. Например, в предыдущем примере, my_identifier не задан. Если my_identifier происходит только в операторах контроля, это не используется также, потому что 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 операторы.