ПроблемаInteger division by zero происходит, когда знаменатель деления или операции с модулем может быть нулевым целым числом.
РискДеление на нули может привести к сбою программы.
ЗафиксироватьИсправление зависит от первопричины дефекта. Часто детали результата показывают последовательность событий, которые привели к дефекту. Используйте этот список событий, чтобы определить, как переменная знаменателя получает нулевое значение. Вы можете реализовать исправление на любом событии в последовательности. Если сведения о результате не отображают историю событий, можно отследить их с помощью опций правого щелчка в исходном коде и просмотреть предыдущие связанные события. Смотрите также Результаты интерпретации Bug Finder в интерфейсе пользователя Polyspace Desktop.
Рекомендуется проверить нулевые значения знаменателя перед делением и обработать ошибку. Вместо непосредственного выполнения деления:
используйте функцию библиотеки, которая обрабатывает нулевые значения знаменателя перед выполнением деления:
См. примеры исправлений ниже.
Если вы не хотите устранять проблему, добавьте комментарии к своему результату или коду, чтобы избежать другой проверки. Смотрите Адрес Результаты 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];
}