IssueInteger division by zero occurs when the denominator of a division or
modulo operation can be a zero-valued integer.
RiskA division by zero can result in a program crash.
FixThe fix depends on the root cause of the
defect. Often the result details show a sequence of events that led to the defect.
Use this event list to determine how the denominator variable acquires a zero value.
You can implement the fix on any event in the sequence. If the result details do not
show the event history, you can trace back using right-click options in the source
code and see previous related events. See also Interpret Bug Finder Results in Polyspace Desktop User Interface.
It is a good practice to check for zero
values of a denominator before division and handle the error. Instead of
performing the division
directly:
use
a library function that handles zero values of the denominator before performing
the
division:
See examples of fixes below.
If you do not want to fix the issue, add comments to your result or code to avoid
another review. See Address Polyspace Results Through Bug Fixes or Justifications.
Example - Dividing an Integer by Zeroint fraction(int num)
{
int denom = 0;
int result = 0;
result = num/denom;
return result;
}A division by zero error occurs at num/denom because denom is
zero.
Correction — Check Before Divisionint fraction(int num)
{
int denom = 0;
int result = 0;
if (denom != 0)
result = num/denom;
return result;
}Before dividing, add a test to see if the denominator is zero,
checking before division occurs. If denom is always
zero, this correction can produce a dead code defect in your Polyspace® results.
Correction — Change DenominatorOne possible correction is to change the denominator value so
that denom is not zero.
int fraction(int num)
{
int denom = 2;
int result = 0;
result = num/denom;
return result;
} Example - Modulo Operation with Zeroint 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];
}In this example, Polyspace flags the modulo operation as
a division by zero. Because modulo is inherently a division operation,
the divisor (right hand argument) cannot be zero. The modulo operation
uses the for loop index as the divisor. However,
the for loop starts at zero, which cannot be an
iterator.
Correction — Check Divisor Before OperationOne possible correction is checking the divisor before the modulo
operation. In this example, see if the index i is
zero before the modulo operation.
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];
} Correction — Change DivisorAnother possible correction is changing the divisor to a nonzero
integer. In this example, add one to the index before the % operation
to avoid dividing by zero.
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];
}