Верификация Polyspace® перестала работать во время фазы компиляции с сообщением о неопределенных идентификаторах.
Сообщение указывает, что Polyspace не может найти определение переменной. Поэтому это не может идентифицировать тип переменной.
Исходный код, который вы предоставили, не содержит определение переменной. Например, переменная задана во включать файле, который не может найти Polyspace.
Если вы #include- d включать файл в вашем исходном коде, но не добавил его в ваш проект Polyspace, вы видите, что предыдущее предупреждает:
Warning: could not find include file "my_include.h"
Если определение переменной происходит во включать файле, добавьте папку, которая содержит включать файл.
В пользовательском интерфейсе десктопных решений Polyspace добавьте папку в свой проект.
Для получения дополнительной информации смотрите, Добавляют Исходные файлы для Анализа в Пользовательском интерфейсе Polyspace (Polyspace Code Prover).
В командной строке используйте флаг -I с polyspace-code-prover-server команда.
Для получения дополнительной информации смотрите -I.
Переменная представляет ключевое слово, которое ваш компилятор распознает, но не является частью стандарта ANSI® C. Поэтому Polyspace не распознает его.
Например, некоторые компиляторы интерпретируют __SP как ссылка на указатель вершины стека.
Если переменная представляет ключевое слово, что Polyspace не распознает, заменяет или удаляет ключевое слово из вашего исходного кода или предварительно обработанного кода.
Если вы удаляете или заменяете ключевое слово из предварительно обработанного кода, можно избежать ошибки компиляции при сохранении исходного кода в целости. Можно выполнить одно из следующих действий:
Замените или удалите каждое отдельное неизвестное ключевое слово с помощью аналитической опции. Замените специфичное для компилятора ключевое слово на эквивалентное ключевое слово от ANSI C Стандарт.
Для получения информации об аналитической опции смотрите Preprocessor definitions (-D).
Объявите неизвестные ключевые слова в отдельном заголовочном файле с помощью #define директивы. Укажите что заголовочный файл с помощью аналитической опции.
Для получения информации об аналитической опции смотрите Include (-include). Для демонстрационного заголовочного файла смотрите, Собирают Параметры компиляции Эффективно.
#ifdef ОператорыПеременная объявляется в ветви #ifdef директива препроцессору. Например, объявление переменной macro_namemax_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 операторы.