https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118621
Bug ID: 118621 Summary: On PowerPC, taking address-of stack-allocated struct variable gets 0xffffffffffffffff Product: gcc Version: 14.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: ej_zg at hotmail dot com Target Milestone: --- Created attachment 60245 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=60245&action=edit LINALG-pp-LU_det.i zipped, as uncompressed is 1.267MB This happens on (in Debian terms): alpha powerpc ppc64. See at the bottom other misbehaviour with the same code, where it gives numerically wrong results instead of SEGV. $ gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/libexec/gcc/powerpc64-linux-gnu/14/lto-wrapper Target: powerpc64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Debian 14.2.0-14' --with-bugurl=file:///usr/share/doc/gcc-14/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,rust --prefix=/usr --with-gcc-major-version-only --program-suffix=-14 --program-prefix=powerpc64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --with-libphobos-druntime-only=yes --enable-objc-gc=auto --enable-secureplt --disable-softfloat --enable-targets=powerpc64-linux,powerpc-linux --enable-multiarch --disable-werror --with-long-double-128 --enable-multilib --enable-checking=release --build=powerpc64-linux-gnu --host=powerpc64-linux-gnu --target=powerpc64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=4 Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 14.2.0 (Debian 14.2.0-14) The build command-line: powerpc64-linux-gnu-gcc -c -I. -I/usr/include "-I/usr/lib/powerpc64-linux-gnu/perl5/5.40/PDL/Core" -D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fwrapv -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -g -O0 -Werror=implicit-function-declaration -ffile-prefix-map=/home/sebastic/tmp/debian/libpdl-gsl-perl-2.101=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -DVERSION=\"2.101\" -DXS_VERSION=\"2.101\" -fPIC "-I/usr/lib/powerpc64-linux-gnu/perl/5.40/CORE" lib/PDL/GSL/LINALG-pp-LU_det.c -o lib/PDL/GSL/LINALG-pp-LU_det.o There was no compiler output (errors, warnings, etc). The code works across many other architectures, including amd64, arm64, s390x, hppa. See footnote at the end for failures (non-SEGV-ing) on mips64el, sparc64. I attach the *.i file - it's zipped because this form says max 1000KB, and it's 1267KB. Sorry. When run (by t/gsl_linalg.t), it SEGVs, giving this gdb log - note that &m became 0xffffffffffffffff, which is clearly wrong: dpkg-buildpackage: info: binary and diff upload (original source NOT included) $ gdb perl -ex 'run -Mblib t/gsl_linalg.t' GNU gdb (Debian 16.1-1) 16.1 Copyright (C) 2024 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "powerpc64-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <https://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from perl... Reading symbols from /usr/lib/debug/.build-id/55/28ab0590d43e911804f39a805c4984b21d0473.debug... Starting program: /usr/bin/perl -Mblib t/gsl_linalg.t [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/powerpc64-linux-gnu/libthread_db.so.1". ok 1 - ndarrays are equal ok 2 - ndarrays are equal ok 3 - tridiag ok 4 - ndarrays are equal Program received signal SIGSEGV, Segmentation fault. 0x00003ffff6c5be20 in gsl_linalg_complex_LU_det (LU=0xffffffffffffffff, signum=0) at luc.c:514 warning: 514 luc.c: No such file or directory (gdb) bt full #0 0x00003ffff6c5be20 in gsl_linalg_complex_LU_det (LU=0xffffffffffffffff, signum=0) at luc.c:514 i = <optimized out> n = <optimized out> det = <optimized out> #1 0x00003ffff6f6936c in pdl_LU_det_readdata (__privtrans=0x1004900a0) at lib/PDL/GSL/LINALG-pp-LU_det.c:120 m = {size1 = 4, size2 = 4, tda = 4, data = 0x1004dfc50, block = 0x0, owner = 0} z = 3.4766779035665179e-310 + 2.1242460109729937e-314i __tdims = 0x1004dfb20 __tdims0 = 1 __tdims1 = 1 __offsp = 0x100486d50 LU_datap = 0x1004dfc50 signum_datap = 0x10048f5a0 det_datap = 0x1004df610 PDL_err = {error = PDL_ENONE, message = 0x0, needs_free = 0 '\000'} __brcloopval = 0 __tind0 = 0 __tind1 = 0 __tnpdls = 0 __tinc0_LU = 0 __tinc0_signum = 0 __tinc0_det = 0 __tinc1_LU = 0 __tinc1_signum = 0 __tinc1_det = 0 __inc_LU_n = <optimized out> __inc_LU_m = <optimized out> #2 0x00003ffff7a15fb4 in pdl__ensure_trans (trans=trans@entry=0x1004900a0, what=what@entry=4, inputs_only=inputs_only@entry=0 '\000', recurse_count=recurse_count@entry=0) at lib/PDL/Core/pdlapi.c:109 PDL_err_local = {error = PDL_ENONE, message = 0x0, needs_free = 0 '\000'} vtable = 0x3ffff6f80388 <pdl_LU_det_vtable> i = <optimized out> istart = 2 iend = 3 PDL_err = <optimized out> vtable = 0x3ffff6f80388 <pdl_LU_det_vtable> j = <optimized out> flag = <optimized out> par_pvaf = <optimized out> j_end = <optimized out> #3 0x00003ffff7a19474 in pdl_make_trans_mutual (trans=0x1004900a0) at lib/PDL/Core/pdlapi.c:764 PDL_err_local = {error = PDL_EUSERERROR, message = 0x101097f68 "", needs_free = 0 '\000'} PDL_err = {error = PDL_ENONE, message = <optimized out>, needs_free = <optimized out>} vtable = 0x3ffff6f80388 <pdl_LU_det_vtable> pdls = <optimized out> i = 3 npdls = <optimized out> nparents = <optimized out> nchildren = <optimized out> disable_back = <optimized out> dataflow = 0 '\000' wasnull = <optimized out> #4 0x00003ffff6f6988c in pdl_run_LU_det (LU=0x100515dd0, signum=0x10048f410, det=0x1004df480) at lib/PDL/GSL/LINALG-pp-LU_det.c:166 PDL_err = {error = PDL_ENONE, message = 0x0, needs_free = 0 '\000'} __privtrans = 0x1004900a0 badflag_cache = 0 '\000' #5 0x00003ffff6f646d4 in XS_PDL_LU_det (my_perl=0x10045a2a0, cv=0x101097f68) at lib/PDL/GSL/LINALG.xs:111 bless_stash = 0x100c3bd10 parent = 0x101083b30 det = 0x1004df480 RETVAL = {error = PDL_EUSERERROR, message = 0x2802284400000000 <error: Cannot access memory at address 0x2802284400000000>, needs_free = 0 '\000'} det_SV = 0x101096238 objname = 0x100be5b90 "PDL" nreturn = 1 LU = 0x100515dd0 signum = 0x10048f410 sp = 0x10045fe60 ax = 1 mark = 0x10045fe60 items = 2 #6 0x0000000100151f1c in Perl_rpp_invoke_xs (my_perl=0x10045a2a0, cv=<optimized out>) at inline.h:1193 No locals. #7 Perl_pp_entersub (my_perl=0x10045a2a0) at pp_hot.c:6495 markix = 0 is_scalar = false gv = 0x1001462fc <Perl_pp_nextstate+140> cv = <optimized out> cx = <optimized out> old_savestack_ix = <optimized out> sv = 0x101083b18 do_ref = <optimized out> p_ = <optimized out> p_ = <optimized out> p_ = <optimized out> p_ = <optimized out> #8 0x00000001001eeb5c in Perl_runops_standard (my_perl=0x10045a2a0) at run.c:41 op = <optimized out> #9 0x0000000100097f54 in S_run_body (my_perl=<optimized out>, oldscope=<optimized out>) at perl.c:2860 No locals. #10 perl_run (my_perl=0x10045a2a0) at perl.c:2780 oldscope = 1 ret = <optimized out> cur_env = {je_prev = 0x10045a5b0, je_buf = {{__jmpbuf = {3835103292886016385, 4299521792, 3835160186928002545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70368609951744, 70368609942384, 4299433704, 70368744174408, 3, 70368744174576, 70368744174376, 1, 4299530912, -3690978264, 0 <repeats 42 times>}, __mask_was_saved = 0, __saved_mask = {__val = {4299528576, 4521984, 4299530912, 70368744173040, 69059281371852151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70368609951744, 70368609942384}}}}, je_ret = 3, je_mustcatch = false, je_old_delaymagic = 0, je_old_stack_hwm = 3} p_ = <optimized out> #11 0x0000000100060ac0 in main (argc=<optimized out>, argv=<optimized out>, env=<optimized out>) at perlmain.c:127 exitstatus = <optimized out> i = <optimized out> Footnote: the test fails without SEGV on two other architectures, which might shed light: mips64el: # Failed test 'ndarrays are equal' # at t/gsl_linalg.t line 38. # 1/1 values do not match # got: CDouble D [] (P ) -0.07329228-0.07329228i # expected: CDouble D [] (P ) -0.07329228-8.64040000000001e-11i sparc64: # Failed test 'ndarrays are equal' # at t/gsl_linalg.t line 38. # 1/1 values do not match # got: CDouble D [] (P ) 0 # expected: CDouble D [] (P ) -0.07329228-8.64040000000001e-11i