Versions Compared

Key

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

...

The only value that can be considered interchangeable between pointers and integers is the constant 0. Except in this case, conversions between integers and pointers can have undesired consequences depending on the implementation. According to C99 to the C standard [ISO/IEC 9899:19992011]

An integer may be converted to any pointer type. Except as previously specified, the result is implementation defined, might not be correctly aligned, might not point to an entity of the referenced type, and might be a trap representation.

...

See also undefined behavior 21 24 of Annex J.

These issues arise because the mapping functions for converting a pointer to an integer or an integer to a pointer must be consistent with the addressing structure of the execution environment. For example, not all machines have a flat memory model.

...

Code Block
bgColor#ffcccc
langc

char *ptr;
unsigned int flag;
/* ... */
unsigned int number = (unsigned int)ptr;
number = (number & 0x7fffff) | (flag << 23);
ptr = (char *)number;

...

Please note that this noncompliant code example also violates recommendation EXP11-C. Do not apply operators expecting one type to data of an incompatible type.

...

Code Block
bgColor#ccccff
langc

struct ptrflag {
  char *pointer;
  unsigned int flag :9;
} ptrflag;

char *ptr;
unsigned int flag;
/* ... */
ptrflag.pointer = ptr;
ptrflag.flag = flag;

...

Code Block
bgColor#FFcccc
langc

unsigned int *ptr = 0xcfcfcfcf;

...

Code Block
bgColor#ccccff
langc

unsigned int *ptr = (unsigned int *) 0xcfcfcfcf;

...

sectionsectionsection Implemented

Tool

Version

Checker

Description

LDRA tool suite

Include Page
LDRA_V
LDRA_V

94 S

Fully implemented
Section
Compass/ROSE   

Related Vulnerabilities

Search for vulnerabilities resulting from the violation of this rule on the CERT website.

...

CERT C++ Secure Coding Standard: INT11-CPP. Take care when converting from pointer to integer or integer to pointer

ISO/IEC 9899:19992011 Section 6.3.2.3, "Pointers"

ISE/IEC TR 17961 (Draft) Converting a pointer to integer or integer to pointer [intptrconv]

ISO/IEC TR 24772 "HFC Pointer casting and pointer type changes"

...