Overflow mode for signed integer (-signed-integer-overflows)

Укажите, обернут ли результат переполнения вокруг или усечен

Описание

Эта опция влияет только на анализ Code Prover.

Задайте, является ли Polyspace® флаги со знаком целочисленного переполнения и то, переносит ли анализ результат переполнения или ограничивает его значением extremum.

Задать опцию

Пользовательский интерфейс (только для продуктов): На панели Configuration опция находится на узле Check Behavior под Code Prover Verification.

Командная строка и файл опций: Используйте опцию -signed-integer-overflows. См. «Информация о командной строке» (Polyspace Code Prover).

Зачем использовать эту опцию

Используйте эту опцию, чтобы определить, проверять ли целочисленное переполнение со знаком и определить допущения, которые делает анализ после переполнения.

Настройки

По умолчанию: forbid

forbid

Флаги Polyspace подписаны целочисленным переполнением. Если проверка Overflow для операции:

  • Красный, Polyspace не анализирует оставшийся код в текущих возможностях.

  • Orange, Polyspace анализирует оставшийся код в текущих возможностях. Polyspace считает, что:

    • После положительного Overflow результат операции имеет верхнюю границу. Эта верхняя граница является максимальным значением, разрешенным типом результата.

    • После отрицательного Overflow результат операции имеет нижнюю границу. Эта нижняя граница является минимальным значением, разрешенным типом результата.

Это поведение соответствует стандарту ANSI C (ISO C++).

В следующем коде j имеет значения в область значений [1.. 231-1] перед оранжевым переполнением. Polyspace считает, что j имеет четные значения в области значений   [2 .. 2147483646] после переполнения. Polyspace не анализирует printf() оператор после красного переполнения.

#include<stdio.h>

int getVal();

void func1()
{
    int i = 1;
    i = i << 30;
    // Result of * operation overflows
    i = i * 2;
    // Remaing code in current scope not analyzed
    printf("%d", i);
}
void func2()
{

    int j = getVal();
    if (j > 0) {
        // Range of j: [1..231-1]
        // Result of * operation may overflow
        j = j * 2;
        // Range of j: even values in [2 .. 2147483646]
        printf("%d", j);
    }
}

Обратите внимание, что подсказки к операциям со знаковыми целыми числами показывают (result is truncated) для указания режима анализа. Сообщение появляется, даже если Overflow проверка зеленого цвета.

allow

Polyspace не помечает подписанные целочисленное переполнение. Если операция приводит к переполнению, Polyspace анализирует оставшийся код, но переносит результат переполнения.

В этом коде анализ не помечает никакого переполнения в коде. Однако область значений j оборачивается к четным значениям в области значений [-231.. 2] или [2.. 231-2] и значение i оборачивается к -231.

#include<stdio.h>

int getVal();

void func1()
{
    int i = 1;
    i = i << 30;
    // i = 230
    i = i * 2;
    // i = -231
    printf("%d", i);
}
void func2()
{

    int j = getVal();
    if (j > 0) {
        // Range of j: [1..231-1]
        j = j * 2;
        // Range of j: even values in [-231..2] or [2..231-2]
        printf("%d", j);
    }
}

Обратите внимание, что подсказки к операциям со знаковыми целыми числами показывают (result is wrapped) для указания режима анализа. Сообщение появляется, даже если анализ в этом режиме не помечает целочисленного переполнения со знаком.

warn-with-wrap-around

Флаги Polyspace подписаны целочисленным переполнением. Если операция приводит к переполнению, Polyspace анализирует оставшийся код, но переносит результат переполнения.

В следующем коде j имеет значения в область значений [1.. 231-1] перед оранжевым переполнением. Polyspace считает, что j имеет четные значения в области значений [-231.. 2] или [2.. 231-2] после переполнения.

Точно так же i имеет значение 230 перед красным переполнением и значением -231 после него.

#include<stdio.h>

int getVal();

void func1()
{
    int i = 1;
    i = i << 30;
    // i = 230
    // Result of * operation overflows
    i = i * 2;
    // i = -231
    printf("%d", i);
}
void func2()
{

    int j = getVal();
    if (j > 0) {
        // Range of j: [1..231-1]
        // Result of * operation may overflow
        j = j * 2;
        // Range of j: even values in [-231..2] or [2..231-2]
        printf("%d", j);
    }
}

Обратите внимание, что подсказки к операциям со знаковыми целыми числами показывают (result is wrapped) для указания режима анализа. Сообщение появляется, даже если Overflow проверка зеленого цвета.

В режиме обтекания переполненное значение распространяется и может привести к аналогичному переполнению нескольких строк позже. По умолчанию Code Prover показывает только первое из подобных переполнений. Чтобы увидеть все переполнения, используйте опцию -show-similar-overflows (Polyspace Code Prover).

Совет

  • Чтобы проверить переполнение при преобразованиях из беззнаковых в подписанные целые числа того же размера, установите Overflow mode for unsigned integer равным forbid или warn-with-wrap-around. Если вы разрешаете беззнаковые целочисленные переполнения, Polyspace не помечает переполнения при преобразованиях и переносит результат переполнения, даже если вы проверяете на наличие подписанных целочисленного переполнения.

  • В Polyspace Code Prover™ переполненные подписанные константы обернуты. Это поведение не может быть изменено при помощи опций. Если вы хотите обнаружить переполнения со знаком константы, используйте Polyspace Bug Finder™ checker Integer constant overflow.

Информация о командной строке

Параметр: -signed-integer-overflows
Значение: forbid | allow | warn-with-wrap-around
По умолчанию: forbid
Пример (Code Prover): Polyspace Code Prover -sources file_name -signed-integer-overflows позволяют
Пример (Код Prover Server): Полипространство -code-prover-server -sources file_name -signed-integer-overflows позволяют
Введенный в R2018b