A data model defines the sizes assigned to standard data types. These data models are typically named using a XXXn pattern where X referes to a C type and n refers to a size (typically 32 or 64). ILP64, for example, means that int, long and pointer types are 64 bits wide, LP32 means that long and pointer are 32 bits wide, and LLP64 means that long long and pointer are 64 bits wide.
Data Type |
LP32 |
ILP32 |
ILP64 |
LLP64 |
LP64 |
|---|---|---|---|---|---|
char |
8 |
8 |
8 |
8 |
8 |
short |
16 |
16 |
16 |
16 |
16 |
int |
16 |
32 |
64 |
32 |
32 |
long |
32 |
32 |
64 |
32 |
64 |
long long |
|
|
|
64 |
|
pointer |
32 |
32 |
64 |
64 |
64 |
The following observations are derived from the Development Tutorial by Marco van de Voort \[van de Voort 07\]: |
long in C was that there are both code bases that expect pointer and long to have the same size, while there are also large code bases that expect int and long to be the same size. The compatibility model LLP64 was designed to preserve long and int compatibility by introducing a new type to remain compatible with pointer (long long)long long type.long and int, but loses type compatibility between long and pointer types. Any cast between a pointer and an existing type requires modification.<limits.h>Possibly more important than knowing the number of bits for a given type, one can use macros defined in <limits.h> to determine the integral ranges of the standard integer types.
Understanding the data model used by your implementation is necessary to avoid making errors about the range of values that can be represented using integer types.
Recommendation |
Severity |
Likelihood |
Remediation Cost |
Priority |
Level |
|---|---|---|---|---|---|
INT00-A |
1 (low) |
1 (unlikely) |
1 (high) |
P1 |
L3 |
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
\[[van de Voort 07|AA. C References#van de Voort 07]\] \[[Open Group 97|AA. C References#Open Group 97b]\] |
04. Integers (INT) 04. Integers (INT) INT01-A. Use rsize_t or size_t for all integer values representing the size of an object