According to ISO/IEC 9899-1999,
There may be unnamed padding within a structure object, but not at its beginning.
This is often referred to as structure padding. Structure members are arranged in memory as they are declared in the program text. Padding may be added to the structure to ensure the structure is properly aligned in memory.
Non-Compliant Code Example
The example below, is inspired by Dowd, assumes that the size of struct buffer
is equal to the sizeof(size_t) + (sizeof(char) * 50)
, which may be incorrect. The size of struct buffer
may actually be a larger due to structure padding.
struct buffer { size_t size; char buffer[50]; }; ... void func(struct buffer *buf) { struct buffer *buf_cpy = malloc((sizeof(size_t)+(sizeof(char)*50))); /* assuming sizeof(size_t) is 4, this equals 54 */ if (buf_cpy == NULL) { /* Handle malloc() error */ } ... memcpy(buf_cpy, buf, sizeof(struct buffer)); /* with padding, sizeof(struct buffer) may equal 56, causing in a small buffer overflow */ }
Compliant Solution
Structure padding should be accounted for when working with structures.
struct buffer { size_t size; char buffer[50]; }; ... void func(struct buffer *buf) { struct buffer *buf_cpy = malloc((sizeof(struct buffer)); if (buf_cpy == NULL) { /* Handle malloc() error */ } ... memcpy(buf_cpy, buf, sizeof(struct buffer)); }