13400 – [3.4 Regression] Compiled code crashes storing to read-only location (original) (raw)

The following program:

typedef struct {int c, l; char ch[3];} pstr; const pstr ao = {2, 2, "OK"}; const pstr * const a = &ao;

int main(void) { if (a->ch[a->l]) { ((char *)a->ch)[a->l] = 0; } return 0; }

segfaults when compiled using `-O' (or better optimisation). Without optimisation the store is not executed and the program runs fine.

I tried CVS gcc (updated DEC 14, 04:28 CET 2003) on Athlon-XP running Debian Woody (configured using '--enable-languages=c' as the only option). The problem does not appear in 20031029 snapshot, but is present in 20031105 snapshot.

By the way, my original problem is in GNU Pascal. Constant Pascal strings are stored in .rodata section and compiler makes sure that the string is null terminated. On the other hand variable strings need not be null terminated. When convering Pascal strings to C strings GPC generates code to null terminate the strings which are not already null terminated. The C program above tries to reproduce the code GPC produces.