...
At compile time, string literals are used to create an array of static storage duration of sufficient length to contain the character sequence and a null-termination character. It is unspecified whether these arrays are distinct. The behavior is undefined if a program attempts to modify string literals but frequently results in an access violation because string literals are typically stored in read-only memory. See also undefined behavior 33 of Annex J of the C standard [ISO/IEC 9899:2011].
...
In this noncompliant code example, the char
pointer p
is initialized to the address of a string literal. Attempting to modify the string literal results in undefined behavior.
Code Block | ||||
---|---|---|---|---|
| ||||
char *p = "string literal"; p[0] = 'S'; |
...
A compliant solution avoids modifying a const
object, even if it is possible to obtain a non-const
pointer to such an object by calling a standard C library function, such as strrchr()
. To reduce the risk of callers of get_dirname()
passing constant objects to the function, the argument is declared to be a non-const
pointer. Although converting a string literal to non-const
char*
is permitted by the language, conforming compilers could issue a diagnostic for such code. See also EXP05-C. Do not cast away a const qualification.
Code Block | ||||
---|---|---|---|---|
| ||||
char* get_dirname(char* pathname) { char* slash; slash = strrchr(pathname, '/'); if (slash) *slash = '\0'; return pathname; } int main() { char pathname[] = __FILE__; /* calling get_dirname(__FILE__) may be diagnosed */ puts(get_dirname(pathname)); return 0; } |
...
Tool | Version | Checker | Description | ||||||
---|---|---|---|---|---|---|---|---|---|
| 157 S | Partially implemented. | |||||||
Splint |
|
| |||||||
Compass/ROSE | Can detect simple violations of this rule. | ||||||||
PRQA QA-C |
| 0556 | Partially implemented |
Related Vulnerabilities
...
ISO/IEC TR 17961 (Draft) Modifying string literals [strmod]
Bibliography
[Summit 1995] comp.lang.c FAQ list, Question 1.32
[Plum 1991] Topic 1.26, "strings—string literals"
...