Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

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
bgColor#FFCCCC
langc
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
bgColor#ffcccc
langc
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

Compass/ROSE

 

 

Can detect violations of this recommendation while checking for violations of recommendation DCL00-C. Const-qualify immutable objects

ECLAIR

Include Page
ECLAIR_V
ECLAIR_V

CC2.DCL13

Fully implemented

LDRA tool suite

Include Page
LDRA_V
LDRA_V

62 D

Fully implemented

PRQA QA-C
Include Page
PRQA_V
PRQA_V

3673
0431(C)

Fully implemented

...

Bibliography

[ISO/IEC 9899:2011]Annex I "Common Warnings"

 

...