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

Проблема

Верификация 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.