From: Erik P. <epe...@iv...> - 2012-10-25 02:28:56
|
On Thu, 25 Oct 2012, Maarten Brock wrote: > Hi all, > > In recent regression tests there are a few warnings about pointers losing > their const qualifier in code like this: > char *s = "abc"; > > Now my question is if this "abc" string literal is constant or not? > SDCC thinks it is because it likes to put it in unmodifiable code memory > (ROM). > But GCC thinks it's not. It even allows *s='A'; So apparently it didn't > even bother to put it in a write-protected segment for the MMU. > > Can anyone point to the definitive answer? > > Maarten Section 6.4.5 "String literals" of ISO/IEC 9899:1999 among other things says: In translation phase 7, a byte or code of value zero is appended to each multibyte character sequence that results from a string literal or literals. The multibyte character sequence is then used to initialize an array of static storage duration and length just sufficient to contain the sequence. For character string literals, the array elements have type char, and are initialized with the individual bytes of the multibyte character sequence; [similarly for wide string literals] So my reading of this is that the individual characters are not const. However, the next paragraph in the standard states: If the program attempts to modify such an array, the behavior is undefined. So even if it's not const, we are still allowed to place the array in the (presumably read-only) code address space. Erik |