Versions Compared

Key

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

...

Noncompliant Code Example (

...

Include Guard)

A common, but noncompliant, practice is to choose a reserved name for a macro used in a preprocessor conditional guarding against multiple inclusions of a header file. (See also PRE06-C. Enclose header files in an inclusion include guard.) The name may clash with reserved names defined by the implementation of the C standard library in its headers or with reserved names implicitly predefined by the compiler even when no C standard library header is included.

Code Block
bgColor#FFCCCC
langc
#ifndef _MY_HEADER_H_
#define _MY_HEADER_H_

/* Contents of <my_header.h> */

#endif /* _MY_HEADER_H_ */

Compliant Solution (

...

Include Guard)

This compliant solution avoids using leading underscores in the macro name of the header include guard:

Code Block
bgColor#ccccff
langc
#ifndef MY_HEADER_H
#define MY_HEADER_H

/* Contents of <my_header.h> */

#endif /* MY_HEADER_H */

...

Noncompliant Code Example (Identifiers with External Linkage)

...

This noncompliant example provides definitions for the C standard library functions malloc() and free(). Although this practice is permitted by many traditional implementations of UNIX (for example, the Dmalloc library), it is undefined behavior according to the C Standard. Even on systems that allow replacing malloc(), doing so without also replacing aligned_alloc(), calloc(), and realloc() is likely to cause problems.

...

Noncompliant Code Example (errno)

According to the C In addition to symbols defined as functions in each C standard library header, identifiers with external linkage include errno and math_errhandling.  According to the C Standard, 7.5, paragraph 2 [ISO/IEC 9899:2011], the behavior of a program is undefined when

...

Using reserved identifiers can lead to incorrect program operation.

Rule

Severity

Likelihood

Remediation Cost

Priority

Level

DCL37-C

Low

Unlikely

Low

P3

L3

Automated Detection

Tool

Version

Checker

Description

CodeSonar
Astrée
Include Page
CodeSonar
Astrée_V
CodeSonar
Astrée_V

LANG.STRUCT.DECL.RESERVED

Declaration of reserved nameCompass/ROSE

 

 

 

ECLAIR Include PageECLAIR_VECLAIR_VCC2.DCL37Fully implementedKlocwork Include PageKlocwork_VKlocwork_VMISRA.DEFINE.WRONGNAME.UNDERSCORE
MISRA.STDLIB.WRONGNAME.UNDERSCORE
MISRA.STDLIB.WRONGNAME LDRA tool suite Include PageLDRA_VLDRA_V

86 S, 218 S, 219 S, 580 S, 626 S

Fully Implemented

Parasoft C/C++test9.5MISRA2004-20_1_aFully implementedPolyspace Bug FinderR2016aMISRA2012-RULE-21_1, 
MISRA2012-RULE-21_2
 Partial

future-library-use

language-override

language-override-c99

reserved-declaration

reserved-declaration-c99

reserved-identifier

Partially checked
Axivion Bauhaus Suite

Include Page
Axivion Bauhaus Suite_V
Axivion Bauhaus Suite_V

CertC-DCL37Fully implemented. Reserved identifiers, as in DCL37-C-EX3, are configurable.
CodeSonar
Include Page
CodeSonar_V
CodeSonar_V

LANG.STRUCT.DECL.RESERVED

Declaration of reserved name
Compass/ROSE




Coverity
Include Page
Coverity_V
Coverity_V

MISRA C 2004 Rule 20.1

MISRA C 2004 Rule 20.2

MISRA C 2012 Rule 21.1

MISRA C 2012 Rule 21.2

Implemented
ECLAIR
Include Page
ECLAIR_V
ECLAIR_V
CC2.DCL37Fully implemented
Klocwork
Include Page
Klocwork_V
Klocwork_V
MISRA.DEFINE.WRONGNAME.UNDERSCORE
MISRA.STDLIB.WRONGNAME.UNDERSCORE
MISRA.STDLIB.WRONGNAME

LDRA tool suite
Include Page
LDRA_V
LDRA_V

86 S, 218 S, 219 S, 580 S, 626 S

Fully Implemented

Parasoft C/C++test
Include Page
Parasoft_V
Parasoft_V

CERT_C-DCL37-a

Do not #define or #undef identifiers with names which start with underscore
Polyspace Bug Finder

Include Page
Polyspace Bug Finder_V
Polyspace Bug Finder_V

CERT C: Rule DCL37-C


Checks for:

  • Defining and undefining reserved identifiers or macros
  • Declaring a reserved identifier or macro name

Rule partially covered

PRQA QA-C
Include Page
PRQA QA-C_v
PRQA QA-C_v

0602, 0603, 4600, 4601, 4602,

4603, 4604, 4605, 4606,
4607, 4608 

4603, 4604, 4605, 4606, 4607,

4608, 4620, 4621, 4622, 4623,

4624, 4640, 4641, 4642, 4643,

4644, 4645


SonarQube C/C++ Plugin
Include Page
SonarQube C/C++ Plugin
_VSonarQube C/C++ Plugin_VS978 

Related Guidelines

_V
SonarQube C/C++ Plugin_V
S978
RuleChecker
Include Page
RuleChecker_V
RuleChecker_V

future-library-use

language-override

language-override-c99

reserved-declaration

reserved-declaration-c99

reserved-identifier

Partially checked

Related Guidelines

Key here (explains table format and definitions)

Taxonomy

Taxonomy item

Relationship

CERT C Secure Coding StandardPRE00-C. Prefer inline or static functions to function
-like macros
-like macrosPrior to 2018-01-12: CERT: Unspecified Relationship
CERT C Secure Coding StandardPRE06-C. Enclose header files in an
inclusion
include guardPrior to 2018-01-12: CERT: Unspecified Relationship
CERT C Secure Coding StandardPRE31-C. Avoid side effects in arguments to unsafe macros
SEI CERT C++ Coding Standard
Prior to 2018-01-12: CERT: Unspecified Relationship
CERT CDCL51-CPP. Do not
declare or define a reserved identifier
declare or define a reserved identifierPrior to 2018-01-12: CERT: Unspecified Relationship
ISO/IEC TS 17961Using identifiers that are reserved for the implementation [resident]Prior to 2018-01-12: CERT: Unspecified Relationship
MISRA C:2012Rule 21.1 (required)Prior to 2018-01-12: CERT: Unspecified Relationship
MISRA C:2012Rule 21.2 (required)Prior to 2018-01-12: CERT: Unspecified Relationship

Bibliography

[IEEE Std 1003.1-2013]Section 2.2, "The Compilation Environment"
[ISO/IEC 9899:2011]7.1.3, "Reserved Identifiers"
7.31.10, "Integer Types <stdint.h>"

...


...

Image Modified Image Modified Image Modified