Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 4.0

Wiki MarkupThe size of a structure is not always equal to the sum of the sizes of its members. According to Section 6.7.2.1 of the C99 standard, "There may be unnamed padding within a structure object, but not at its beginning" \[ [ISO/IEC 9899:1999|AA. Bibliography#ISO/IEC 9899-1999]\].

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. Structure padding allows for faster member access on many architectures.

...

Noncompliant Code Example

...

This noncompliant code example assumes that the size of {{struct buffer}} is equal to the sum of the size of its individual components, which may not be the case \ [[Dowd 2006|AA. Bibliography#Dowd 06]\]. The size of {{struct buffer}} may actually be larger due to structure padding.

Code Block
bgColor#FFcccc
langc
enum { buffer_size = 50 };

struct buffer {
  size_t size;
  char bufferC[buffer_size];
} buff;

/* ... */

void func(const struct buffer *buf) {

  /*
   * Incorrectly assumes sizeof(struct buffer) =
   * sizeof(size_t) + sizeof(buff.bufferC) 
   */
  struct buffer *buf_cpy = (struct buffer *)malloc(
    sizeof(size_t) + sizeof(buff.bufferC)
  );

  if (buf_cpy == NULL) {
    /* Handle malloc() error */
  }

  /*
   * With padding, sizeof(struct buffer) may be greater than
   * sizeof(size_t) + sizeof(buff.bufferC), causing some data  
   * to be written outside the bounds of the memory allocated.
   */
  memcpy(buf_cpy, buf, sizeof(struct buffer));

  /* ... */

  free(buf_cpy);
}

...

Tool

Version

Checker

Description

Section

LDRA tool suite

Include Page
c:LDRA_Vc:
LDRA_V
Section

400 S
578 S

Section

Fully Implemented

...

ISO/IEC 9899:1999 Section 6.7.2.1, "Structure and union specifiers"

Bibliography

Wiki Markup\[[Dowd 2006|AA. Bibliography#Dowd 06] \] Chapter 6, "C Language Issues" (Structure Padding 284-287) \
[[Sloss 2004|AA. Bibliography#Sloss 04] \] Section 5.7, "Structure Arrangement"

...

      03. Expressions (EXP)      EXP04-C. Do not perform byte-by-byte comparisons involving a structure