Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Updated references from C11->C23

According to the C Standard, 6.4.5, paragraph 3 [ISO/IEC 9899:20112024]:

A character string literal is a sequence of zero or more multibyte characters enclosed in double-quotes, as in "xyz". A UTF−8 UTF-8 string literal is the same, except prefixed by u8. A wide wchar_t string literal is the same, except prefixed by the letter L, u, or UL. A UTF-16 string literal is the same, except prefixed by u. A UTF-32 string literal is the same, except prefixed by U. Collectively, wchar_t, UTF-16, and UTF-32 string literals are called wide string literals.

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 terminating null character. String literals are usually referred to by a pointer to (or array of) characters. Ideally, they should be assigned only to pointers to (or arrays of) const char or const wchar_t. It is unspecified whether these arrays of string literals are distinct from each other. The behavior is undefined if a program attempts to modify any portion of a string literal. Modifying a string literal frequently results in an access violation because string literals are typically stored in read-only memory. (See undefined behavior 33.)

...

Partially implemented

Tool

Version

Checker

Description

Astrée
Include Page
Astrée_V
Astrée_V
string-literal-modfication
write-to-string-literal
Fully checked
Axivion Bauhaus Suite

Include Page
Axivion Bauhaus Suite_V
Axivion Bauhaus Suite_V

CertC-STR30Fully implemented
Compass/ROSE

Can detect simple violations of this rule

Coverity
Include Page
Coverity_V
Coverity_V
PWDeprecates conversion from a string literal to "char *"
Helix QAC

Include Page
Helix QAC_V
Helix QAC_V

C0556, C0752, C0753, C0754

C++3063, C++3064, C++3605, C++3606, C++3607


Klocwork

Include Page
Klocwork_V
Klocwork_V

CXX.OVERWRITE_CONST_CHARCERT.STR.ARG.CONST_TO_NONCONST
CERT.STR.ASSIGN.CONST_TO_NONCONST


LDRA tool suite
Include Page
LDRA_V
LDRA_V

157 S

Partially implemented
Parasoft C/C++test
Include Page
Parasoft_V
Parasoft_V

CERT_C-STR30-a
CERT_C-STR30-b

A string literal shall not be modified
Do not modify string literals

PC-lint Plus

Include Page
PC-lint Plus_V
PC-lint Plus_V

489, 1776

Partially supported

Polyspace Bug Finder

Include Page
Polyspace Bug Finder_V
Polyspace Bug Finder_V

CERT C: Rule STR30-CChecks for writing to const qualified object (rule fully covered)PRQA QA-C
Include Page
PRQA QA-C_vPRQA QA-C_v

0556, 0752, 0753, 0754

PRQA QA-C++
Include Page
cplusplus:PRQA QA-C++_Vcplusplus:PRQA QA-C++_V


3063, 3064, 3605, 3606, 3607, 3842 PVS-Studio

Include Page
PVS-Studio_V
PVS-Studio_V

V675
RuleChecker

Include Page
RuleChecker_V
RuleChecker_V

string-literal-modficationPartially checked
Splint

Include Page
Splint_V
Splint_V



TrustInSoft Analyzer

Include Page
TrustInSoft Analyzer_V
TrustInSoft Analyzer_V

mem_accessExhaustively verified (see one compliant and one non-compliant example).

...

Bibliography

[ISO/IEC 9899:20112024]6.4.5, "String Literals"
[Plum 1991]Topic 1.26, "Strings—String Literals"
[Summit 1995]comp.lang.c FAQ List, Question 1.32

...