Верификация Polyspace® перестала работать во время фазы компиляции с сообщением о неопределенных идентификаторах.
Сообщение указывает, что Polyspace не может найти определение переменной. Поэтому это не может идентифицировать тип переменной.
Исходный код, который вы предоставили, не содержит определение переменной. Например, переменная задана во включать файле, который не может найти Polyspace.
Если вы, #include
-d включать файл в вашем исходном коде, но не добавил его в ваш проект Polyspace, вы видите, что предыдущее предупреждает:
Warning: could not find include file "my_include.h"
Если определение переменной происходит во включать файле, добавьте папку, которая содержит включать файл.
В пользовательском интерфейсе десктопных решений Polyspace добавьте папку в свой проект.
Для получения дополнительной информации смотрите, Добавляют Исходные файлы для Анализа в Пользовательском интерфейсе Polyspace.
В командной строке используйте флаг -I
с командой polyspace-bug-finder
.
Для получения дополнительной информации смотрите -I
.
Переменная представляет ключевое слово, которое ваш компилятор распознает, но не является частью стандарта 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
.