From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id 122A03858D28; Mon, 28 Aug 2023 16:08:46 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 122A03858D28 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1693238926; bh=fJx2NWtYAi0e8InpTiDjqVy16lGRH+9YMAQ4wWqCa40=; h=From:To:Subject:Date:In-Reply-To:References:From; b=pXARxCjD5uMFbmeFHgpaJhKKN0o7BZhVWToQUus3HGgN82PXoPR+zP+j5g2GgKUEa FQrYU6/M5FbLF+3C8QtZbz/dLtDaEWjmd++qPirFg8eFZLAFTRb/+UaDeatubXqt1A z2r7y8wKI4eMzZkSnm/GqoztBtVkPffKDq46kcjI= From: "tg at mirbsd dot org" To: gcc-bugs@gcc.gnu.org Subject: [Bug target/111165] [13 regression] builtin strchr miscompiles on Debian/x32 with dietlibc Date: Mon, 28 Aug 2023 16:08:45 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: target X-Bugzilla-Version: 13.2.0 X-Bugzilla-Keywords: wrong-code X-Bugzilla-Severity: normal X-Bugzilla-Who: tg at mirbsd dot org X-Bugzilla-Status: WAITING X-Bugzilla-Resolution: X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: 13.3 X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 List-Id: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D111165 --- Comment #16 from Thorsten Glaser --- If I add -maddress-mode=3Dlong to the build of the expr.c file, then link i= t with the rest, it still fails. I=E2=80=99m not sure about reducing, and not sure about the cross-anything,= but I *did* get it to fail on amd64 now! (Just differently.) HOWEVER, I=E2=80=99m not s= ure whether this is from x32/amd64 mismatch or from the bug, as the resulting pattern differs. The code flow is roughly: eval.c from line 1608 onwards opens a temporary f= ile, dups it to stdout, calls funsub() from line 2147, and on return rewinds that file and restores stdout. This all is called from line 352 (where the jump = to the subroutine is), but the strlen in question is on line 399 in a different codepath (where the stuff immediately following '${' is parsed). They only = have the use of the variable 'sp' and the jumping past the first NUL in it in co= mmon (the funsub caller has 'sp =3D strnul(sp) + 1;' instead, but that=E2=80=99s= just 'sp+strlen(sp)', and changing the 'sp =3D cstrchr(sp, '\0') + 1;' to that (= which I did in upstream CVS HEAD now anyway) doesn=E2=80=99t =E2=80=9Cfix=E2=80= =9D the issue. In a Debian sid/amd64 chroot, with GCC 13.2.0-1 (as packaged in Debian), I = did: gcc-13 -g -fno-lto -fno-asynchronous-unwind-tables -fno-strict-aliasing -fstack-protector-strong -malign-data=3Dabi -fwrapv -I. -D_FORTIFY_SOURCE= =3D2 -DMKSH_BUILDMEAT -DMKSH_BUILDSH=3D1 -D_GNU_SOURCE -DSETUID_CAN_FAIL_WITH_EA= GAIN=3D1 -DHAVE_STRING_POOLING=3D2 -DHAVE_ATTRIBUTE_BOUNDED=3D0 -DHAVE_ATTRIBUTE_FOR= MAT=3D1 -DHAVE_ATTRIBUTE_NORETURN=3D1 -DHAVE_ATTRIBUTE_UNUSED=3D1 -DHAVE_ATTRIBUTE_= USED=3D1 -DHAVE_SYS_TIME_H=3D1 -DHAVE_TIME_H=3D1 -DHAVE_BOTH_TIME_H=3D1 -DHAVE_SYS_S= ELECT_H=3D1 -DHAVE_SELECT_TIME_H=3D1 -DHAVE_SYS_BSDTYPES_H=3D0 -DHAVE_SYS_FILE_H=3D1 -DHAVE_SYS_MKDEV_H=3D0 -DHAVE_SYS_MMAN_H=3D1 -DHAVE_SYS_PARAM_H=3D1 -DHAVE_SYS_PTEM_H=3D0 -DHAVE_SYS_RESOURCE_H=3D1 -DHAVE_SYS_SYSMACROS_H=3D1 -DHAVE_BSTRING_H=3D0 -DHAVE_GRP_H=3D1 -DHAVE_IO_H=3D0 -DHAVE_LIBGEN_H=3D1 -DHAVE_LIBUTIL_H=3D0 -DHAVE_PATHS_H=3D1 -DHAVE_STDINT_H=3D1 -DHAVE_STRINGS_= H=3D1 -DHAVE_TERMIOS_H=3D1 -DHAVE_ULIMIT_H=3D1 -DHAVE_VALUES_H=3D1 -DHAVE_CAN_INT= TYPES=3D1 -DHAVE_SIG_T=3D1 -DHAVE_STRERRORDESC_NP=3D1 -DHAVE_SYS_ERRLIST=3D1 -DHAVE_SIGABBREV_NP=3D1 -DHAVE_SYS_SIGNAME=3D0 -DHAVE_SIGDESCR_NP=3D1 -DHAVE_SYS_SIGLIST=3D1 -DHAVE_FLOCK=3D1 -DHAVE_LOCK_FCNTL=3D1 -DHAVE_RLIMIT= =3D1 -DHAVE_RLIM_T=3D1 -DHAVE_GET_CURRENT_DIR_NAME=3D1 -DHAVE_GETRANDOM=3D0 -DHAVE_GETRUSAGE=3D1 -DHAVE_GETSID=3D1 -DHAVE_GETTIMEOFDAY=3D1 -DHAVE_KILLP= G=3D1 -DHAVE_MEMMOVE=3D1 -DHAVE_MKNOD=3D0 -DHAVE_MMAP=3D1 -DHAVE_FTRUNCATE=3D1 -D= HAVE_NICE=3D1 -DHAVE_RENAME=3D1 -DHAVE_REVOKE=3D0 -DHAVE_POSIX_UTF8_LOCALE=3D0 -DHAVE_SEL= ECT=3D1 -DHAVE_SETRESUGID=3D1 -DHAVE_SETGROUPS=3D1 -DHAVE_SIGACTION=3D1 -DHAVE_STRE= RROR=3D0 -DHAVE_STRSIGNAL=3D0 -DHAVE_STRLCPY=3D0 -DHAVE_STRSTR=3D1 -DHAVE_FLOCK_DECL= =3D1 -DHAVE_REVOKE_DECL=3D1 -DHAVE_SYS_ERRLIST_DECL=3D1 -DHAVE_SYS_SIGLIST_DECL= =3D1 -DHAVE_ST_MTIMENSEC=3D0 -DHAVE_INTCONSTEXPR_RSIZE_MAX=3D0 -DHAVE_PERSISTENT_HISTORY=3D1 -DMKSH_BUILD_R=3D599 -c lalloc.c edit.c eval.= c exec.c expr.c funcs.c histrap.c jobs.c lex.c main.c misc.c shf.c syn.c tree.c var.c ulimit.c strlcpy.c gcc-13 -g -fno-lto -fno-asynchronous-unwind-tables -fno-strict-aliasing -fstack-protector-strong -malign-data=3Dabi -fwrapv -fno-lto -o mksh lall= oc.o edit.o eval.o exec.o expr.o funcs.o histrap.o jobs.o lex.o main.o misc.o sh= f.o syn.o tree.o var.o ulimit.o strlcpy.o ./mksh -c 'x=3Dq; x=3D${ echo a; typeset e=3D2; return 3; echo x$e;}; echo = .$x.' gcc-13 -g -fno-lto -fno-asynchronous-unwind-tables -fno-strict-aliasing -fstack-protector-strong -malign-data=3Dabi -fwrapv -I. -D_FORTIFY_SOURCE= =3D2 -DMKSH_BUILDMEAT -DMKSH_BUILDSH=3D1 -D_GNU_SOURCE -DSETUID_CAN_FAIL_WITH_EA= GAIN=3D1 -DHAVE_STRING_POOLING=3D2 -DHAVE_ATTRIBUTE_BOUNDED=3D0 -DHAVE_ATTRIBUTE_FOR= MAT=3D1 -DHAVE_ATTRIBUTE_NORETURN=3D1 -DHAVE_ATTRIBUTE_UNUSED=3D1 -DHAVE_ATTRIBUTE_= USED=3D1 -DHAVE_SYS_TIME_H=3D1 -DHAVE_TIME_H=3D1 -DHAVE_BOTH_TIME_H=3D1 -DHAVE_SYS_S= ELECT_H=3D1 -DHAVE_SELECT_TIME_H=3D1 -DHAVE_SYS_BSDTYPES_H=3D0 -DHAVE_SYS_FILE_H=3D1 -DHAVE_SYS_MKDEV_H=3D0 -DHAVE_SYS_MMAN_H=3D1 -DHAVE_SYS_PARAM_H=3D1 -DHAVE_SYS_PTEM_H=3D0 -DHAVE_SYS_RESOURCE_H=3D1 -DHAVE_SYS_SYSMACROS_H=3D1 -DHAVE_BSTRING_H=3D0 -DHAVE_GRP_H=3D1 -DHAVE_IO_H=3D0 -DHAVE_LIBGEN_H=3D1 -DHAVE_LIBUTIL_H=3D0 -DHAVE_PATHS_H=3D1 -DHAVE_STDINT_H=3D1 -DHAVE_STRINGS_= H=3D1 -DHAVE_TERMIOS_H=3D1 -DHAVE_ULIMIT_H=3D1 -DHAVE_VALUES_H=3D1 -DHAVE_CAN_INT= TYPES=3D1 -DHAVE_SIG_T=3D1 -DHAVE_STRERRORDESC_NP=3D1 -DHAVE_SYS_ERRLIST=3D1 -DHAVE_SIGABBREV_NP=3D1 -DHAVE_SYS_SIGNAME=3D0 -DHAVE_SIGDESCR_NP=3D1 -DHAVE_SYS_SIGLIST=3D1 -DHAVE_FLOCK=3D1 -DHAVE_LOCK_FCNTL=3D1 -DHAVE_RLIMIT= =3D1 -DHAVE_RLIM_T=3D1 -DHAVE_GET_CURRENT_DIR_NAME=3D1 -DHAVE_GETRANDOM=3D0 -DHAVE_GETRUSAGE=3D1 -DHAVE_GETSID=3D1 -DHAVE_GETTIMEOFDAY=3D1 -DHAVE_KILLP= G=3D1 -DHAVE_MEMMOVE=3D1 -DHAVE_MKNOD=3D0 -DHAVE_MMAP=3D1 -DHAVE_FTRUNCATE=3D1 -D= HAVE_NICE=3D1 -DHAVE_RENAME=3D1 -DHAVE_REVOKE=3D0 -DHAVE_POSIX_UTF8_LOCALE=3D0 -DHAVE_SEL= ECT=3D1 -DHAVE_SETRESUGID=3D1 -DHAVE_SETGROUPS=3D1 -DHAVE_SIGACTION=3D1 -DHAVE_STRE= RROR=3D0 -DHAVE_STRSIGNAL=3D0 -DHAVE_STRLCPY=3D0 -DHAVE_STRSTR=3D1 -DHAVE_FLOCK_DECL= =3D1 -DHAVE_REVOKE_DECL=3D1 -DHAVE_SYS_ERRLIST_DECL=3D1 -DHAVE_SYS_SIGLIST_DECL= =3D1 -DHAVE_ST_MTIMENSEC=3D0 -DHAVE_INTCONSTEXPR_RSIZE_MAX=3D0 -DHAVE_PERSISTENT_HISTORY=3D1 -DMKSH_BUILD_R=3D599 -c -o eval.o eval-13.i gcc-13 -g -fno-lto -fno-asynchronous-unwind-tables -fno-strict-aliasing -fstack-protector-strong -malign-data=3Dabi -fwrapv -fno-lto -o mksh lall= oc.o edit.o eval.o exec.o expr.o funcs.o histrap.o jobs.o lex.o main.o misc.o sh= f.o syn.o tree.o var.o ulimit.o strlcpy.o ./mksh -c 'x=3Dq; x=3D${ echo a; typeset e=3D2; return 3; echo x$e;}; echo = .$x.' So basically, I first compiled all the files, but with the options from the dietlibc build (modulo signames[]), against glibc, linked it, and verified = it works (output =E2=80=9C.a.=E2=80=9D). Then I built the .i file from the preprocessed output of the x32 dietlibc b= uild with the same options, for amd64, linked and ran it, and it did not give the exact identical bogus output, but first =E2=80=9Ca=E2=80=9D on a line by it= self, then =E2=80=9C..=E2=80=9D. Then I installed the Debian packages linux-libc-dev-x32-cross libc6-dev-x32-cross and preprocessed under x32 and built that on amd64=E2= =80=A6 gcc-13 -g -fno-lto -fno-asynchronous-unwind-tables -fno-strict-aliasing -fstack-protector-strong -malign-data=3Dabi -fwrapv -I. -D_FORTIFY_SOURCE= =3D2 -DMKSH_BUILDMEAT -DMKSH_BUILDSH=3D1 -D_GNU_SOURCE -DSETUID_CAN_FAIL_WITH_EA= GAIN=3D1 -DHAVE_STRING_POOLING=3D2 -DHAVE_ATTRIBUTE_BOUNDED=3D0 -DHAVE_ATTRIBUTE_FOR= MAT=3D1 -DHAVE_ATTRIBUTE_NORETURN=3D1 -DHAVE_ATTRIBUTE_UNUSED=3D1 -DHAVE_ATTRIBUTE_= USED=3D1 -DHAVE_SYS_TIME_H=3D1 -DHAVE_TIME_H=3D1 -DHAVE_BOTH_TIME_H=3D1 -DHAVE_SYS_S= ELECT_H=3D1 -DHAVE_SELECT_TIME_H=3D1 -DHAVE_SYS_BSDTYPES_H=3D0 -DHAVE_SYS_FILE_H=3D1 -DHAVE_SYS_MKDEV_H=3D0 -DHAVE_SYS_MMAN_H=3D1 -DHAVE_SYS_PARAM_H=3D1 -DHAVE_SYS_PTEM_H=3D0 -DHAVE_SYS_RESOURCE_H=3D1 -DHAVE_SYS_SYSMACROS_H=3D1 -DHAVE_BSTRING_H=3D0 -DHAVE_GRP_H=3D1 -DHAVE_IO_H=3D0 -DHAVE_LIBGEN_H=3D1 -DHAVE_LIBUTIL_H=3D0 -DHAVE_PATHS_H=3D1 -DHAVE_STDINT_H=3D1 -DHAVE_STRINGS_= H=3D1 -DHAVE_TERMIOS_H=3D1 -DHAVE_ULIMIT_H=3D1 -DHAVE_VALUES_H=3D1 -DHAVE_CAN_INT= TYPES=3D1 -DHAVE_SIG_T=3D1 -DHAVE_STRERRORDESC_NP=3D1 -DHAVE_SYS_ERRLIST=3D1 -DHAVE_SIGABBREV_NP=3D1 -DHAVE_SYS_SIGNAME=3D0 -DHAVE_SIGDESCR_NP=3D1 -DHAVE_SYS_SIGLIST=3D1 -DHAVE_FLOCK=3D1 -DHAVE_LOCK_FCNTL=3D1 -DHAVE_RLIMIT= =3D1 -DHAVE_RLIM_T=3D1 -DHAVE_GET_CURRENT_DIR_NAME=3D1 -DHAVE_GETRANDOM=3D0 -DHAVE_GETRUSAGE=3D1 -DHAVE_GETSID=3D1 -DHAVE_GETTIMEOFDAY=3D1 -DHAVE_KILLP= G=3D1 -DHAVE_MEMMOVE=3D1 -DHAVE_MKNOD=3D0 -DHAVE_MMAP=3D1 -DHAVE_FTRUNCATE=3D1 -D= HAVE_NICE=3D1 -DHAVE_RENAME=3D1 -DHAVE_REVOKE=3D0 -DHAVE_POSIX_UTF8_LOCALE=3D0 -DHAVE_SEL= ECT=3D1 -DHAVE_SETRESUGID=3D1 -DHAVE_SETGROUPS=3D1 -DHAVE_SIGACTION=3D1 -DHAVE_STRE= RROR=3D0 -DHAVE_STRSIGNAL=3D0 -DHAVE_STRLCPY=3D0 -DHAVE_STRSTR=3D1 -DHAVE_FLOCK_DECL= =3D1 -DHAVE_REVOKE_DECL=3D1 -DHAVE_SYS_ERRLIST_DECL=3D1 -DHAVE_SYS_SIGLIST_DECL= =3D1 -DHAVE_ST_MTIMENSEC=3D0 -DHAVE_INTCONSTEXPR_RSIZE_MAX=3D0 -DHAVE_PERSISTENT_HISTORY=3D1 -DMKSH_BUILD_R=3D599 -mx32 -E -o x.i eval.c -I/usr/x86_64-linux-gnux32/include gcc-13 -g -fno-lto -fno-asynchronous-unwind-tables -fno-strict-aliasing -fstack-protector-strong -malign-data=3Dabi -fwrapv -I. -D_FORTIFY_SOURCE= =3D2 -DMKSH_BUILDMEAT -DMKSH_BUILDSH=3D1 -D_GNU_SOURCE -DSETUID_CAN_FAIL_WITH_EA= GAIN=3D1 -DHAVE_STRING_POOLING=3D2 -DHAVE_ATTRIBUTE_BOUNDED=3D0 -DHAVE_ATTRIBUTE_FOR= MAT=3D1 -DHAVE_ATTRIBUTE_NORETURN=3D1 -DHAVE_ATTRIBUTE_UNUSED=3D1 -DHAVE_ATTRIBUTE_= USED=3D1 -DHAVE_SYS_TIME_H=3D1 -DHAVE_TIME_H=3D1 -DHAVE_BOTH_TIME_H=3D1 -DHAVE_SYS_S= ELECT_H=3D1 -DHAVE_SELECT_TIME_H=3D1 -DHAVE_SYS_BSDTYPES_H=3D0 -DHAVE_SYS_FILE_H=3D1 -DHAVE_SYS_MKDEV_H=3D0 -DHAVE_SYS_MMAN_H=3D1 -DHAVE_SYS_PARAM_H=3D1 -DHAVE_SYS_PTEM_H=3D0 -DHAVE_SYS_RESOURCE_H=3D1 -DHAVE_SYS_SYSMACROS_H=3D1 -DHAVE_BSTRING_H=3D0 -DHAVE_GRP_H=3D1 -DHAVE_IO_H=3D0 -DHAVE_LIBGEN_H=3D1 -DHAVE_LIBUTIL_H=3D0 -DHAVE_PATHS_H=3D1 -DHAVE_STDINT_H=3D1 -DHAVE_STRINGS_= H=3D1 -DHAVE_TERMIOS_H=3D1 -DHAVE_ULIMIT_H=3D1 -DHAVE_VALUES_H=3D1 -DHAVE_CAN_INT= TYPES=3D1 -DHAVE_SIG_T=3D1 -DHAVE_STRERRORDESC_NP=3D1 -DHAVE_SYS_ERRLIST=3D1 -DHAVE_SIGABBREV_NP=3D1 -DHAVE_SYS_SIGNAME=3D0 -DHAVE_SIGDESCR_NP=3D1 -DHAVE_SYS_SIGLIST=3D1 -DHAVE_FLOCK=3D1 -DHAVE_LOCK_FCNTL=3D1 -DHAVE_RLIMIT= =3D1 -DHAVE_RLIM_T=3D1 -DHAVE_GET_CURRENT_DIR_NAME=3D1 -DHAVE_GETRANDOM=3D0 -DHAVE_GETRUSAGE=3D1 -DHAVE_GETSID=3D1 -DHAVE_GETTIMEOFDAY=3D1 -DHAVE_KILLP= G=3D1 -DHAVE_MEMMOVE=3D1 -DHAVE_MKNOD=3D0 -DHAVE_MMAP=3D1 -DHAVE_FTRUNCATE=3D1 -D= HAVE_NICE=3D1 -DHAVE_RENAME=3D1 -DHAVE_REVOKE=3D0 -DHAVE_POSIX_UTF8_LOCALE=3D0 -DHAVE_SEL= ECT=3D1 -DHAVE_SETRESUGID=3D1 -DHAVE_SETGROUPS=3D1 -DHAVE_SIGACTION=3D1 -DHAVE_STRE= RROR=3D0 -DHAVE_STRSIGNAL=3D0 -DHAVE_STRLCPY=3D0 -DHAVE_STRSTR=3D1 -DHAVE_FLOCK_DECL= =3D1 -DHAVE_REVOKE_DECL=3D1 -DHAVE_SYS_ERRLIST_DECL=3D1 -DHAVE_SYS_SIGLIST_DECL= =3D1 -DHAVE_ST_MTIMENSEC=3D0 -DHAVE_INTCONSTEXPR_RSIZE_MAX=3D0 -DHAVE_PERSISTENT_HISTORY=3D1 -DMKSH_BUILD_R=3D599 -c -o eval.o x.i =E2=80=A6 and got the same result.=