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/