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