Versions Compared

Key

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

...

Typically, converting an integer to a smaller type results in truncation of the high-order btis.

Non-Compliant Code Example

Type range errors, including loss of data (truncation) and loss of sign (sign errors), can occur when converting from an unsigned type to a signed type. The following code is likely to result in a truncation error for almost all implementations:

Code Block

unsigned long int ul = ULONG_MAX;
signed char sc;
sc = (signed char)ul; /* cast eliminates warning */

Compliant Solution

Validate ranges when converting from an unsigned type to a signed type. The following code, for example, can be used when converting from unsigned long int to a signed char.

...

Include Page
c:INT31 NCCE
c:INT31 NCCE
Include Page
c:INT31 CS
c:INT31 CS
Include Page
c:INT31 NCCE2
c:INT31 NCCE2
Include Page
c:INT31 CS2
c:INT31 CS2
Include Page
c:INT31 NCCE3
c:INT31 NCCE3
Include Page
c:INT31 CS3
c:INT31 CS3
Include Page
c:INT31 NCCE4
c:INT31 NCCE4
Include Page
c:INT31 CS4
c:INT31 CS4

Non-Compliant Code Example

Type range errors, including loss of data (truncation) and loss of sign (sign errors), can occur when converting from a signed type to an unsigned type. The following code results in a loss of sign:

Code Block
signed int si = INT_MIN;
unsigned int ui;
si = (unsigned int)ui;  /* cast eliminates warning */

Compliant Solution

Validate ranges when converting from a signed type to an unsigned type. The following code, for example, can be used when converting from signed int to unsigned int.

...

NOTE: While unsigned types can usually represent all positive values of the corresponding signed type, this relationship is not guaranteed by the C99 standard.

Non-Compliant Code Example

A loss of data (truncation) can occur when converting from a signed type to a signed type with less precision. The following code is likely to result in a truncation error for most implementations:

Code Block
signed long int sl = LONG_MAX;
signed char sc;
sc = (signed char)sl; /* cast eliminates warning */

Compliant Solution

Validate ranges when converting from an unsigned type to a signed type. The following code can be used, for example, to convert from a signed long int to a signed char:

...

Conversions from signed types with greater precision to signed types with lesser precision require both the upper and lower bounds to be checked.

Non-Compliant Code Example

A loss of data (truncation) can occur when converting from an unsigned type to an unsigned type with less precision. The following code is likely to result in a truncation error for most implementations:

Code Block
unsigned long int ul = ULONG_MAX;
unsigned char uc;
uc = (unsigned char)ul;  /* cast eliminates warning */

Compliant Solution

Validate ranges when converting from an unsigned type to a signed type. The following code can be used, for example, to convert from an unsigned long int to an unsigned char:

...