Why is this an issue?
The requirement for a final default
clause is defensive programming. The clause should either take appropriate action, or contain a
suitable comment as to why no action is taken. When the switch
covers all current values of an enum
- and especially when it
doesn’t - a default
case should still be used because there is no guarantee that the enum
won’t be extended.
Note that there is a more nuanced version of this rule: S3562. Use this rule if you want to require a default
case for
every switch
even if it already handles all enumerators of an enum
. Otherwise, use S3562.
Noncompliant code example
switch (param) { // Noncompliant - default clause is missing
case 0:
doSomething();
break;
case 1:
doSomethingElse();
break;
}
Compliant solution
switch (param) {
case 0:
doSomething();
break;
case 1:
doSomethingElse();
break;
default:
doDefault();
break;
}
Resources
- MISRA C:2004, 15.0 - The MISRA C switch syntax shall be used.
- MISRA C:2004, 15.3 - The final clause of a switch statement shall be the default clause
- MISRA C++:2008, 6-4-3 - A switch statement shall be a well-formed switch statement.
- MISRA C++:2008, 6-4-6 - The final clause of a switch statement shall be the default-clause
- MISRA C:2012, 16.1 - All switch statements shall be well-formed
- MISRA C:2012, 16.4 - Every switch statement shall have a default label
- MISRA C:2012, 16.5 - A default label shall appear as either the first or the last switch label of a switch statement
- MITRE, CWE-478 - Missing Default Case in Switch Statement
- CERT, MSC01-C. - Strive for logical completeness
Related rules