Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

According to the C Standard, 6.8.45.23, paragraph 4 [ISO/IEC 9899:20112024],

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. A case or default label is accessible only within the closest enclosing switch statement.

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.  Reading such values also violates EXP33-C. Do not read uninitialized memory.

Noncompliant Code Example

...

Using test conditions or initializing variables before the first case statement in a switch block can result in unexpected behavior and undefined behavior 20.

Rule

Severity

Likelihood

Detectable

RepairableRemediation Cost

Priority

Level

DCL41-C

Medium

Unlikely

Yes

YesMedium

P4P6

L3L2

Automated Detection

General analysis rule set

Tool

Version

Checker

Description

Astrée
Include Page
Astrée_V
Astrée_V

switch-skipped-code

Fully checked
Axivion Bauhaus Suite
Include Page
Axivion Bauhaus Suite_V
Axivion Bauhaus Suite_V
CertC-DCL41Fully implemented
Clang
Include Page
Clang_V
Clang_V
-Wsometimes-uninitialized

CodeSonar
Include Page
CodeSonar_V
CodeSonar_V
LANG.STRUCT.SW.BADMalformed switch Statement
Coverity
Include Page
Coverity_V
Coverity_V

MISRA C 2004 Rule 15.0

MISRA C 2012 Rule 16.1

Implemented
Cppcheck Premium
Include Page
Cppcheck Premium_V
Cppcheck Premium_V

premium-cert-dcl41-c


Helix QAC
Include Page
Helix QAC_V
Helix QAC_V
C2008, C2882, C3234Fully implemented
Klocwork
Include Page
Klocwork_V
Klocwork_V
CERT.DCL.SWITCH.VAR_BEFORE_CASEFully implemented
LDRA tool suite 
Include Page
LDRA_V
LDRA_V
385 SFully implemented
Parasoft C/C++test
Include Page
Parasoft_V
Parasoft_V
MISRA2004-15_0_bFully implementedAstrée
Include Page
Astrée_VAstrée_V

future-library-use

language-override

language-override-c99

reserved-declaration

reserved-declaration-c99

reserved-identifier

Partially checkedPRQA QA-C
Include Page
PRQA QA-C_vPRQA QA-C_vCERT_C-DCL41-a

A switch statement shall only contain switch labels and switch clauses, and no other code

PC-lint Plus

Include Page
PC-lint Plus_V
PC-lint Plus_V

527

Assistance provided

Polyspace Bug Finder

Include Page
Polyspace Bug Finder_V
Polyspace Bug Finder_V

CERT C: Rule DCL41-C

Checks for ill-formed switch statements (rule partially covered)

PVS-Studio

Include Page
PVS-Studio_V
PVS-Studio_V

V622

3234
2008
2882

Partially implemented

RuleChecker

Include Page
RuleChecker_V
RuleChecker_V

switch-skipped-code

Fully checkedPVS-Studio6.22V622
TrustInSoft Analyzer

Include Page
TrustInSoft Analyzer_V
TrustInSoft Analyzer_V

initialisationExhaustively detects undefined behavior (see the compliant and the non-compliant example).

Related Vulnerabilities

Search for vulnerabilities resulting from the violation of this rule on the CERT website.

...

Bibliography

[ISO/IEC 9899:20112024]6.8.45.23, "The switch Statement"


...