Режим переполнения для целого числа со знаком (-signed-integer-overflows)

Задайте, переносится ли результат переполнения или усеченный

Описание

Эта опция влияет на анализ Программы автоматического доказательства Кода только.

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

Установите опцию

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

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

Почему использование эта опция

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

Настройки

Значение по умолчанию: forbid

forbid

Polyspace отмечает переполнение целого числа со знаком. Если Overflow начинает работу, операция:

  • Красный, Polyspace не анализирует остающийся код в текущем осциллографе.

  • Оранжевый, 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);
    }
}

allow

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

В этом коде анализ не отмечает переполнения в коде. Однако область значений j повторяется к даже значениям в области значений, которую [-231..2] or [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);
    }
}

warn-with-wrap-around

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

В следующем коде j имеет значения в области значений [1..231-1] перед оранжевым переполнением. Polyspace полагает, что j имеет даже значения в области значений [-231..2] or [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);
    }
}

Советы

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

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

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

Параметр: -signed-integer-overflows
Значение: forbid | allow | warn-with-wrap-around
Значение по умолчанию: forbid
Пример (программа автоматического доказательства кода): polyspace-code-prover -sources file_name -signed-integer-overflows allow
Пример (сервер программы автоматического доказательства кода): polyspace-code-prover-server -sources file_name -signed-integer-overflows allow

Введенный в R2018b