exponenta event banner

Плавающее деление на ноль

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

Описание

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

Риск

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

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

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

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

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

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

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

Примеры

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

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++
По умолчанию: Вкл.
Синтаксис командной строки: FLOAT_ZERO_DIV
Воздействие: Высокое
CWE ID: 189, 369
Представлен в R2013b