...
Braces also help ensure that macros with multiple statements are properly expanded. Such a macro should be wrapped in a do-while
loop. (See PRE10-C. Wrap multistatement macros in a do-while loop.) However, when the do-while
loop is not present, braces can still ensure that the macro expands as intended.
An if
, for
, or while
statement with an empty body also should have an empty pair of braces to indicate the empty body. In such a case, the condition should have a significant side-effect, or the statement will violate MSC12-C. Detect and remove code that has no effect or is never executed:
Code Block | ||||
---|---|---|---|---|
| ||||
while (invalid_login()) {} // let user re-login until successful
|
Noncompliant Code Example
...
Code Block | ||||
---|---|---|---|---|
| ||||
int privileges;
if (invalid_login()) {
if (allow_guests()) {
privileges = GUEST;
}
} else {
privileges = ADMINISTRATOR;
}
|
Noncompliant Code Example (empty block)
This noncompliant code example has a while
statement with no block:
Code Block | ||||
---|---|---|---|---|
| ||||
while (invalid_login()); |
Note that if invalid_login()
has no side effects (such as warning the user if their login failed), this code also violates MSC12-C. Detect and remove code that has no effect or is never executed.
Compliant Solution (empty block)
This compliant solution features an explicit empty block, which clarifies the developer's intent:
Code Block | ||||
---|---|---|---|---|
| ||||
while (invalid_login()) {}
|
Risk Assessment
Recommendation | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
EXP19-C | Medium | Probable | Medium | P8 | L2 |
...
Tool | Version | Checker | Description | ||||||||||||
Astrée |
| compound-ifelse compound-loop | Fully checked | ||||||||||||
Axivion Bauhaus Suite |
| CertC-EXP19 | Fully implemented | ||||||||||||
Helix QAC |
| C2212 | |||||||||||||
Klocwork |
| MISRA.IF.NO_COMPOUND MISRA.STMT.NO_COMPOUND | |||||||||||||
LDRA tool suite |
| 11 S, 12 S, 428 S | Fully Implemented | ||||||||||||
Parasoft C/C++test |
| CERT_C-EXP19-a | The statement forming the body of a 'switch', 'while', 'do...while' or 'for' statement shall be a compound statement | ||||||||||||
PC-lint Plus |
| 9012 | Fully supported | ||||||||||||
Polyspace Bug Finder |
| MISRA CERT C: 2012 Rule 15.6 | The body of an iteration-statement or a selection-statement shall be a compound statement | PRQA QA-C | |||||||||||
Include Page | PRQA QA-C_v | PRQA QA-C_v | 2212Rec. EXP19-C | Checks for iteration or selection statement body not enclosed in braces (rec. fully covered) | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
PVS-Studio |
| V563, V628, V640, V705 | |||||||||||||
RuleChecker |
| compound-ifelse compound-loop | Fully checked | ||||||||||||
SonarQube C/C++ Plugin |
| S121 |
...