
According to the C Standard, 6.8.4.2, paragraph 4 [ISO/IEC 9899:2011],
A switch statement causes control to jump to, into, or past the statement that is the switch body, depending on the value of a controlling expression, and on the presence of a default label and the values of any case labels on or in the switch body.
If a programmer declares variables, initializes them before the first case statement, and then tries to use them inside any of the case statements, those variables will have scope inside the switch
block but will not be initialized and will consequently contain indeterminate values.
Noncompliant Code Example
This noncompliant code example declares variables and contains executable statements before the first case label within the switch
statement:
#include <stdio.h> extern void f(int i); void func(int expr) { switch (expr) { int i = 4; f(i); case 0: i = 17; /* Falls through into default code */ default: printf("%d\n", i); } }
Implementation Details
When the preceding example is executed on GCC 4.8.1, the variable i
is instantiated with automatic storage duration within the block, but it is not initialized. Consequently, if the controlling expression expr
has a nonzero value, the call to printf()
will access an indeterminate value of i
. Similarly, the call to f()
is not executed.
Value of |
|
---|---|
0 | 17 |
Nonzero | Indeterminate |
Compliant Solution
In this compliant solution, the statements before the first case label occur before the switch
statement:
#include <stdio.h> extern void f(int i); int func(int expr) { /* * Move the code outside the switch block; now the statements * will get executed. */ int i = 4; f(i); switch (expr) { case 0: i = 17; /* Falls through into default code */ default: printf("%d\n", i); } return 0; }
Risk Assessment
Using test conditions or initializing variables before the first case statement in a switch
block can result in unexpected behavior and undefined behavior.
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
DCL41-C | Medium | Unlikely | Medium | P4 | L3 |
Automated Detection
Tool | Version | Checker | Description |
Clang | 3.9 | -Wsometimes-uninitialized | |
LDRA tool suite | 9.7.1 | 385 S | Fully implemented |
Parasoft C/C++test | 9.5 | MISRA2004-15_0_b | |
Unable to render {include} The included page could not be found. | 3234 | Partially implemented |
Related Vulnerabilities
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
Related Guidelines
MISRA C:2012 | Rule 16.1 (required) |
Bibliography
[ISO/IEC 9899:2011] | 6.8.4.2, "The switch Statement" |