...
The C Standard identifies two conditions under which division and modulo operations result in undefined behavior (UB):
UB | Description |
The value of the second operand of the | |
n/a | If the quotient a/b is not representable, . . . the behavior of both a/b and a%b is undefined (6.5.5). |
...
Code Block | ||||
---|---|---|---|---|
| ||||
#include <limits.h>
signed long s_a;
signed long s_b;
signed long result;
void func(void) {
/* Initialize s_a, s_b and result */
if ( (s_b == 0) || ( (s_a == LONG_MIN) && (s_b == -1) ) ) {
/* Handle error condition */
} else {
result = s_a / s_b;
}
/* ... */
} |
...
Code Block | ||||
---|---|---|---|---|
| ||||
#include <limits.h>
signed long s_a;
signed long s_b;
signed long result;
void func(void) {
/* Initialize s_a, s_b and result */
if ( (s_b == 0 ) || ( (s_a == LONG_MIN) && (s_b == -1) ) ) {
/* Handle error condition */
} else {
result = s_a % s_b;
}
/* ... */
} |
...
Tool | Version | Checker | Description | ||||||
---|---|---|---|---|---|---|---|---|---|
Can detect some violations of this rule. In particular, it ensures that all operations involving division or modulo are preceded by a check ensuring that the second operand is nonzero | |||||||||
Coverity | 6.5 | DIVIDE_BY_ZERO | Fully Implementedimplemented | ||||||
Fortify SCA | 5.0 | Can detect violations of this rule with CERT C Rule Pack | |||||||
| 43 D | Partially implemented | |||||||
PRQA QA-C |
| 2830 (C) | Fully implemented |
...