Для более точного анализа с Polyspace®можно задать внешние ограничения на:
Глобальные переменные.
Пользовательские функции.
Ограничения на пользовательские функции не применяются к анализу Bug Finder.
Упрямые функции.
Ограничения на упрямые функции не применяются к анализу Bug Finder.
Для получения дополнительной информации см. раздел «Задание внешних ограничений». Частичный список ограничений см. в разделе Ограничения спецификации.
В пользовательском интерфейсе десктопных продуктов Polyspace можно задать ограничения через Constraint Specification окно. Ограничения сохраняются в XML- файл, которую можно повторно использовать для других проектов.
В этой таблице описываются различные столбцы в Constraint Specification окне. Если вы непосредственно редактируете ограничение XML- файла, чтобы задать ограничение (для образца в продуктах Polyspace Server), в этой таблице также отображается соответствие между столбцами в пользовательском интерфейсе и записями в файл XML. XML-запись, выделенная жирным шрифтом, появится в соответствующем столбце Constraint Specification окна.
Столбец | Настройки | Запись Файла XML |
---|---|---|
Name | Отображает список переменных и функций в проекте, для которых можно задать области значений данных. В этом столбце отображаются три элементов меню с возможностью расширения:
|
<function name = "funcName" ...>
<scalar name = "arg1" ...>
<pointer name = "arg2" ...> |
File | Отображает имя исходного файла, содержащего переменную или функцию. |
<file name = "C:\Project1\Sources\file.c" ...> |
Attributes | Отображает информацию о переменной или функции. Для примера статические переменные отображения |
<function name="funcName" attributes="unused" ...> |
Data Type | Отображает тип переменной. |
<scalar name="arg1" complete_type="int32" ...> |
Main Generator Called | Применяется только для пользовательских функций. Определяет, вызывает ли основной генератор функцию:
|
<function name="funcName" main_generator_called="MAIN_GENERATOR" ...> |
Init Mode | Определяет, как программа присваивает область значений переменной:
Пользовательские функции поддерживают только Функции заглушки поддерживают только Для верификаций на C глобальные указатели поддерживают
|
<scalar name="arg1" init_mode="INIT" ...> |
Init Range | Задает минимальное и максимальное значения для переменной. Можно использовать ключевые слова Можно также использовать шестнадцатеричные значения. Для примера: Для Для enum week{ sunday, monday=0, tuesday, wednesday, thursday, friday, saturday}; |
<scalar name="arg1" init_range="-1..0"...> |
Initialize Pointer | Применимо только к указателям. Включено только при задании Init Mode: Указывает, должен ли указатель иметь значение NULL:
Примечание Не применяется к проектам C++. См. «Ограничения спецификации». |
<pointer name="arg1" initialize_pointer="Not NULL"...> |
Init Allocated | Применимо только к указателям. Включено только при задании Init Mode: Определяет, как выделяется заостренный объект:
В сложение для аргументов указателя на упорные функции доступны две другие опции:
Для упрямых функций опции Примечание Не применяется к проектам C++. См. «Ограничения спецификации». |
<pointer name="arg1" init_pointed="MAIN_GENERATOR"...> |
# Allocated Objects | Применимо только к указателям. Задает, на сколько объектов указывает указатель (заостренный объект рассматривается как массив). Параметр Init Allocated определяет, сколько выделенных объектов фактически инициализировано. Например, рассмотрим этот код: void func(int *ptr) { assert(ptr[0]==1); assert(ptr[1]==1); }
оба утверждения зеленого цвета. Однако, если вы задаете эти ограничения:
второе утверждение оранжевого цвета. Только первый объект, который Примечание Не применяется к проектам C++. См. «Ограничения спецификации». |
<pointer name="arg1" number_allocated="10"...> |
Global Assert | Определяет, выполнять ли проверку типа assert для переменной при глобальной инициализации и после каждого назначения. |
<scalar name="glob" global_assert="YES"...> |
Global Assert Range | Задает минимальное и максимальное значения для области значений, который вы хотите проверить. |
<scalar name="glob" assert_range="0..200"...> |
Comment | Примечания, что вы вводите, для примера, обоснование для значений DRS. |
<scalar name="glob" comment="Speed Range"...> |
Вы не можете задать следующие ограничения:
Указатели C++ не могут быть ограничены:
В C++ нельзя ограничивать аргументы указателя на функции. Функции, которые имеют только аргументы указателя, не появляются в интерфейсе спецификации ограничений.
Из-за полиморфизма указатель C++ может указывать на объекты нескольких классов в иерархии классов и может потребовать вызова различных конструкторов. Предварительный анализ спецификации ограничений не может определить, какой тип объекта будет ограничиваться или какой конструктор будет вызываться.
Ограничениями не могут быть зависимости:
Вы не можете задать ограничение, которое связывает возврат значение функции с ее входами. Для ограничений можно задать только постоянную область значений.
Несколько областей значений невозможно:
Вы не можете задать несколько области значений для ограничения. Например, вы не можете указать, что аргумент функции имеет значение -1 или значение в области значений [1100]. Вместо этого задайте область значений [-1,100] или выполните два отдельных анализа, один раз со значением -1 и один раз с областью значений [1100].