rationale for eliding modifications to string constants

Ian Lance Taylor iant@google.com
Tue Sep 14 19:38:00 GMT 2010


Godmar Back <godmar@gmail.com> writes:

> this may be a FAQ - in my class today when discussing how gcc
> generates code for x86, I was stumped when I showed an example of how
> gcc handles attempts to modify (read-only) string literals/constants.
> (I'm sending this to gcc rather than gcc-help because I'm asking for a
> design rationale - I believe I understand the semantics of string
> constants in C. If in appropriate, I'm happy to resend there.)
>
> Specifically, I was surprised to see that gcc 4.1.2, when invoked with
> -O, simply elided the offending statement s[0] = 'H' in the example
> below.
>
> int
> main()
> {
>     char * s = (char *)"hello";     // read-only
>     printf("%s\n", s);
>     s[0] = 'H';    // gcc -O elides this
>     printf("%s\n", s);
>     return 0;
> }
>
> Could someone briefly provide justification/rationale for this decision?
>
> Is the rationale simply that since "the behavior of a program that
> attempts to modify a string constant is undefined" (K&R) you felt
> justified in silently discarding it (rather than letting it proceed or
> cause a runtime error if the string literal is mapped in a read-only
> section of the address space?)
>
> I note that even though the compiler knows it is taking advantage of a
> rule that allows it to produce code that contains undefined behavior,
> there appears to be no warning option to alert the user. Notably, gcc
> -Wall -Wwrite-string is silent for the above program.

I think this is simply a bug.  It doesn't happen with current gcc.  With
gcc 4.4.3 the assignment is being eliminated because it is considered to
be dead code.  

I agree that it is an error for gcc to simply eliminate this assignment
with no warning.

Ian



More information about the Gcc mailing list