Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

The C Standard identifies two conditions under which division and modulo operations result in undefined behavior (UB):

UBDescription

45

The value of the second operand of the / or % operator is zero (6.5.5).

n/aIf the quotient a/b is not representable, . . . the behavior of both a/b and a%b is undefined (6.5.5).

...

Code Block
bgColor#ccccff
langc
#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
bgColor#ccccff
langc
#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

Compass/ROSE

  

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

Coverity6.5DIVIDE_BY_ZEROFully Implementedimplemented
Fortify SCA5.0 

Can detect violations of this rule with CERT C Rule Pack

LDRA tool suite

Include Page
LDRA_V
LDRA_V

43 D
248 S

Partially implemented
PRQA QA-C
Include Page
PRQA_V
PRQA_V

2830 (C)
2831 (D)
2832 (A)
2833 (S)
2834 (P)

Fully implemented

...