exponenta event banner

Переполнение целочисленного преобразования для изменения знака

Переполнение при преобразовании между целыми числами со знаком и без знака

Описание

Этот дефект возникает при преобразовании целого числа без знака в целое число со знаком. Если у переменной недостаточно байтов для представления как исходной константы, так и знакового бита, преобразование переполняется.

Точное распределение ресурсов хранения для различных типов с плавающей запятой зависит от процессора. Посмотрите Target processor type (-target).

Зафиксировать

Исправление зависит от первопричины дефекта. Часто детали результата показывают последовательность событий, которые привели к дефекту. Исправление может быть реализовано для любого события в последовательности. Если сведения о результатах не отображают историю событий, можно выполнить обратную трассировку, щелкнув правой кнопкой мыши параметры в исходном коде и просмотреть предыдущие связанные события. См. также раздел Интерпретация результатов поиска ошибок в интерфейсе пользователя Polyspace Desktop.

См. примеры исправлений ниже.

Если вы не хотите устранять проблему, добавьте комментарии к результату или коду, чтобы избежать другой проверки. См. раздел Результаты анализа пространства адресов с помощью исправлений ошибок или обоснований.

Примеры

развернуть все

char sign_change(void) {
    unsigned char count = 255;

    return (char)count;
}

В операторе return символьная переменная без знака count преобразуется в символ со знаком. Однако char имеет 8 битов, 1 для знака константы и 7 для представления числа. Операция преобразования переполняется, поскольку 255 использует 8 битов.

Корректировка - изменение видов преобразования

Одной из возможных корректировок является использование большего целого типа. С помощью int, достаточно битов для представления знака и числового значения.

int sign_change(void) {
    unsigned char count = 255;

    return (int)count;
}

Информация о результатах

Группа: Числовые
Язык: C | C++
По умолчанию: Вкл.
Синтаксис командной строки: SIGN_CHANGE
Воздействие: среднее
CWE ID: 192, 194, 195, 196
Представлен в R2013b