Float division by zero

Деление числа с плавающей точкой нулем

Описание

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

Риск

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

Фиксация

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

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

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

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

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

Примеры

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

float fraction(float num)
{
    float denom = 0.0;
    float result = 0.0;

    result = num/denom;

    return result;
}

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

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

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

    return result;
}

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

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

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

float fraction(float num)
{
    float denom = 2.0;
    float result = 0.0;

    result = num/denom;

    return result;
}

Проверяйте информацию

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