...
Conversions between integers and pointers can have undesired consequences depending on the implementation.
According to the to the C Standard, subclause 6.3.2.3 3 [ISO/IEC 9899:20112024],
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.
...
A particular platform (that is, hardware, operating system, compiler, and Standard C library) might guarantee that a memory address is correctly aligned for the pointer type, and can actually contain contains a value for that type. A common practice is to use addresses that are known to point to hardware that provides valid values.
Exceptions
INT36-C-EX1: A null pointer can be converted to an integer; it takes on the value 0. Likewise, the integer value 0 The integer value 0 can be converted to a pointer; it becomes the null pointer.
...
Tool | Version | Checker | Description | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Astrée |
| pointer-integral-cast pointer-integral-cast-implicit function-pointer-integer-cast function-pointer-integer-cast-implicit | Fully checked | |||||||||||||||||
Axivion Bauhaus Suite |
| CertC-INT36 | Fully implemented | |||||||||||||||||
Clang |
| -Wint-to-pointer-cast , -Wint-conversion | Can detect some instances of this rule, but does not detect all | |||||||||||||||||
CodeSonar |
| LANG.CAST.PC.CONST2PTR LANG.CAST.PC.INT | Conversion: integer constant to pointer Conversion: pointer/integer | |||||||||||||||||
Compass/ROSE | ||||||||||||||||||||
Coverity |
| PW.POINTER_CONVERSION_LOSES_BITS | Fully implemented | |||||||||||||||||
Cppcheck Premium |
| premium-cert-int36-c | Partially implemented | |||||||||||||||||
Helix QAC |
| C0303, C0305, C0306, C0309, C0324, C0326, C0360, C0361, C0362 C++3040, C++3041, C++3042, C++3043, C++3044, C++3045, C++3046, C++3047, C++3048 | ||||||||||||||||||
Klocwork |
| MISRA.CAST.OBJ_PTR_TO_INT.2012 | ||||||||||||||||||
LDRA tool suite |
| 439 S, 440 S | Fully implemented | |||||||||||||||||
Parasoft C/C++test |
| CERT_C-INT36- | ab | An object with integer type or pointer to void type shall not be converted to an object with pointer typeA conversion should not be performed between a pointer to object type and an integer type other than 'uintptr_t' or 'intptr_t' | ||||||||||||||||
PC-lint Plus |
| 4287 | Partially supported: reports casts from pointer types to smaller integer types which lose information | |||||||||||||||||
Polyspace Bug Finder |
| Checks for unsafe conversion between pointer and integer (rule | fully covered)PRQA QA-C | |||||||||||||||||
Include Page | PRQA QA-C_v | PRQA QA-C_v | 0303, 0305, 0306, 0309, 0324, 0326, 0360, 0361, 0362 | Partially implemented | PRQA QA-C++ | |||||||||||||||
Include Page | cplusplus:PRQA QA-C++_V | cplusplus:PRQA QA-C++_V | partially covered) | |||||||||||||||||
3040, 3041, 3042, 3043, 3044, 3045, 3046, 3047, 3048 | PVS-Studio |
| V527, V528, V542, V566, V601, V647, V1091 | |||||||||||||||||
RuleChecker |
| pointer-integral-cast pointer-integral-cast-implicit function-pointer-integer-cast function-pointer-integer-cast-implicit | Fully checked | |||||||||||||||||
SonarQube C/C++ Plugin |
| S1767 | Partially implemented |
Related Vulnerabilities
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
...
Bibliography
[ISO/IEC 9899:20112024] | 6.3.2.3, "Pointers" |
...