...
No other identifiers are reserved and if . If a program declares or defines an identifier in a context in which it is reserved , or defines a reserved identifier as a macro name, the behavior of that identifier is undefined. Trying to define a reserved identifier may lead to that identifier can result in its name conflicting with that used in implementation, which may or may not be detected at compile time.
...
Noncompliant Code Example
In this example, variables are defined with names reserved for the implementation.
Code Block | ||
---|---|---|
| ||
long _Max_Value; int __length; |
...
The compliant solution uses identifiers that are not reserved.
Code Block | ||
---|---|---|
| ||
long maxValue; int length; |
Non-Compliant Code Example
In this example, a variable beginning with an underscore is defined with implicit global scope.
Code Block | ||
---|---|---|
| ||
size_t _limit = 100; unsigned int getValue(unsigned int count){ size_t i; unsigned int result = 0; for(i = 0; i < _limit; i++){ result++; if(i == count){ break; } } } |
Compliant Code Solution 1
In the compliant solution, the variable is declared as static and, hence, has file scope.
Code Block | ||
---|---|---|
| ||
static size_t _limit = 100; unsigned int getValue(unsigned int count){ size_t i; unsigned int result = 0; for(i = 0; i < _limit; i++){ result++; if(i == count){ break; } } } |
Compliant Code Solution 2
In the compliant solution, the variable name does not begin with an underscore and, hence, is not reserved.
Code Block | ||
---|---|---|
| ||
size_t limit = 100; unsigned int getValue(unsigned int count){ size_t i; unsigned int result = 0; for(i = 0; i < limit; i++){ result++; if(i == count){ break; } } } |
...
Noncompliant Code Example
Identifiers with external linkage include setjmp
, errno
, math_errhandling
, and va_end
.
In the example, errno
is defined. The errno
value set by the function open()
would not be accessible to the program as its definition is suppressed. For information regarding redefining errno
, see ERR31-C. Don't redefine errno.
...
In the compliant solution, the reserved identifier errno
is not used.
Code Block | ||
---|---|---|
| ||
#include <errno.h> #define keyNum 200 int validate(unsigned int secretValue){ char fname[] = "non_exist.txt"; int fd; int result = -1; fd = open(fname, O_RDONLY); if(fd == -1){ printf("Error opening file. Error code : %d\n", errno); return result; } close(fd); if(errno % secretValue == 20){ result = 0; } else{ result = -1; } return result; } |
Risk Assessment
Use of Using reserved identifiers may cause can lead to incorrect program operation.
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
DCL37-C | low | unlikely | low Low | P3 | L3 |
Automated Detection
A module can be written in Compass/ROSE to can detect violations of this rule.
References
Wiki Markup |
---|
\[[ISO/IEC 9899:1999|AA. C References#ISO/IEC 9899-1999]\] Section 7.1.3, "Reserved Identifiers" |
...