Integer division by zero

Деление целого числа нулем

Описание

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

Риск

Деление на нуль может привести к катастрофическому отказу программы.

Фиксация

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

Это - хорошая практика, чтобы проверять на нулевые значения знаменателя перед делением и обработать ошибку. Вместо того, чтобы выполнить деление непосредственно:

res = num/den;
используйте библиотечную функцию, которая обрабатывает нулевые значения знаменателя прежде, чем выполнить деление:
res = div(num, den);

Смотрите примеры мер ниже.

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

Примеры

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

int fraction(int num)
{
    int denom = 0;
    int result = 0;

    result = num/denom;

    return result;
}

Ошибка деления на нуль происходит в num/denom потому что denom нуль.

Коррекция — проверка перед делением
int fraction(int num)
{
    int denom = 0;
    int result = 0;

    if (denom != 0)
        result = num/denom;

    return result;
}

Перед делением добавьте тест, чтобы видеть, является ли знаменатель нулем, проверяя, прежде чем деление произойдет. Если denom всегда нуль, эта коррекция может произвести дефект мертвого кода в ваших результатах Polyspace®.

Коррекция — знаменатель изменения

Одна возможная коррекция должна изменить значение знаменателя так, чтобы denom не нуль.

int fraction(int num)
{
    int denom = 2;
    int result = 0;

    result = num/denom;

    return result;
}
int mod_arr(int input)
{
    int arr[5];
    for(int i = 0; i < 5; i++)
    {
        arr[i] = input % i;
    }

    return arr[0]+arr[1]+arr[2]+arr[3]+arr[4];
}

В этом примере Polyspace отмечает операцию с модулем как деление на нуль. Поскольку по модулю по сути операция деления, делитель (правый аргумент) не может быть нулем. Операция с модулем использует for индекс цикла как делитель. Однако for цикл запускается в нуле, который не может быть итератором.

Коррекция — делитель проверки перед операцией

Одна возможная коррекция проверяет делитель перед операцией с модулем. В этом примере смотрите если индекс i нуль перед операцией с модулем.

int mod_arr(int input)
{
    int arr[5];
    for(int i = 0; i < 5; i++)
    {
        if(i != 0)
        {
             arr[i] = input % i;
        }
        else
        {
             arr[i] = input;
        }
    }

    return arr[0]+arr[1]+arr[2]+arr[3]+arr[4];
}
Коррекция — делитель изменения

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

int mod_arr(int input)
{
    int arr[5];
    for(int i = 0; i < 5; i++)
    {
         arr[i] = input % (i+1);
    }

    return arr[0]+arr[1]+arr[2]+arr[3]+arr[4];
}

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

Группа: числовой
Язык: C | C++
Значение по умолчанию: On
Синтаксис командной строки: INT_ZERO_DIV
Удар: высоко
ID CWE: 189, 369
Введенный в R2013b