...
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 */ |
...
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 |
| future-library-use language-override language-override-c99 reserved-declaration reserved-declaration-c99 reserved-identifier | Partially checked | ||||||
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 | 9.5 | MISRA2004-20_1_a | Fully implemented | ||||||
Polyspace Bug Finder | R2016a | MISRA2012-RULE-21_1, MISRA2012-RULE-21_2 | Partial | ||||||
PRQA QA-C |
| 0602, 4600, 4601, 4602, 4603, 4604, 4605, 4606, 4607, 4608 |
SonarQube C/C++ Plugin |
| S978 |
RuleChecker |
| future-library-use language-override language-override-c99 reserved-declaration reserved-declaration-c99 reserved-identifier | Partially checked |
Related Guidelines
CERT C Secure Coding Standard | PRE00-C. Prefer inline or static functions to function-like macros PRE06-C. Enclose header files in an |
include guard PRE31-C. Avoid side effects in arguments to unsafe macros | |
SEI CERT C++ Coding Standard | DCL51-CPP. Do not declare or define a reserved identifier |
ISO/IEC TS 17961 | Using identifiers that are reserved for the implementation [resident] |
MISRA C:2012 | Rule 21.1 (required) Rule 21.2 (required) |
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> " |
...
...