Внешние ограничения для анализа Polyspace

Для более точного анализа с 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

Отображает информацию о переменной или функции.

Для примера статические переменные отображения static. Незакрытые функции отображают unused.

<function name="funcName" attributes="unused" ...>
Data TypeОтображает тип переменной.
<scalar name="arg1" complete_type="int32" ...>
Main Generator Called

Применяется только для пользовательских функций.

Определяет, вызывает ли основной генератор функцию:

  • MAIN GENERATOR - Главный генератор может вызвать эту функцию, в зависимости от значения -functions-called-in-loop (C) или -main-generator-calls (C++) параметр.

  • NO - Главный генератор не вызывает эту функцию.

  • YES - Основной генератор вызовет эту функцию.

<function name="funcName" main_generator_called="MAIN_GENERATOR" ...>
Init Mode

Определяет, как программа присваивает область значений переменной:

  • MAIN GENERATOR - Переменная область значений назначается в зависимости от настроек опций основного генератора -main-generator-writes-variables и -no-def-init-glob.

  • IGNORE - Переменная не назначается ни одной области значений, даже если область значений задана.

  • INIT - Переменная назначается заданной областью только при инициализации и сохраняет область значений до первой записи.

  • PERMANENT - Переменная постоянно присваивается заданной области. Если переменная назначена вне этой области значений во время программы, предупреждение не выдается. Используйте globalassert режим, если вам нужно предупреждение.

Пользовательские функции поддерживают только INIT режим.

Функции заглушки поддерживают только PERMANENT режим.

Для верификаций на C глобальные указатели поддерживают MAIN GENERATOR, IGNORE, или INIT режим.

  • MAIN GENERATOR - Указатель следует опциям основного генератора.

  • IGNORE - Указатель не инициализирован

  • INIT - Укажите, имеет ли указатель значение NULL и как выделяется заостренный объект (опции Initialize Pointer и Init Allocated).

<scalar name="arg1" init_mode="INIT" ...>
Init Range

Задает минимальное и максимальное значения для переменной.

Можно использовать ключевые слова min и max для обозначения минимального и максимального значений типа переменной. Для примера, для типа long, min и max соответствуют -2 ^ 31 и 2 ^ 31-1 соответственно.

Можно также использовать шестнадцатеричные значения. Для примера: 0x12..0x100

Для enum переменные, вы не можете задать области значений непосредственно с помощью констант перечислителя. Вместо этого используйте значения, представленные константами.

Для enum переменные, можно также использовать ключевые слова enum_min и enum_max чтобы обозначить минимальное и максимальное значения, которые может взять переменная. Для примера, для enum переменная заданного ниже типа, enum_min 0 и enum_max 5:

enum week{ sunday, monday=0, tuesday, wednesday, thursday, friday, saturday};

<scalar name="arg1" init_range="-1..0"...>
Initialize Pointer

Применимо только к указателям. Включено только при задании Init Mode: INIT.

Указывает, должен ли указатель иметь значение NULL:

  • May-be NULL - Указатель потенциально может быть указателем NULL (или нет).

  • Not Null - Указатель никогда не инициализируется как пустой указатель.

  • Null - указатель инициализирован как NULL.

Примечание

Не применяется к проектам C++. См. «Ограничения спецификации».

<pointer name="arg1" initialize_pointer="Not NULL"...>
Init Allocated

Применимо только к указателям. Включено только при задании Init Mode: INIT.

Определяет, как выделяется заостренный объект:

  • MAIN GENERATOR - Заостренный объект выделяется основным генератором.

  • NONE - Указанный объект не записан.

  • SINGLE - Заостренный объект или первый элемент массива инициализируются.

  • MULTI - Все объекты (или элементы массива) инициализируются.

В сложение для аргументов указателя на упорные функции доступны две другие опции:

  • SINGLE_CERTAIN_WRITE - Заостренный объект или первый элемент массива инициализируется упрямой функцией.

  • MULTI_CERTAIN_WRITE - Все заостренные объекты (или элементы массива) инициализируются упрямой функцией.

Для упрямых функций опции SINGLE и MULTI означает вероятную инициализацию вместо определенной инициализации.

Примечание

Не применяется к проектам C++. См. «Ограничения спецификации».

<pointer name="arg1" init_pointed="MAIN_GENERATOR"...>
# Allocated Objects

Применимо только к указателям.

Задает, на сколько объектов указывает указатель (заостренный объект рассматривается как массив).

Параметр Init Allocated определяет, сколько выделенных объектов фактически инициализировано. Например, рассмотрим этот код:

void func(int *ptr) {
    assert(ptr[0]==1);
    assert(ptr[1]==1);
}
Если вы задаете эти ограничения:

  • ptr имеет Init Allocated значение MULTI и # Allocated Objects установлено на 2,

  • *ptr имеет Init Range значение 1..1,

оба утверждения зеленого цвета. Однако, если вы задаете эти ограничения:

  • ptr имеет Init Allocated значение SINGLE

  • *ptr имеет Init Range значение 1..1,

второе утверждение оранжевого цвета. Только первый объект, который ptr указывает на инициализированное значение 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].

Похожие темы