[Bug c/12818] New: -fwritable strings triggers bad code generation
gcc-bugzilla at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Tue Oct 28 22:21:00 GMT 2003
PLEASE REPLY TO gcc-bugzilla@gcc.gnu.org ONLY, *NOT* gcc-bugs@gcc.gnu.org.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12818
Summary: -fwritable strings triggers bad code generation
Product: gcc
Version: 3.4
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: fnf at ninemoons dot com
CC: gcc-bugs at gcc dot gnu dot org
GCC build triplet: i686-pc-linux-gnu
GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu
When using -fwritable-strings, the compiler emits two copies of the
strings. In the supplied example, one of the copies is emitted into a
data area that is supposed to contain pointers to the strings.
In checking some older versions of gcc, it would appear that this
bug first appeared in late May 2003 or early June 2003.
Environment:
System: Linux fred.ninemoons.com 2.4.20-20.9 #1 Mon Aug 18 11:27:43 EDT 2003 i686 athlon i386 GNU/Linux
Architecture: i686
host: i686-pc-linux-gnu
build: i686-pc-linux-gnu
target: i686-pc-linux-gnu
configured with: /src/sourceware/gcc/gcc/configure -v --prefix=/usr/local/sourceware --enable-languages=c,c++
How-To-Repeat:
Here is the source code:
char *names[] = {"alice", "bob", "john"};
main ()
{
printf ("names[0] = %s\n", names[0]);
}
This works without -fwritable-strings:
$ gcc -o j j.c
$ ./j
names[0] = alice
$
It coredumps with -fwritable-strings:
$ gcc -fwritable-strings -o j j.c
$ ./j
Segmentation fault (core dumped)
$
Here is the generated code:
.file "j.c"
.data
.LC0:
.string "alice"
.LC1:
.string "bob"
.LC2:
.string "john"
.globl names
.align 4
.type names, @object
.size names, 12
names:
.LC3:
.string "alice"
.long .LC3
.LC4:
.string "bob"
.long .LC4
.LC5:
.string "john"
.long .LC5
.LC6:
.string "names[0] = %s\n"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
subl %eax, %esp
movl names, %eax
movl %eax, 4(%esp)
movl $.LC6, (%esp)
call printf
leave
ret
.size main, .-main
.section .note.GNU-stack,"",@progbits
.ident "GCC: (GNU) 3.4 20031028 (experimental)"
>Fix:
Workaround is to not use -fwritable-strings
More information about the Gcc-bugs
mailing list