Integer division by zero

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

Описание

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

Риск

Деление на нули может привести к сбою программы.

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

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

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

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
Влияние: Высокий
ИДЕНТИФИКАТОР CWE: 189, 369
Введенный в R2013b