
...
Code Block | ||||
---|---|---|---|---|
| ||||
#include <assert.h> #include <stdint.h> void h(void) { intptr_t i = (intptr_t)(void *)&i; uintptr_t j = (uintptr_t)(void *)&j; void *ip = (void *)i; void *jp = (void *)j; assert(ip == &i); assert(jp == &j); } |
INT36-C-EX3: An integer may be converted to a void*
and back as long as the pointer is not dereferenced, and the integer is in range (that is, the appropriate range for an intptr_t
or uintptr_t
).
The following POSIX code passes an integer, cast as a void*
to a thread, and the thread prints the integer.
Code Block | ||||
---|---|---|---|---|
| ||||
#include <stdio.h>
#include <pthread.h>
void *print_int(void *ptr) {
intptr_t i = (intptr_t) ptr;
printf("The number is %jd\n", i);
return NULL;
}
int main(void) {
pthread_t thr1;
intptr_t i = 123;
int result;
if ((result = pthread_create(&thr1, NULL, print_int, (void *)i)) != 0) {
/* Handle error */
}
pthread_exit(NULL);
return 0;
}
|
Risk Assessment
Converting from pointer to integer or vice versa results in code that is not portable and may create unexpected pointers to invalid memory locations.
...
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 PARSE.PCLB PARSE.PCTSSI | Conversion: integer constant to pointer Conversion: pointer/integer Pointer conversion loses bits Pointer conversion to same size integer | ||||||
Compass/ROSE | |||||||||
Coverity |
| PW.POINTER_CONVERSION_LOSES_BITS | Fully implemented | ||||||
Cppcheck Premium |
| premium-cert-int36-c | |||||||
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-b | A 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 partially covered) | |||||||
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 | ||||||
Security Reviewer - Static Reviewer |
| CPP_05 | Fully implemented | ||||||
SonarQube C/C++ Plugin |
| S1767 | Partially implemented |
...