2008/12/16 Dennis Clarke <dcla...@blastwave.org>: > >> Hi, >> >> The following program segfaults when compiled with gcc >> but runs fine when compiled with g++ or icc (the intel C compiler) >> >> #include <stdio.h> >> struct Hello { >> char world[20]; >> }; >> struct Hello s(){ >> struct Hello r; >> r.world[0]='H'; >> r.world[1]='\0'; >> return r; >> } >> >> int main(){ >> printf("%s\n",s().world); >> } >> >> Assigning s() to a variable and then using the variable avoids the >> segfault. > > compiles and works fine with GCC 4.3.2 on Solaris 8/9/10 sun4m/sun4u/i386 > > $ /opt/csw/gcc4/bin/gcc -v -o foo.o -c foo.c > Using built-in specs. > Target: sparc-sun-solaris2.8 > Configured with: ../gcc-4.3.2/configure --prefix=/opt/csw/gcc4 > --with-local-prefix=/opt/csw --with-as=/usr/ccs/bin/as --without-gnu-ld > --with-ld=/usr/ccs/bin/ld --with-cpu=v7 --enable-threads=posix > --enable-nls --enable-shared --enable-languages=c,c++,fortran,objc > --with-gmp=/opt/csw --with-mpfr=/opt/csw --enable-multilib > --with-included-gettext --with-libiconv-prefix=/opt/csw --with-x > --enable-java-awt=xlib --with-system-zlib --enable-bootstrap > Thread model: posix > gcc version 4.3.2 (GCC) > COLLECT_GCC_OPTIONS='-v' '-o' 'foo.o' '-c' '-mcpu=v7' > /opt/csw/gcc4/libexec/gcc/sparc-sun-solaris2.8/4.3.2/cc1 -quiet -v foo.c > -quiet -dumpbase foo.c -mcpu=v7 -auxbase-strip foo.o -version -o > /var/tmp//ccAHrz2q.s > ignoring nonexistent directory > "/opt/csw/gcc4/lib/gcc/sparc-sun-solaris2.8/4.3.2/../../../../sparc-sun-solaris2.8/include" > #include "..." search starts here: > #include <...> search starts here: > /opt/csw/include > /opt/csw/gcc4/include > /opt/csw/gcc4/lib/gcc/sparc-sun-solaris2.8/4.3.2/include > /opt/csw/gcc4/lib/gcc/sparc-sun-solaris2.8/4.3.2/include-fixed > /usr/include > End of search list. > GNU C (GCC) version 4.3.2 (sparc-sun-solaris2.8) > compiled by GNU C version 4.3.2, GMP version 4.2.2, MPFR version > 2.3.1. > warning: GMP header version 4.2.2 differs from library version 4.2.4. > GGC heuristics: --param ggc-min-expand=47 --param ggc-min-heapsize=32768 > Compiler executable checksum: 1ac791ab3c2b7cc8775dc74d45095fef > COLLECT_GCC_OPTIONS='-v' '-o' 'foo.o' '-c' '-mcpu=v7' > /usr/ccs/bin/as -V -Qy -s -xarch=v8 -o foo.o /var/tmp//ccAHrz2q.s > /usr/ccs/bin/as: Sun WorkShop 6 2003/12/18 Compiler Common 6.0 Patch > 114802-02 > COMPILER_PATH=/opt/csw/gcc4/libexec/gcc/sparc-sun-solaris2.8/4.3.2/:/opt/csw/gcc4/libexec/gcc/sparc-sun-solaris2.8/4.3.2/:/opt/csw/gcc4/libexec/gcc/sparc-sun-solaris2.8/:/opt/csw/gcc4/lib/gcc/sparc-sun-solaris2.8/4.3.2/:/opt/csw/gcc4/lib/gcc/sparc-sun-solaris2.8/:/usr/ccs/bin/ > LIBRARY_PATH=/opt/csw/gcc4/lib/gcc/sparc-sun-solaris2.8/4.3.2/:/usr/ccs/lib/:/opt/csw/gcc4/lib/gcc/sparc-sun-solaris2.8/4.3.2/../../../:/lib/:/usr/lib/ > COLLECT_GCC_OPTIONS='-v' '-o' 'foo.o' '-c' '-mcpu=v7' > > $ /opt/csw/gcc4/bin/gcc -v -o foo.s -S -c foo.c > Using built-in specs. > Target: sparc-sun-solaris2.8 > Configured with: ../gcc-4.3.2/configure --prefix=/opt/csw/gcc4 > --with-local-prefix=/opt/csw --with-as=/usr/ccs/bin/as --without-gnu-ld > --with-ld=/usr/ccs/bin/ld --with-cpu=v7 --enable-threads=posix > --enable-nls --enable-shared --enable-languages=c,c++,fortran,objc > --with-gmp=/opt/csw --with-mpfr=/opt/csw --enable-multilib > --with-included-gettext --with-libiconv-prefix=/opt/csw --with-x > --enable-java-awt=xlib --with-system-zlib --enable-bootstrap > Thread model: posix > gcc version 4.3.2 (GCC) > COLLECT_GCC_OPTIONS='-v' '-o' 'foo.s' '-S' '-c' '-mcpu=v7' > /opt/csw/gcc4/libexec/gcc/sparc-sun-solaris2.8/4.3.2/cc1 -quiet -v foo.c > -quiet -dumpbase foo.c -mcpu=v7 -auxbase-strip foo.s -version -o foo.s > ignoring nonexistent directory > "/opt/csw/gcc4/lib/gcc/sparc-sun-solaris2.8/4.3.2/../../../../sparc-sun-solaris2.8/include" > #include "..." search starts here: > #include <...> search starts here: > /opt/csw/include > /opt/csw/gcc4/include > /opt/csw/gcc4/lib/gcc/sparc-sun-solaris2.8/4.3.2/include > /opt/csw/gcc4/lib/gcc/sparc-sun-solaris2.8/4.3.2/include-fixed > /usr/include > End of search list. > GNU C (GCC) version 4.3.2 (sparc-sun-solaris2.8) > compiled by GNU C version 4.3.2, GMP version 4.2.2, MPFR version > 2.3.1. > warning: GMP header version 4.2.2 differs from library version 4.2.4. > GGC heuristics: --param ggc-min-expand=47 --param ggc-min-heapsize=32768 > Compiler executable checksum: 1ac791ab3c2b7cc8775dc74d45095fef > COMPILER_PATH=/opt/csw/gcc4/libexec/gcc/sparc-sun-solaris2.8/4.3.2/:/opt/csw/gcc4/libexec/gcc/sparc-sun-solaris2.8/4.3.2/:/opt/csw/gcc4/libexec/gcc/sparc-sun-solaris2.8/:/opt/csw/gcc4/lib/gcc/sparc-sun-solaris2.8/4.3.2/:/opt/csw/gcc4/lib/gcc/sparc-sun-solaris2.8/:/usr/ccs/bin/ > LIBRARY_PATH=/opt/csw/gcc4/lib/gcc/sparc-sun-solaris2.8/4.3.2/:/usr/ccs/lib/:/opt/csw/gcc4/lib/gcc/sparc-sun-solaris2.8/4.3.2/../../../:/lib/:/usr/lib/ > COLLECT_GCC_OPTIONS='-v' '-o' 'foo.s' '-S' '-c' '-mcpu=v7' > > $ cat foo.s > .file "foo.c" > .section ".text" > .align 4 > .global s > .type s, #function > .proc 010 > s: > save %sp, -136, %sp > ld [%fp+64], %l0 > mov 72, %g1 > stb %g1, [%fp-36] > stb %g0, [%fp-35] > mov %l0, %g1 > add %fp, -36, %g2 > mov 20, %g3 > mov %g1, %o0 > mov %g2, %o1 > mov %g3, %o2 > call memcpy, 0 > nop > mov %l0, %i0 > restore > jmp %o7+12 > nop > .size s, .-s > .section ".rodata" > .align 8 > .LLC0: > .asciz "%s\n" > .section ".text" > .align 4 > .global main > .type main, #function > .proc 04 > main: > save %sp, -168, %sp > add %fp, -36, %g1 > st %g1, [%sp+64] > call s, 0 > nop > unimp 20 > ld [%fp-36], %g1 > st %g1, [%fp-64] > ld [%fp-32], %g1 > st %g1, [%fp-60] > ld [%fp-28], %g1 > st %g1, [%fp-56] > ld [%fp-24], %g1 > st %g1, [%fp-52] > ld [%fp-20], %g1 > st %g1, [%fp-48] > add %fp, -64, %g2 > sethi %hi(.LLC0), %g1 > or %g1, %lo(.LLC0), %o0 > mov %g2, %o1 > call printf, 0 > nop > restore > jmp %o7+8 > nop > .size main, .-main > .ident "GCC: (GNU) 4.3.2" > $ > $ > $ /opt/csw/gcc4/bin/gcc -o foo foo.s > $ ./foo > H > > works right ? > > Dennis Clarke > http://www.blastwave.org/ > >
sal...@salmin:~/testdir/c$ gcc string_hello.c -o string_hello sal...@salmin:~/testdir/c$ ./string_hello эW°▒Ъ It's not a segfault but obviously a wrong behavior. gcc version 4.3.2 (Debian 4.3.2-1) Linux salmin 2.6.26-1-amd64 #1 SMP Sat Nov 8 18:25:23 UTC 2008 x86_64 GNU/Linux