...
In C, function arguments are passed by value rather than by reference. Although a function may change the values passed in, these changed values are discarded once the function returns. For this reason, many programmers assume a function will not change its arguments , and that declaring the function's parameters as const
is unnecessary.
Code Block |
---|
void foo(int x) {
x = 3; /* Visible only in the function. */
/* ... */
}
|
Pointers behave in a similar fashion. A function may change a pointer to reference a different object, or NULL
, yet that change is discarded once the function exits. Consequently, declaring a pointer as const
is unnecessary.
Code Block |
---|
void foo(int *x) {
x = NULL; /* Visible only in the function. */
/* ... */
}
|
Noncompliant Code Example
Unlike passed-by-value arguments and pointers, pointed-to values are a concern. A function may modify a value referenced by a pointer argument, leading to a side effect that persists even after the function exits. Modification of the pointed-to value is not diagnosed by the compiler, which assumes this behavior was the intended behavior.
Code Block | ||||
---|---|---|---|---|
| ||||
void foo(int *x) {
if (x != NULL) {
*x = 3; /* Visible outside function. */
}
/* ... */
}
|
If the function parameter is const
-qualified, any attempt to modify the pointed-to value should cause the compiler to issue a diagnostic message.
Code Block | ||||
---|---|---|---|---|
| ||||
void foo(const int *x) {
if (x != NULL) {
*x = 3; /* Compiler should generate diagnostic message. */
}
/* ... */
}
|
As a result, the const
violation must be resolved before the code can be compiled without a diagnostic message being issued.
...
In the first strcat_nc()
call, the compiler generates a warning about attempting to cast away const
on c_str2
because strcat_nc()
does not modify its second argument yet fails to declare it const
.
...
In the final strcat_nc()
call, the compiler generates a warning about attempting to cast away const
on c_str4
, which is a valid warning.
...
The const
-qualification of the second argument, s2
, eliminates the spurious warning in the initial invocation but maintains the valid warning on the final invocation in which a const
-qualified object is passed as the first argument (which can change). Finally, the middle strcat()
invocation is now valid , as because c_str3
is a valid destination string and may be safely modified.
...
Tool | Version | Checker | Description | ||||||
---|---|---|---|---|---|---|---|---|---|
|
| Can detect violations of this recommendation while checking for violations of recommendation DCL00-C. Const-qualify immutable objects | |||||||
| CC2.DCL13 | Fully implemented | |||||||
| 62 D | Fully implemented | |||||||
PRQA QA-C |
| 3673 | Fully implemented |
...
CERT C++ Secure Coding Standard | DCL13-CPP. Declare function parameters that are pointers to values not changed by the function as const |
ISO/IEC TR 24772:2013 | Passing Parameters and Return Values [CSJ] |
Bibliography
[ISO/IEC 9899:2011] | Annex I "Common Warnings" |
...