Immutable objects should be const-qualified. Enforcing object immutability using const- qualification helps ensure the correctness and security of applications. ISO/IEC TR 24772, for example, recommends labeling parameters as constant to avoid the unintentional modification of function arguments [ISO/IEC TR 24772]. See recommendation STR05-C. Use pointers to const when referring to string literals describes a specialized case of this recommendation.
Adding const qualification may propagate through a program; as you add const, qualifiers become still more become necessary. This phenomenon is sometimes called const poisoning, which can frequently lead to violations of recommendation EXP05-C. Do not cast away a const qualification. While Although const qualification is a good idea, the costs may outweigh the value in the remediation of existing code.
Macros, A macro or an enumeration constant , may also be used instead of a const-qualified object. Reocmmendation DCL06-C. Use meaningful symbolic constants to represent literal values describes the relative merits of using const-qualified objects, enumeration constants, and object-like macros. However, adding a const qualifier to an existing variable is a better first step than replacing the variable with an enumeration constant or macro because the compiler will issue warnings on any code that changes your const-qualified variable. Once you have verified that a const-qualified variable is not changed by any code, you may consider changing it to an enumeration constant or macro, as best fits your design.
...
| Code Block | ||||
|---|---|---|---|---|
| ||||
float pi = 3.14159f;
float degrees;
float radians;
/* ... */
radians = degrees * pi / 180;
|
...
In this compliant solution, pi is declared as a const-qualified object.:
| Code Block | ||||
|---|---|---|---|---|
| ||||
const float pi = 3.14159f;
float degrees;
float radians;
/* ... */
radians = degrees * pi / 180;
|
Exceptions
DCL00-EX1: It is acceptable to define valueless macros to serve as 'inclusion guards'. That is, the macro serves to control the multiple inclusion of header files, as in the following example:
| Code Block |
|---|
#ifndef SOME_HEADER_H
#define SOME_HEADER_H
... // content of header file
#endif
|
See recommendation PRE06-C. Enclose header files in an inclusion guard for more information on inclusion guards.
Risk Assessment
Failing to const-qualify immutable objects can result in a constant being modified at runtime.
Recommendation | Severity | Likelihood | Detectable |
|---|
Repairable | Priority | Level |
|---|---|---|
DCL00-C | Low |
Unlikely |
Yes |
Yes |
P3 | L3 |
Automated Detection
Tool | Version | Checker | Description |
|---|
| Astrée |
| parameter-missing-const | Partially checked | ||||||
| Axivion Bauhaus Suite |
| CertC-DCL00 | |||||||
| CodeSonar |
| LANG.CAST.PC.CRCQ LANG.TYPE.VCBC LANG.STRUCT.RPNTC | Cast removes const qualifier Variable Could Be const Returned Pointer Not Treated as const | ||||||
| Compass/ROSE |
| CC2.DCL00 | Partially implemented | |||||||
| Helix QAC |
| C3204, C3227, C3232, C3673, C3677 |
| LDRA tool suite |
|
78 D |
Fully implemented | |||||||||
| Parasoft C/C++test |
| CERT_C-DCL00-a | Declare local variable as const whenever possible | ||||||
| PC-lint Plus |
| 953 | Fully supported | ||||||
| Polyspace Bug Finder |
| CERT C: DCL00-C | Checks for unmodified variable not const-qualified (rule fully covered). | ||||||
| RuleChecker |
| parameter-missing-const | Partially checked |
Related Vulnerabilities
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
Related Guidelines
...
...
ISO/IEC 9899:1999 Section 6.7.3, "Type qualifiers"
Bibliography Bibliography
| [Dewhurst 2002] | Gotcha #25, "#define Literals" |
| [Saks 2000] |
...
02. Declarations and Initialization (DCL) 02. Declarations and Initialization (DCL)