The C Standard, 6.7.3.2.1, paragraph 18 20 [ISO/IEC 9899:20112024], says
As a special case, the last element of a structure with more than one named member may have an incomplete array type; this is called a flexible array member. In most situations, the flexible array member is ignored. In particular, the size of the structure is as if the flexible array member were omitted except that it may have more trailing padding than the omission would imply.
...
Code Block | ||||
---|---|---|---|---|
| ||||
#include <stdlib.h> struct flex_array_struct { size_t num; int data[]; }; void func(void) { struct flex_array_struct *flex_struct; size_t array_size = 4; /* Dynamically allocate memory for the struct */ flex_struct = (struct flex_array_struct *)malloc( sizeof(struct flex_array_struct) + sizeof(int) * array_size); if (flex_sructstruct == NULL) { /* Handle error */ } /* Initialize structure */ flex_struct->num = array_size; for (size_t i = 0; i < array_size; ++i) { flex_struct->data[i] = 0; } } |
...
Failure to use structures with flexible array members correctly can result in undefined behavior.
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
MEM33-C | Low | Unlikely | Low | P3 | L3 |
Automated Detection
Tool | Version | Checker | Description | ||||
---|---|---|---|---|---|---|---|
Astrée |
|
| flexible-array-member-assignment flexible-array-member-declaration | Fully checked | |||||||
Axivion Bauhaus Suite |
| CertC-MEM33 | Fully implemented | ||||||
CodeSonar |
| LANG.STRUCT.DECL.FAM | Declaration of Flexible Array Member | ||||||
Compass/ROSE |
Can detect all of these | |||||||||
Cppcheck Premium |
| premium-cert-mem33-c | Partially implemented | ||||||
Helix QAC |
| C1061, C1062, C1063, C1064 | |||||||
Klocwork |
| MISRA.INCOMPLETE.STRUCT | |||||||
LDRA tool suite |
| 649 S, 650 S | Fully implemented |
Parasoft C/C++test |
| CERT_C-MEM33-a | Allocate structures containing a flexible array member dynamically | ||||||
| CERT C: Rule MEM33-C | Checks for misuse of structure with flexible array member (rule fully covered) | |||||||
RuleChecker |
| flexible-array-member-assignment flexible-array-member-declaration | Fully checked |
Related Vulnerabilities
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
Related Guidelines
Key here (explains table format and definitions)
Taxonomy | Taxonomy item | Relationship |
---|---|---|
CERT C Secure Coding Standard | DCL38-C. Use the correct syntax when declaring a flexible array member | Prior to 2018-01-12: CERT: Unspecified Relationship |
CERT-CWE Mapping Notes
Key here for mapping notes
CWE-401 and MEM33-CPP
There is no longer a C++ rule for MEM33-CPP. (In fact, all C++ rules from 30-50 are gone, because we changed the numbering system to be 50-99 for C++ rules.)
Bibliography
[ISO/IEC 9899: |
2024] | Subclause 6.7.3.2 |
, "Structure and Union Specifiers" | |
[JTC1/SC22/WG14 N791] | Solving the Struct Hack Problem |
...
...