I have stumbled upon a problem that, I believe, can be attributed to a bug in
GCC. The following source code can be used to reproduce the problem:


int foo(void)
{
   char * str = "test";
   str[1] = 'a';
   return 0;
}

int main() {
  foo();
  return 0;
}


On a Solaris 10 system, I can compile and execute this code successfully using
the following compiler: 

# /usr/bin/cc -V
cc: Sun C 5.9 SunOS_i386 Patch 124868-01 2007/07/12
usage: cc [ options] files.  Use 'cc -flags' for details

If I try to do the same with GCC on my linux box, I get a segmentation fault on
str[1] = 'a'. Here are the details:

$ gcc -v -save-temps tst.c
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v
--enable-languages=c,c++,fortran,objc,obj-c
++,treelang --prefix=/usr --enable-shared --with-system-zlib
--libexecdir=/usr/l
ib --without-included-gettext --enable-threads=posix --enable-nls
--with-gxx-inc
lude-dir=/usr/include/c++/4.2 --program-suffix=-4.2 --enable-clocale=gnu
--enabl
e-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-targets=all
--enable-c
hecking=release --build=i486-linux-gnu --host=i486-linux-gnu
--target=i486-linux
-gnu
Thread model: posix
gcc version 4.2.4 (Ubuntu 4.2.4-1ubuntu4)
 /usr/lib/gcc/i486-linux-gnu/4.2.4/cc1 -E -quiet -v tst.c -mtune=generic
-fpch-p
reprocess -o tst.i
ignoring nonexistent directory "/usr/local/include/i486-linux-gnu"
ignoring nonexistent directory
"/usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../i4
86-linux-gnu/include"
ignoring nonexistent directory "/usr/include/i486-linux-gnu"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc/i486-linux-gnu/4.2.4/include
 /usr/include
End of search list.
 /usr/lib/gcc/i486-linux-gnu/4.2.4/cc1 -fpreprocessed tst.i -quiet -dumpbase
tst
.c -mtune=generic -auxbase tst -version -fstack-protector -fstack-protector -o
t
st.s
GNU C version 4.2.4 (Ubuntu 4.2.4-1ubuntu4) (i486-linux-gnu)
        compiled by GNU C version 4.2.4 (Ubuntu 4.2.4-1ubuntu4).
GGC heuristics: --param ggc-min-expand=64 --param ggc-min-heapsize=64446
Compiler executable checksum: cbbe762aad92f3ea8e83d46e5489fd3e
 as --traditional-format -V -Qy -o tst.o tst.s
GNU assembler version 2.18.0 (i486-linux-gnu) using BFD version (GNU Binutils
fo
r Ubuntu) 2.18.0.20080103
 /usr/lib/gcc/i486-linux-gnu/4.2.4/collect2 --eh-frame-hdr -m elf_i386
--hash-st
yle=both -dynamic-linker /lib/ld-linux.so.2
/usr/lib/gcc/i486-linux-gnu/4.2.4/..
/../../../lib/crt1.o /usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib/crti.o
/u
sr/lib/gcc/i486-linux-gnu/4.2.4/crtbegin.o -L/usr/lib/gcc/i486-linux-gnu/4.2.4
-
L/usr/lib/gcc/i486-linux-gnu/4.2.4
-L/usr/lib/gcc/i486-linux-gnu/4.2.4/../../../
../lib -L/lib/../lib -L/usr/lib/../lib
-L/usr/lib/gcc/i486-linux-gnu/4.2.4/../..
/.. tst.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed
-lgcc_s
 --no-as-needed /usr/lib/gcc/i486-linux-gnu/4.2.4/crtend.o
/usr/lib/gcc/i486-lin
ux-gnu/4.2.4/../../../../lib/crtn.o

$ ./a.out
Segmentation fault

Interestingly enough, if I declare str as :

   char str[] = "test";

rather than:

   char * str = "test";

the code will compile and execute properly.

I tried using -Wall and -pedantic to check whether GCC would produce any
warnings but that does not seem to be the case.

I got the same results with another version of GCC as well. Here are the
details:

$ gcc -v -save-temps tst.c
Reading specs from /usr/lib/gcc-lib/i486-slackware-linux/3.3.6/specs
Configured with: ../gcc-3.3.6/configure --prefix=/usr --enable-shared
--enable-t
hreads=posix --enable-__cxa_atexit --disable-checking --with-gnu-ld --verbose
--
target=i486-slackware-linux --host=i486-slackware-linux
Thread model: posix
gcc version 3.3.6
 /usr/lib/gcc-lib/i486-slackware-linux/3.3.6/cc1 -E -quiet -v -D__GNUC__=3
-D__G
NUC_MINOR__=3 -D__GNUC_PATCHLEVEL__=6 tst.c tst.i
ignoring nonexistent directory "/usr/i486-slackware-linux/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc-lib/i486-slackware-linux/3.3.6/include
 /usr/include
End of search list.
 /usr/lib/gcc-lib/i486-slackware-linux/3.3.6/cc1 -fpreprocessed tst.i -quiet
-du
mpbase tst.c -auxbase tst -version -o tst.s
GNU C version 3.3.6 (i486-slackware-linux)
        compiled by GNU C version 3.3.6.
GGC heuristics: --param ggc-min-expand=90 --param ggc-min-heapsize=113245

/usr/lib/gcc-lib/i486-slackware-linux/3.3.6/../../../../i486-slackware-linux/bi
n/as -V -Qy -o tst.o tst.s
GNU assembler version 2.15.92.0.2 (i486-slackware-linux) using BFD version
2.15.
92.0.2 20040927
 /usr/lib/gcc-lib/i486-slackware-linux/3.3.6/collect2 --eh-frame-hdr -m
elf_i386
 -dynamic-linker /lib/ld-linux.so.2
/usr/lib/gcc-lib/i486-slackware-linux/3.3.6/
../../../crt1.o /usr/lib/gcc-lib/i486-slackware-linux/3.3.6/../../../crti.o
/usr
/lib/gcc-lib/i486-slackware-linux/3.3.6/crtbegin.o
-L/usr/lib/gcc-lib/i486-slack
ware-linux/3.3.6
-L/usr/lib/gcc-lib/i486-slackware-linux/3.3.6/../../../../i486-
slackware-linux/lib -L/usr/lib/gcc-lib/i486-slackware-linux/3.3.6/../../..
tst.o
 -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s
--no-as-
needed /usr/lib/gcc-lib/i486-slackware-linux/3.3.6/crtend.o
/usr/lib/gcc-lib/i48
6-slackware-linux/3.3.6/../../../crtn.o

$ ./a.out
Segmentation fault

Any ideas?

Cheers,
Iran Rocha


-- 
           Summary: Access to char * generates segmentation fault
           Product: gcc
           Version: 4.2.4
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: hxdg21 at yahoo dot com
 GCC build triplet: i486-linux-gnu
  GCC host triplet: i486-linux-gnu
GCC target triplet: i486-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41318

Reply via email to