Ошибки целочисленного деления
Integer division by zero происходит, когда знаменатель деления или операции по модулю может быть целым числом с нулевым знаком.
Деление на нуль может привести к катастрофическому отказу программы.
Фиксация зависит от первопричины дефекта. Часто детали результата показывают последовательность событий, которые привели к дефекту. Используйте этот список событий, чтобы определить, как переменная знаменателя получает нулевое значение. Можно реализовать закрепление на любом событии в последовательности. Если детали результата не показывают историю события, можно проследить использование, щелкните правой кнопкой по опциям по исходному коду и смотрите предыдущие связанные события. См. также Интерпретируют Результаты Polyspace Bug Finder.
Это - хорошая практика, чтобы проверять на нулевые значения знаменателя перед делением и обработать ошибку. Вместо того, чтобы выполнить деление непосредственно:
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];
}| Разрешимость: неразрешимый |
[1] Выписки из стандарта "Техническая характеристика ISO/IEC TS 17961 - 2013-11-15" воспроизводятся с соглашением о AFNOR. Только исходный и полный текст стандарта, как опубликовано Выпусками AFNOR - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.