Float division by zero

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

Описание

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

Риск

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

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

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

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

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