...
No other identifiers are reserved. (The POSIX standard extends the set of identifiers reserved by the C Standard to include an open-ended set of its own. See Portable Operating System Interface [POSIX®], Base Specifications, Issue 7, Section 2.2, "The Compilation Environment" [IEEE Std 1003.1-2013].) The behavior of a program that declares or defines an identifier in a context in which it is reserved or that defines a reserved identifier as a macro name is undefined. (See undefined behavior 106.)
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 | ||||
---|---|---|---|---|
| ||||
#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 | ||||
---|---|---|---|---|
| ||||
#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 |
---|
Astrée |
|
|
|
LANG.STRUCT.DECL.RESERVED
MISRA.STDLIB.WRONGNAME.UNDERSCORE
MISRA.STDLIB.WRONGNAME
86 S, 218 S, 219 S, 580 S, 626 S
Fully Implemented
MISRA2012-RULE-21_2
future-library-use language-override language-override-c99 reserved-declaration reserved-declaration-c99 reserved-identifier | Partially checked | ||||||||
Axivion Bauhaus Suite |
| CertC-DCL37 | Fully implemented. Reserved identifiers, as in DCL37-C-EX3, are configurable. | ||||||
CodeSonar |
| LANG.STRUCT.DECL.RESERVED | Declaration of reserved name | ||||||
Compass/ROSE | |||||||||
Coverity |
| 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 |
| CC2.DCL37 | Fully implemented | ||||||
Klocwork |
| MISRA.DEFINE.WRONGNAME.UNDERSCORE MISRA.STDLIB.WRONGNAME.UNDERSCORE MISRA.STDLIB.WRONGNAME | |||||||
LDRA tool suite |
| 86 S, 218 S, 219 S, 580 S, 626 S | Fully Implemented | ||||||
Parasoft C/C++test |
| CERT_C-DCL37-a | Do not #define or #undef identifiers with names which start with underscore | ||||||
Polyspace Bug Finder |
| Checks for:
Rule partially covered | |||||||
PRQA QA-C |
| 0602, 0603, 4600, 4601, 4602, |
4607, 4608
4603, 4604, 4605, 4606, 4607, 4608, 4620, 4621, 4622, 4623, 4624, 4640, 4641, 4642, 4643, 4644, 4645 | |||||
SonarQube C/C++ Plugin |
|
Related Guidelines
| S978 | ||||||||
RuleChecker |
| 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 Standard | PRE00-C. Prefer inline or static functions to function |
-like macros | Prior to 2018-01-12: CERT: Unspecified Relationship |
CERT C Secure Coding Standard | PRE06-C. Enclose header files in an |
include guard | Prior to 2018-01-12: CERT: Unspecified Relationship |
CERT C Secure Coding Standard | PRE31-C. Avoid side effects in arguments to unsafe macros |
Prior to 2018-01-12: CERT: Unspecified Relationship | |
CERT C | DCL51-CPP. Do not |
declare or define a reserved identifier | Prior to 2018-01-12: CERT: Unspecified Relationship | |
ISO/IEC TS 17961 | Using identifiers that are reserved for the implementation [resident] | Prior to 2018-01-12: CERT: Unspecified Relationship |
MISRA C:2012 | Rule 21.1 (required) | Prior to 2018-01-12: CERT: Unspecified Relationship |
MISRA C:2012 | Rule 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> " |
...
...