zsh-workers
 help / color / mirror / code / Atom feed
* [PATCH] Fix configure test build errors with clang-15
@ 2022-09-15  2:36 Nicholas Vinson
  2022-09-15 22:29 ` Bart Schaefer
  2022-09-16  9:33 ` Jun T
  0 siblings, 2 replies; 6+ messages in thread
From: Nicholas Vinson @ 2022-09-15  2:36 UTC (permalink / raw)
  To: zsh-workers; +Cc: Nicholas Vinson

When building with clang-15.0.0, I discovered several configure tests
incorrectly fail because clang-15.0.0 errors with messages similar to:

    "error: type specifier missing, defaults to 'int'"

and similar such errors. These failed tests ultimately cause zsh to be
built incorrectly, and can cause commands such as eval to hang
indefinitely. For an example of this behavior please see
https://bugs.gentoo.org/869539. This patch fixes the configure tests, so
they do not incorrectly fail.

Thanks,
Nicholas Vinson

Signed-off-by: Nicholas Vinson <nvinson234@gmail.com>

---
 aczsh.m4     | 58 ++++++++++++++++++++++++-------------------
 configure.ac | 70 +++++++++++++++++++++++++---------------------------
 2 files changed, 66 insertions(+), 62 deletions(-)

diff --git a/aczsh.m4 b/aczsh.m4
index 1209ac614..2cfb4e5db 100644
--- a/aczsh.m4
+++ b/aczsh.m4
@@ -44,6 +44,7 @@ AC_DEFUN(zsh_64_BIT_TYPE,
 #include <sys/types.h>
 #endif
 
+int
 main()
 {
   $1 foo = 0; 
@@ -146,29 +147,30 @@ char *zsh_gl_sym_addr ;
 #define RTLD_GLOBAL 0
 #endif
 
+int
 main()
 {
     void *handle1, *handle2;
     void *(*zsh_getaddr1)(), *(*zsh_getaddr2)();
     void *sym1, *sym2;
     handle1 = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
-    if(!handle1) exit(1);
+    if(!handle1) return(1);
     handle2 = dlopen("./conftest2.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
-    if(!handle2) exit(1);
+    if(!handle2) return(1);
     zsh_getaddr1 = (void *(*)()) dlsym(handle1, "${us}zsh_getaddr1");
     zsh_getaddr2 = (void *(*)()) dlsym(handle2, "${us}zsh_getaddr2");
     sym1 = zsh_getaddr1();
     sym2 = zsh_getaddr2();
-    if(!sym1 || !sym2) exit(1);
-    if(sym1 != sym2) exit(1);
+    if(!sym1 || !sym2) return(1);
+    if(sym1 != sym2) return(1);
     dlclose(handle1);
     handle1 = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
-    if(!handle1) exit(1);
+    if(!handle1) return(1);
     zsh_getaddr1 = (void *(*)()) dlsym(handle1, "${us}zsh_getaddr1");
     sym1 = zsh_getaddr1();
-    if(!sym1) exit(1);
-    if(sym1 != sym2) exit(1);
-    exit(0);
+    if(!sym1) return(1);
+    if(sym1 != sym2) return(1);
+    return(0);
 }
 ]])],[zsh_cv_shared_$1=yes],
 [zsh_cv_shared_$1=no],
@@ -228,19 +230,19 @@ char *zsh_gl_sym_addr ;
 #define RTLD_GLOBAL 0
 #endif
 
-
+int
 main()
 {
     void *handle1, *handle2;
     int (*fred1)(), (*fred2)();
     handle1 = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
-    if(!handle1) exit(1);
+    if(!handle1) return(1);
     handle2 = dlopen("./conftest2.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
-    if(!handle2) exit(1);
+    if(!handle2) return(1);
     fred1 = (int (*)()) dlsym(handle1, "${us}fred");
     fred2 = (int (*)()) dlsym(handle2, "${us}fred");
-    if(!fred1 || !fred2) exit(1);
-    exit((*fred1)() != 42 || (*fred2)() != 69);
+    if(!fred1 || !fred2) return(1);
+    return((*fred1)() != 42 || (*fred2)() != 69);
 }
 ]])],[zsh_cv_sys_dynamic_clash_ok=yes],
 [zsh_cv_sys_dynamic_clash_ok=no],
@@ -304,17 +306,18 @@ char *zsh_gl_sym_addr ;
 #define RTLD_GLOBAL 0
 #endif
 
+int
 main()
 {
     void *handle;
     int (*barneysym)();
     handle = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
-    if(!handle) exit(1);
+    if(!handle) return(1);
     handle = dlopen("./conftest2.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
-    if(!handle) exit(1);
+    if(!handle) return(1);
     barneysym = (int (*)()) dlsym(handle, "${us}barney");
-    if(!barneysym) exit(1);
-    exit((*barneysym)() != 69);
+    if(!barneysym) return(1);
+    return((*barneysym)() != 69);
 }
 ]])],[zsh_cv_sys_dynamic_rtld_global=yes],
 [zsh_cv_sys_dynamic_rtld_global=no],
@@ -374,15 +377,16 @@ char *zsh_gl_sym_addr ;
 #define RTLD_GLOBAL 0
 #endif
 
+int
 main()
 {
     void *handle;
     int (*barneysym)();
     handle = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
-    if(!handle) exit(1);
+    if(!handle) return(1);
     barneysym = (int (*)()) dlsym(handle, "${us}barney");
-    if(!barneysym) exit(1);
-    exit((*barneysym)() != 69);
+    if(!barneysym) return(1);
+    return((*barneysym)() != 69);
 }
 
 int fred () { return 42; }
@@ -448,15 +452,16 @@ char *zsh_gl_sym_addr ;
 #define RTLD_GLOBAL 0
 #endif
 
+int
 main()
 {
     void *handle;
     int (*barneysym)();
     handle = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
-    if(!handle) exit(1);
+    if(!handle) return(1);
     barneysym = (int (*)()) dlsym(handle, "${us}barney");
-    if(!barneysym) exit(1);
-    exit((*barneysym)() != 69);
+    if(!barneysym) return(1);
+    return((*barneysym)() != 69);
 }
 
 int fred () { return 42; }
@@ -516,15 +521,16 @@ char *zsh_gl_sym_addr ;
 #define RTLD_GLOBAL 0
 #endif
 
+int
 main()
 {
     void *handle;
     int (*fredsym)();
     handle = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
-    if(!handle) exit(1);
+    if(!handle) return(1);
     fredsym = (int (*)()) dlsym(handle, "${us}fred");
-    if(!fredsym) exit(1);
-    exit((*fredsym)() != 42);
+    if(!fredsym) return(1);
+    return((*fredsym)() != 42);
 }
 ]])],[zsh_cv_sys_dynamic_strip_lib=yes],
 [zsh_cv_sys_dynamic_strip_lib=no],
diff --git a/configure.ac b/configure.ac
index 890ef8dd2..958ac7cd7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -585,7 +585,7 @@ fi
 dnl  Checking if compiler correctly cast signed to unsigned.
 AC_CACHE_CHECK(if signed to unsigned casting is broken,
 zsh_cv_c_broken_signed_to_unsigned_casting,
-[AC_RUN_IFELSE([AC_LANG_SOURCE([[main(){return((int)(unsigned char)((char) -1) == 255);}]])],[zsh_cv_c_broken_signed_to_unsigned_casting=yes],[zsh_cv_c_broken_signed_to_unsigned_casting=no],[zsh_cv_c_broken_signed_to_unsigned_casting=no])])
+[AC_RUN_IFELSE([AC_LANG_SOURCE([[int main(){return((int)(unsigned char)((char) -1) == 255);}]])],[zsh_cv_c_broken_signed_to_unsigned_casting=yes],[zsh_cv_c_broken_signed_to_unsigned_casting=no],[zsh_cv_c_broken_signed_to_unsigned_casting=no])])
 AH_TEMPLATE([BROKEN_SIGNED_TO_UNSIGNED_CASTING],
 [Define to 1 if compiler incorrectly cast signed to unsigned.])
 if test x$zsh_cv_c_broken_signed_to_unsigned_casting = xyes; then
@@ -1046,7 +1046,7 @@ else
   [AC_RUN_IFELSE([AC_LANG_SOURCE([[
 #include <sys/types.h>
 
-main() { return sizeof(off_t) < 8; }
+int main() { return sizeof(off_t) < 8; }
 ]])],[zsh_cv_off_t_is_64_bit=yes],[zsh_cv_off_t_is_64_bit=no],[zsh_cv_off_t_is_64_bit=no])])
   if test x$zsh_cv_off_t_is_64_bit = xyes; then
     AC_DEFINE(OFF_T_IS_64_BIT)
@@ -1056,7 +1056,7 @@ main() { return sizeof(off_t) < 8; }
   [AC_RUN_IFELSE([AC_LANG_SOURCE([[
 #include <sys/types.h>
 
-main() { return sizeof(ino_t) < 8; }
+int main() { return sizeof(ino_t) < 8; }
 ]])],[zsh_cv_ino_t_is_64_bit=yes],[zsh_cv_ino_t_is_64_bit=no],[zsh_cv_ino_t_is_64_bit=no])])
   if test x$zsh_cv_ino_t_is_64_bit = xyes; then
     AC_DEFINE(INO_T_IS_64_BIT)
@@ -1396,7 +1396,7 @@ zsh_cv_func_tgetent_accepts_null,
 #include <stdlib.h>
 int tgetent(char *, char *);
 char *tgetstr(char *, char **);
-main()
+int main()
 {
     char buf[4096];
     int r1 = tgetent(buf, "vt100");
@@ -1407,7 +1407,7 @@ main()
     	tgetstr("cl", &u);
 	creat("conftest.tgetent", 0640);
     }
-    exit((r1 != r2) || r2 == -1);
+    return((r1 != r2) || r2 == -1);
 }
 ]])],[if test -f conftest.tgetent; then
     zsh_cv_func_tgetent_accepts_null=yes
@@ -1424,7 +1424,7 @@ zsh_cv_func_tgetent_zero_success,
 #include <stdlib.h>
 int tgetent(char *, char*);
 char *tgetstr(char *, char **);
-main()
+int main()
 {
     char buf[4096];
     int r1 = tgetent(buf, "!@#$%^&*");
@@ -1435,7 +1435,7 @@ main()
     	tgetstr("cl", &u);
 	creat("conftest.tgetent0", 0640);
     }
-    exit(r1 == r2);
+    return(r1 == r2);
 }
 ]])],[if test -f conftest.tgetent0; then
     zsh_cv_func_tgetent_zero_success=yes
@@ -1870,7 +1870,7 @@ zsh_cv_rlim_t_is_longer,
 #endif
 #include <sys/resource.h>
 #include <stdlib.h>
-main(){struct rlimit r;exit(sizeof(r.rlim_cur) <= sizeof(long));}]])],[zsh_cv_rlim_t_is_longer=yes],[zsh_cv_rlim_t_is_longer=no],[zsh_cv_rlim_t_is_longer=yes])])
+int main(){struct rlimit r;return(sizeof(r.rlim_cur) <= sizeof(long));}]])],[zsh_cv_rlim_t_is_longer=yes],[zsh_cv_rlim_t_is_longer=no],[zsh_cv_rlim_t_is_longer=yes])])
 if test x$zsh_cv_rlim_t_is_longer = xyes; then
   AC_CACHE_CHECK(if rlim_t is a quad,
   zsh_cv_rlim_t_is_quad_t,
@@ -1881,12 +1881,12 @@ if test x$zsh_cv_rlim_t_is_longer = xyes; then
 #include <stdio.h>
 #include <sys/resource.h>
 #include <stdlib.h>
-main() { 
+int main() {
   struct rlimit r;
   char buf[20];
   r.rlim_cur = 0;
   sprintf(buf, "%qd", r.rlim_cur);
-  exit(strcmp(buf, "0"));
+  return(strcmp(buf, "0"));
 }]])],[zsh_cv_rlim_t_is_quad_t=yes],[zsh_cv_rlim_t_is_quad_t=no],[zsh_cv_rlim_t_is_quad_t=no])])
   if test x$zsh_cv_rlim_t_is_quad_t = xyes; then
     AC_DEFINE(RLIM_T_IS_QUAD_T)
@@ -1904,7 +1904,7 @@ else
 #endif
 #include <sys/resource.h>
 #include <stdlib.h>
-  main(){struct rlimit r;r.rlim_cur=-1;exit(r.rlim_cur<0);}]])],[zsh_cv_type_rlim_t_is_unsigned=yes],[zsh_cv_type_rlim_t_is_unsigned=no],[zsh_cv_type_rlim_t_is_unsigned=no])])
+  int main(){struct rlimit r;r.rlim_cur=-1;return(r.rlim_cur<0);}]])],[zsh_cv_type_rlim_t_is_unsigned=yes],[zsh_cv_type_rlim_t_is_unsigned=no],[zsh_cv_type_rlim_t_is_unsigned=no])])
   if test x$zsh_cv_type_rlim_t_is_unsigned = xyes; then
     AC_DEFINE(RLIM_T_IS_UNSIGNED)
     DEFAULT_RLIM_T="unsigned $DEFAULT_RLIM_T"
@@ -2189,7 +2189,7 @@ zsh_cv_sys_fifo,
 #include <unistd.h>
 #include <stdlib.h>
 #include <sys/stat.h>
-main()
+int main()
 {
     char c;
     int fd;
@@ -2203,15 +2203,15 @@ main()
 	exit(1);
     pid = fork();
     if(pid < 0)
-	exit(1);
+	return(1);
     if(pid) {
 	fd = open("/tmp/fifo$$", O_RDONLY);
-	exit(fd < 0 || read(fd, &c, 1) != 1 || c != 'x');
+	return(fd < 0 || read(fd, &c, 1) != 1 || c != 'x');
     }
     fd = open("/tmp/fifo$$", O_WRONLY);
     ret = (fd < 0 || write(fd, "x", 1) < 1);
     unlink("/tmp/fifo$$");
-    exit(ret);
+    return(ret);
 }
 ]])],[zsh_cv_sys_fifo=yes],[zsh_cv_sys_fifo=no],[zsh_cv_sys_fifo=yes])
 ])
@@ -2290,7 +2290,7 @@ zsh_cv_sys_link,
 #include <unistd.h>
 #include <fcntl.h>
 #include <stdlib.h>
-main()
+int main()
 {
     int ret;
     char *tmpfile, *newfile;
@@ -2299,11 +2299,11 @@ main()
     unlink(tmpfile);
     unlink(newfile);
     if(creat(tmpfile, 0644) < 0)
-	exit(1);
+	return(1);
     ret = link(tmpfile, newfile);
     unlink(tmpfile);
     unlink(newfile);
-    exit(ret<0);
+    return(ret<0);
 }
 ]])],[zsh_cv_sys_link=yes],[zsh_cv_sys_link=no],[zsh_cv_sys_link=yes])])
 AH_TEMPLATE([HAVE_LINK],
@@ -2323,11 +2323,11 @@ zsh_cv_sys_killesrch,
 #include <signal.h>
 #include <errno.h>
 #include <stdlib.h>
-main()
+int main()
 {
     int pid = (getpid() + 10000) & 0xffffff;
     while (pid && (kill(pid, 0) == 0 || errno != ESRCH)) pid >>= 1;
-    exit(errno!=ESRCH);
+    return(errno!=ESRCH);
 }
 ]])],[zsh_cv_sys_killesrch=yes],[zsh_cv_sys_killesrch=no],[zsh_cv_sys_killesrch=yes])])
 AH_TEMPLATE([BROKEN_KILL_ESRCH],
@@ -2353,7 +2353,7 @@ int child=0;
 void handler(sig)
     int sig;
 {if(sig==SIGCHLD) child=1;}
-main() {
+int main() {
     struct sigaction act;
     sigset_t set;
     int pid, ret;
@@ -2368,7 +2368,7 @@ main() {
     if(pid>0) {
     sigemptyset(&set);
         ret=sigsuspend(&set);
-        exit(child==0);
+        return(child==0);
     }
 }
 ]])],[zsh_cv_sys_sigsuspend=yes],[zsh_cv_sys_sigsuspend=no],[zsh_cv_sys_sigsuspend=yes])])
@@ -2401,14 +2401,14 @@ case "x$zsh_working_tcsetpgrp" in
 #include <unistd.h>
 #include <fcntl.h>
 #include <stdlib.h>
-main() {
+int main() {
     int fd;
     int ret;
     fd=open("/dev/tty", O_RDWR);
     if (fd < 0) exit(2);
     ret=tcsetpgrp(fd, tcgetpgrp(fd));
     if (ret < 0) exit(1);
-    exit(0);
+    return(0);
 }
 ]])],[zsh_cv_sys_tcsetpgrp=yes],[
 case $? in
@@ -2448,7 +2448,7 @@ if test x$ac_cv_func_getpwnam = xyes; then
 #include <string.h>
 #include <stdlib.h>
 #include <unistd.h>
-main() {
+int main() {
     struct passwd *pw1, *pw2;
     char buf[1024], name[1024];
     sprintf(buf, "%d:%d", getpid(), rand());
@@ -2456,7 +2456,7 @@ main() {
     if (pw1) strcpy(name, pw1->pw_name);
     sprintf(buf, "%d:%d", rand(), getpid());
     pw2=getpwnam(buf);
-    exit(pw1!=0 && pw2!=0 && !strcmp(name, pw2->pw_name));
+    return(pw1!=0 && pw2!=0 && !strcmp(name, pw2->pw_name));
 }
 ]])],[zsh_cv_sys_getpwnam_faked=no],[zsh_cv_sys_getpwnam_faked=yes],[zsh_cv_sys_getpwnam_faked=no])])
     if test x$zsh_cv_sys_getpwnam_faked = xyes; then
@@ -2777,18 +2777,16 @@ elif test "x$dynamic" = xyes; then
 #include <fcntl.h>
 #include <stdlib.h>
 #include <unistd.h>
-main(argc, argv)
-int argc;
-char *argv[];
+int main(int argc, char *argv[])
 {
 	char b[4];
 	int i = open(argv[0],O_RDONLY);
 	if(i == -1) 
 		exit(1); /* fail */
 	if(read(i,b,4)==4 && b[0]==127 && b[1]=='E' && b[2]=='L' && b[3]=='F')
-		exit(0); /* succeed (yes, it's ELF) */
+		return(0); /* succeed (yes, it's ELF) */
 	else
-		exit(1); /* fail */
+		return(1); /* fail */
 }]])],[zsh_cv_sys_elf=yes],[zsh_cv_sys_elf=no],[zsh_cv_sys_elf=yes])])
 
   # We use [0-9]* in case statements, so need to change quoting
@@ -2924,7 +2922,7 @@ LDFLAGS="$old_LDFLAGS")
   AC_CACHE_CHECK(if your dlsym() needs a leading underscore,
    zsh_cv_func_dlsym_needs_underscore,
    [echo failed >conftestval && cat >conftest.c <<EOM
-fred () { }
+void fred () { }
 EOM
     AC_TRY_COMMAND($CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest.c 1>&AS_MESSAGE_LOG_FD) &&
     AC_TRY_COMMAND($DLLD $LDFLAGS $DLLDFLAGS -o conftest.$DL_EXT conftest.o 1>&AS_MESSAGE_LOG_FD) &&
@@ -2957,7 +2955,7 @@ char *zsh_gl_sym_addr ;
 
 extern int fred() ;
 
-main()
+int main()
 {
     void * handle ;
     void * symbol ;
@@ -2966,7 +2964,7 @@ main()
     handle = dlopen("./conftest.$DL_EXT", RTLD_LAZY) ;
     if (handle == NULL) {
         fprintf (f, "dlopen failed") ;
-            exit(1);
+            return(1);
     }
     symbol = dlsym(handle, "fred") ;
     if (symbol == NULL) {
@@ -2974,13 +2972,13 @@ main()
         symbol = dlsym(handle, "_fred") ;
         if (symbol == NULL) {
             fprintf (f, "dlsym failed") ;
-                exit(1);
+                return(1);
                 }
         fprintf (f, "yes") ;
     }
     else
         fprintf (f, "no") ;
-    exit(0);
+    return(0);
 }]])],[zsh_cv_func_dlsym_needs_underscore=`cat conftestval`],[zsh_cv_func_dlsym_needs_underscore=failed
     dynamic=no],[zsh_cv_func_dlsym_needs_underscore=no])])
   if test "x$zsh_cv_func_dlsym_needs_underscore" = xyes; then
-- 
2.37.3



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] Fix configure test build errors with clang-15
  2022-09-15  2:36 [PATCH] Fix configure test build errors with clang-15 Nicholas Vinson
@ 2022-09-15 22:29 ` Bart Schaefer
  2022-09-16  5:49   ` Jun T
  2022-09-16  6:40   ` Roman Perepelitsa
  2022-09-16  9:33 ` Jun T
  1 sibling, 2 replies; 6+ messages in thread
From: Bart Schaefer @ 2022-09-15 22:29 UTC (permalink / raw)
  To: zsh-workers; +Cc: Nicholas Vinson

On Wed, Sep 14, 2022 at 7:42 PM Nicholas Vinson <nvinson234@gmail.com> wrote:
>
> When building with clang-15.0.0, I discovered several configure tests
> incorrectly fail because clang-15.0.0 errors with messages similar to:
>
>     "error: type specifier missing, defaults to 'int'"

For zsh-workers -- do we need to worry that these changed declarations
themselves need to be conditionalized somehow, that is, are other
compilers going to fail because of "int main()" when they expect "void
main()"?

> and similar such errors.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] Fix configure test build errors with clang-15
  2022-09-15 22:29 ` Bart Schaefer
@ 2022-09-16  5:49   ` Jun T
  2022-09-16  6:40   ` Roman Perepelitsa
  1 sibling, 0 replies; 6+ messages in thread
From: Jun T @ 2022-09-16  5:49 UTC (permalink / raw)
  To: zsh-workers


> 2022/09/16 7:29, Bart Schaefer <schaefer@brasslantern.com> wrote:
> 
>  are other
> compilers going to fail because of "int main()" when they expect "void
> main()"?

If "int main()" is an error, I think zsh's main.c will not compile.



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] Fix configure test build errors with clang-15
  2022-09-15 22:29 ` Bart Schaefer
  2022-09-16  5:49   ` Jun T
@ 2022-09-16  6:40   ` Roman Perepelitsa
  1 sibling, 0 replies; 6+ messages in thread
From: Roman Perepelitsa @ 2022-09-16  6:40 UTC (permalink / raw)
  To: Bart Schaefer; +Cc: zsh-workers, Nicholas Vinson

On Fri, Sep 16, 2022 at 12:30 AM Bart Schaefer
<schaefer@brasslantern.com> wrote:
>
> On Wed, Sep 14, 2022 at 7:42 PM Nicholas Vinson <nvinson234@gmail.com> wrote:
> >
> > When building with clang-15.0.0, I discovered several configure tests
> > incorrectly fail because clang-15.0.0 errors with messages similar to:
> >
> >     "error: type specifier missing, defaults to 'int'"
>
> For zsh-workers -- do we need to worry that these changed declarations
> themselves need to be conditionalized somehow, that is, are other
> compilers going to fail because of "int main()" when they expect "void
> main()"?

"void main()" has been invalid C and "int main()" valid C since the
very first standard. There are no C compilers that reject the latter.

Note that this patch is replacing "main()" (no type specifier at all)
with "int main()". The new code will work everywhere.

Roman.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] Fix configure test build errors with clang-15
  2022-09-15  2:36 [PATCH] Fix configure test build errors with clang-15 Nicholas Vinson
  2022-09-15 22:29 ` Bart Schaefer
@ 2022-09-16  9:33 ` Jun T
  2022-09-16 11:58   ` Nicholas Vinson
  1 sibling, 1 reply; 6+ messages in thread
From: Jun T @ 2022-09-16  9:33 UTC (permalink / raw)
  To: zsh-workers; +Cc: Nicholas Vinson

> 
> 2022/09/15 11:36, Nicholas Vinson <nvinson234@gmail.com> wrote:
> 
> When building with clang-15.0.0, I discovered several configure tests
> incorrectly fail because clang-15.0.0 errors with messages similar to:
> 
>    "error: type specifier missing, defaults to 'int'"
> 
> and similar such errors. These failed tests ultimately cause zsh to be
> built incorrectly, and can cause commands such as eval to hang
> indefinitely. For an example of this behavior please see
> https://bugs.gentoo.org/869539. This patch fixes the configure tests, so
> they do not incorrectly fail.

Thanks.

Could you please include the following changes to your patch and test again?
The changes are:
(1) remove (most of)
#include <stdlib.h>
which were added in commit bd647c156 to get the prototype of exit(),
(2) replace a few remaining exit() by return.

The patch below assumes that your patch is already applied.


diff --git a/aczsh.m4 b/aczsh.m4
index 2cfb4e5db..b31236020 100644
--- a/aczsh.m4
+++ b/aczsh.m4
@@ -119,7 +119,6 @@ AC_TRY_COMMAND($DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS conftest1.o $LIBS
 AC_TRY_COMMAND($CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest2.c 1>&AS_MESSAGE_LOG_FD) &&
 AC_TRY_COMMAND($DLLD -o conftest2.$DL_EXT $LDFLAGS $DLLDFLAGS conftest2.o $LIBS 1>&AS_MESSAGE_LOG_FD); then
     AC_RUN_IFELSE([AC_LANG_SOURCE([[
-#include <stdlib.h>
 #ifdef HPUX10DYNAMIC
 #include <dl.h>
 #define RTLD_LAZY BIND_DEFERRED
@@ -202,7 +201,6 @@ AC_TRY_COMMAND($DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS conftest1.o $LIBS
 AC_TRY_COMMAND($CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest2.c 1>&AS_MESSAGE_LOG_FD) &&
 AC_TRY_COMMAND($DLLD -o conftest2.$DL_EXT $LDFLAGS $DLLDFLAGS conftest2.o $LIBS 1>&AS_MESSAGE_LOG_FD); then
     AC_RUN_IFELSE([AC_LANG_SOURCE([[
-#include <stdlib.h>
 #ifdef HPUX10DYNAMIC
 #include <dl.h>
 #define RTLD_LAZY BIND_DEFERRED
@@ -278,7 +276,6 @@ AC_TRY_COMMAND($DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS conftest1.o $LIBS
 AC_TRY_COMMAND($CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest2.c 1>&AS_MESSAGE_LOG_FD) &&
 AC_TRY_COMMAND($DLLD -o conftest2.$DL_EXT $LDFLAGS $DLLDFLAGS conftest2.o $LIBS 1>&AS_MESSAGE_LOG_FD); then
     AC_RUN_IFELSE([AC_LANG_SOURCE([[
-#include <stdlib.h>
 #ifdef HPUX10DYNAMIC
 #include <dl.h>
 #define RTLD_LAZY BIND_DEFERRED
@@ -349,7 +346,6 @@ AC_TRY_COMMAND($DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS conftest1.o $LIBS
     save_ldflags=$LDFLAGS
     LDFLAGS="$LDFLAGS $EXTRA_LDFLAGS"
     AC_RUN_IFELSE([AC_LANG_SOURCE([[
-#include <stdlib.h>
 #ifdef HPUX10DYNAMIC
 #include <dl.h>
 #define RTLD_LAZY BIND_DEFERRED
@@ -424,7 +420,6 @@ elif
     save_ldflags=$LDFLAGS
     LDFLAGS="$LDFLAGS $EXTRA_LDFLAGS -s"
     AC_RUN_IFELSE([AC_LANG_SOURCE([[
-#include <stdlib.h>
 #ifdef HPUX10DYNAMIC
 #include <dl.h>
 #define RTLD_LAZY BIND_DEFERRED
@@ -493,7 +488,6 @@ echo 'int fred () { return 42; }' > conftest1.c
 if AC_TRY_COMMAND($CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest1.c 1>&AS_MESSAGE_LOG_FD) &&
 AC_TRY_COMMAND($DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS -s conftest1.o $LIBS 1>&AS_MESSAGE_LOG_FD); then
     AC_RUN_IFELSE([AC_LANG_SOURCE([[
-#include <stdlib.h>
 #ifdef HPUX10DYNAMIC
 #include <dl.h>
 #define RTLD_LAZY BIND_DEFERRED
diff --git a/configure.ac b/configure.ac
index 958ac7cd7..074141d38 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1369,7 +1369,7 @@ zsh_cv_func_realpath_accepts_null,
 #include <stdlib.h>
 #include <limits.h>
 ],[
-exit(!realpath("/", (char*)0));
+return(!realpath("/", (char*)0));
 ])],
 [zsh_cv_func_realpath_accepts_null=yes],
 [zsh_cv_func_realpath_accepts_null=no],
@@ -1393,7 +1393,6 @@ AC_CACHE_CHECK(if tgetent accepts NULL,
 zsh_cv_func_tgetent_accepts_null,
 [AC_RUN_IFELSE([AC_LANG_SOURCE([[
 #include <fcntl.h>
-#include <stdlib.h>
 int tgetent(char *, char *);
 char *tgetstr(char *, char **);
 int main()
@@ -1421,7 +1420,6 @@ AC_CACHE_CHECK(if tgetent returns 0 on success,
 zsh_cv_func_tgetent_zero_success,
 [AC_RUN_IFELSE([AC_LANG_SOURCE([[
 #include <fcntl.h>
-#include <stdlib.h>
 int tgetent(char *, char*);
 char *tgetstr(char *, char **);
 int main()
@@ -1869,7 +1867,6 @@ zsh_cv_rlim_t_is_longer,
 #include <sys/time.h>
 #endif
 #include <sys/resource.h>
-#include <stdlib.h>
 int main(){struct rlimit r;return(sizeof(r.rlim_cur) <= sizeof(long));}]])],[zsh_cv_rlim_t_is_longer=yes],[zsh_cv_rlim_t_is_longer=no],[zsh_cv_rlim_t_is_longer=yes])])
 if test x$zsh_cv_rlim_t_is_longer = xyes; then
   AC_CACHE_CHECK(if rlim_t is a quad,
@@ -1880,7 +1877,6 @@ if test x$zsh_cv_rlim_t_is_longer = xyes; then
 #endif
 #include <stdio.h>
 #include <sys/resource.h>
-#include <stdlib.h>
 int main() {
   struct rlimit r;
   char buf[20];
@@ -1903,7 +1899,6 @@ else
 #include <sys/time.h>
 #endif
 #include <sys/resource.h>
-#include <stdlib.h>
   int main(){struct rlimit r;r.rlim_cur=-1;return(r.rlim_cur<0);}]])],[zsh_cv_type_rlim_t_is_unsigned=yes],[zsh_cv_type_rlim_t_is_unsigned=no],[zsh_cv_type_rlim_t_is_unsigned=no])])
   if test x$zsh_cv_type_rlim_t_is_unsigned = xyes; then
     AC_DEFINE(RLIM_T_IS_UNSIGNED)
@@ -2187,7 +2182,6 @@ zsh_cv_sys_fifo,
 #include <fcntl.h>
 #include <signal.h>
 #include <unistd.h>
-#include <stdlib.h>
 #include <sys/stat.h>
 int main()
 {
@@ -2200,7 +2194,7 @@ int main()
 #else
     if(mknod("/tmp/fifo$$", 0010600, 0) < 0)
 #endif
-	exit(1);
+	return(1);
     pid = fork();
     if(pid < 0)
 	return(1);
@@ -2289,7 +2283,6 @@ zsh_cv_sys_link,
 [AC_RUN_IFELSE([AC_LANG_SOURCE([[
 #include <unistd.h>
 #include <fcntl.h>
-#include <stdlib.h>
 int main()
 {
     int ret;
@@ -2322,7 +2315,6 @@ zsh_cv_sys_killesrch,
 #include <unistd.h>
 #include <signal.h>
 #include <errno.h>
-#include <stdlib.h>
 int main()
 {
     int pid = (getpid() + 10000) & 0xffffff;
@@ -2348,7 +2340,6 @@ if test x$signals_style = xPOSIX_SIGNALS; then
     [AC_RUN_IFELSE([AC_LANG_SOURCE([[
 #include <signal.h>
 #include <unistd.h>
-#include <stdlib.h>
 int child=0;
 void handler(sig)
     int sig;
@@ -2400,14 +2391,13 @@ case "x$zsh_working_tcsetpgrp" in
 #include <sys/types.h>
 #include <unistd.h>
 #include <fcntl.h>
-#include <stdlib.h>
 int main() {
     int fd;
     int ret;
     fd=open("/dev/tty", O_RDWR);
-    if (fd < 0) exit(2);
+    if (fd < 0) return(2);
     ret=tcsetpgrp(fd, tcgetpgrp(fd));
-    if (ret < 0) exit(1);
+    if (ret < 0) return(1);
     return(0);
 }
 ]])],[zsh_cv_sys_tcsetpgrp=yes],[
@@ -2775,14 +2765,13 @@ elif test "x$dynamic" = xyes; then
    zsh_cv_sys_elf,
    [AC_RUN_IFELSE([AC_LANG_SOURCE([[/* Test for whether ELF binaries are produced */
 #include <fcntl.h>
-#include <stdlib.h>
 #include <unistd.h>
 int main(int argc, char *argv[])
 {
 	char b[4];
 	int i = open(argv[0],O_RDONLY);
 	if(i == -1) 
-		exit(1); /* fail */
+		return(1); /* fail */
 	if(read(i,b,4)==4 && b[0]==127 && b[1]=='E' && b[2]=='L' && b[3]=='F')
 		return(0); /* succeed (yes, it's ELF) */
 	else
@@ -2928,7 +2917,6 @@ EOM
     AC_TRY_COMMAND($DLLD $LDFLAGS $DLLDFLAGS -o conftest.$DL_EXT conftest.o 1>&AS_MESSAGE_LOG_FD) &&
     AC_RUN_IFELSE([AC_LANG_SOURCE([[
 #include <stdio.h>
-#include <stdlib.h>
 #ifdef HPUX10DYNAMIC
 #include <dl.h>
 #define RTLD_LAZY BIND_DEFERRED
@@ -2960,7 +2948,7 @@ int main()
     void * handle ;
     void * symbol ;
     FILE *f=fopen("conftestval", "w");
-    if (!f) exit(1);
+    if (!f) return(1);
     handle = dlopen("./conftest.$DL_EXT", RTLD_LAZY) ;
     if (handle == NULL) {
         fprintf (f, "dlopen failed") ;






^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] Fix configure test build errors with clang-15
  2022-09-16  9:33 ` Jun T
@ 2022-09-16 11:58   ` Nicholas Vinson
  0 siblings, 0 replies; 6+ messages in thread
From: Nicholas Vinson @ 2022-09-16 11:58 UTC (permalink / raw)
  To: Jun T, zsh-workers

Changes applied.

I've sent the new patch to the mailing list.

Thanks,
Nicholas Vinson

On 9/16/22 05:33, Jun T wrote:
>>
>> 2022/09/15 11:36, Nicholas Vinson <nvinson234@gmail.com> wrote:
>>
>> When building with clang-15.0.0, I discovered several configure tests
>> incorrectly fail because clang-15.0.0 errors with messages similar to:
>>
>>     "error: type specifier missing, defaults to 'int'"
>>
>> and similar such errors. These failed tests ultimately cause zsh to be
>> built incorrectly, and can cause commands such as eval to hang
>> indefinitely. For an example of this behavior please see
>> https://bugs.gentoo.org/869539. This patch fixes the configure tests, so
>> they do not incorrectly fail.
> 
> Thanks.
> 
> Could you please include the following changes to your patch and test again?
> The changes are:
> (1) remove (most of)
> #include <stdlib.h>
> which were added in commit bd647c156 to get the prototype of exit(),
> (2) replace a few remaining exit() by return.
> 
> The patch below assumes that your patch is already applied.
> 
> 
> diff --git a/aczsh.m4 b/aczsh.m4
> index 2cfb4e5db..b31236020 100644
> --- a/aczsh.m4
> +++ b/aczsh.m4
> @@ -119,7 +119,6 @@ AC_TRY_COMMAND($DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS conftest1.o $LIBS
>   AC_TRY_COMMAND($CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest2.c 1>&AS_MESSAGE_LOG_FD) &&
>   AC_TRY_COMMAND($DLLD -o conftest2.$DL_EXT $LDFLAGS $DLLDFLAGS conftest2.o $LIBS 1>&AS_MESSAGE_LOG_FD); then
>       AC_RUN_IFELSE([AC_LANG_SOURCE([[
> -#include <stdlib.h>
>   #ifdef HPUX10DYNAMIC
>   #include <dl.h>
>   #define RTLD_LAZY BIND_DEFERRED
> @@ -202,7 +201,6 @@ AC_TRY_COMMAND($DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS conftest1.o $LIBS
>   AC_TRY_COMMAND($CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest2.c 1>&AS_MESSAGE_LOG_FD) &&
>   AC_TRY_COMMAND($DLLD -o conftest2.$DL_EXT $LDFLAGS $DLLDFLAGS conftest2.o $LIBS 1>&AS_MESSAGE_LOG_FD); then
>       AC_RUN_IFELSE([AC_LANG_SOURCE([[
> -#include <stdlib.h>
>   #ifdef HPUX10DYNAMIC
>   #include <dl.h>
>   #define RTLD_LAZY BIND_DEFERRED
> @@ -278,7 +276,6 @@ AC_TRY_COMMAND($DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS conftest1.o $LIBS
>   AC_TRY_COMMAND($CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest2.c 1>&AS_MESSAGE_LOG_FD) &&
>   AC_TRY_COMMAND($DLLD -o conftest2.$DL_EXT $LDFLAGS $DLLDFLAGS conftest2.o $LIBS 1>&AS_MESSAGE_LOG_FD); then
>       AC_RUN_IFELSE([AC_LANG_SOURCE([[
> -#include <stdlib.h>
>   #ifdef HPUX10DYNAMIC
>   #include <dl.h>
>   #define RTLD_LAZY BIND_DEFERRED
> @@ -349,7 +346,6 @@ AC_TRY_COMMAND($DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS conftest1.o $LIBS
>       save_ldflags=$LDFLAGS
>       LDFLAGS="$LDFLAGS $EXTRA_LDFLAGS"
>       AC_RUN_IFELSE([AC_LANG_SOURCE([[
> -#include <stdlib.h>
>   #ifdef HPUX10DYNAMIC
>   #include <dl.h>
>   #define RTLD_LAZY BIND_DEFERRED
> @@ -424,7 +420,6 @@ elif
>       save_ldflags=$LDFLAGS
>       LDFLAGS="$LDFLAGS $EXTRA_LDFLAGS -s"
>       AC_RUN_IFELSE([AC_LANG_SOURCE([[
> -#include <stdlib.h>
>   #ifdef HPUX10DYNAMIC
>   #include <dl.h>
>   #define RTLD_LAZY BIND_DEFERRED
> @@ -493,7 +488,6 @@ echo 'int fred () { return 42; }' > conftest1.c
>   if AC_TRY_COMMAND($CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest1.c 1>&AS_MESSAGE_LOG_FD) &&
>   AC_TRY_COMMAND($DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS -s conftest1.o $LIBS 1>&AS_MESSAGE_LOG_FD); then
>       AC_RUN_IFELSE([AC_LANG_SOURCE([[
> -#include <stdlib.h>
>   #ifdef HPUX10DYNAMIC
>   #include <dl.h>
>   #define RTLD_LAZY BIND_DEFERRED
> diff --git a/configure.ac b/configure.ac
> index 958ac7cd7..074141d38 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -1369,7 +1369,7 @@ zsh_cv_func_realpath_accepts_null,
>   #include <stdlib.h>
>   #include <limits.h>
>   ],[
> -exit(!realpath("/", (char*)0));
> +return(!realpath("/", (char*)0));
>   ])],
>   [zsh_cv_func_realpath_accepts_null=yes],
>   [zsh_cv_func_realpath_accepts_null=no],
> @@ -1393,7 +1393,6 @@ AC_CACHE_CHECK(if tgetent accepts NULL,
>   zsh_cv_func_tgetent_accepts_null,
>   [AC_RUN_IFELSE([AC_LANG_SOURCE([[
>   #include <fcntl.h>
> -#include <stdlib.h>
>   int tgetent(char *, char *);
>   char *tgetstr(char *, char **);
>   int main()
> @@ -1421,7 +1420,6 @@ AC_CACHE_CHECK(if tgetent returns 0 on success,
>   zsh_cv_func_tgetent_zero_success,
>   [AC_RUN_IFELSE([AC_LANG_SOURCE([[
>   #include <fcntl.h>
> -#include <stdlib.h>
>   int tgetent(char *, char*);
>   char *tgetstr(char *, char **);
>   int main()
> @@ -1869,7 +1867,6 @@ zsh_cv_rlim_t_is_longer,
>   #include <sys/time.h>
>   #endif
>   #include <sys/resource.h>
> -#include <stdlib.h>
>   int main(){struct rlimit r;return(sizeof(r.rlim_cur) <= sizeof(long));}]])],[zsh_cv_rlim_t_is_longer=yes],[zsh_cv_rlim_t_is_longer=no],[zsh_cv_rlim_t_is_longer=yes])])
>   if test x$zsh_cv_rlim_t_is_longer = xyes; then
>     AC_CACHE_CHECK(if rlim_t is a quad,
> @@ -1880,7 +1877,6 @@ if test x$zsh_cv_rlim_t_is_longer = xyes; then
>   #endif
>   #include <stdio.h>
>   #include <sys/resource.h>
> -#include <stdlib.h>
>   int main() {
>     struct rlimit r;
>     char buf[20];
> @@ -1903,7 +1899,6 @@ else
>   #include <sys/time.h>
>   #endif
>   #include <sys/resource.h>
> -#include <stdlib.h>
>     int main(){struct rlimit r;r.rlim_cur=-1;return(r.rlim_cur<0);}]])],[zsh_cv_type_rlim_t_is_unsigned=yes],[zsh_cv_type_rlim_t_is_unsigned=no],[zsh_cv_type_rlim_t_is_unsigned=no])])
>     if test x$zsh_cv_type_rlim_t_is_unsigned = xyes; then
>       AC_DEFINE(RLIM_T_IS_UNSIGNED)
> @@ -2187,7 +2182,6 @@ zsh_cv_sys_fifo,
>   #include <fcntl.h>
>   #include <signal.h>
>   #include <unistd.h>
> -#include <stdlib.h>
>   #include <sys/stat.h>
>   int main()
>   {
> @@ -2200,7 +2194,7 @@ int main()
>   #else
>       if(mknod("/tmp/fifo$$", 0010600, 0) < 0)
>   #endif
> -	exit(1);
> +	return(1);
>       pid = fork();
>       if(pid < 0)
>   	return(1);
> @@ -2289,7 +2283,6 @@ zsh_cv_sys_link,
>   [AC_RUN_IFELSE([AC_LANG_SOURCE([[
>   #include <unistd.h>
>   #include <fcntl.h>
> -#include <stdlib.h>
>   int main()
>   {
>       int ret;
> @@ -2322,7 +2315,6 @@ zsh_cv_sys_killesrch,
>   #include <unistd.h>
>   #include <signal.h>
>   #include <errno.h>
> -#include <stdlib.h>
>   int main()
>   {
>       int pid = (getpid() + 10000) & 0xffffff;
> @@ -2348,7 +2340,6 @@ if test x$signals_style = xPOSIX_SIGNALS; then
>       [AC_RUN_IFELSE([AC_LANG_SOURCE([[
>   #include <signal.h>
>   #include <unistd.h>
> -#include <stdlib.h>
>   int child=0;
>   void handler(sig)
>       int sig;
> @@ -2400,14 +2391,13 @@ case "x$zsh_working_tcsetpgrp" in
>   #include <sys/types.h>
>   #include <unistd.h>
>   #include <fcntl.h>
> -#include <stdlib.h>
>   int main() {
>       int fd;
>       int ret;
>       fd=open("/dev/tty", O_RDWR);
> -    if (fd < 0) exit(2);
> +    if (fd < 0) return(2);
>       ret=tcsetpgrp(fd, tcgetpgrp(fd));
> -    if (ret < 0) exit(1);
> +    if (ret < 0) return(1);
>       return(0);
>   }
>   ]])],[zsh_cv_sys_tcsetpgrp=yes],[
> @@ -2775,14 +2765,13 @@ elif test "x$dynamic" = xyes; then
>      zsh_cv_sys_elf,
>      [AC_RUN_IFELSE([AC_LANG_SOURCE([[/* Test for whether ELF binaries are produced */
>   #include <fcntl.h>
> -#include <stdlib.h>
>   #include <unistd.h>
>   int main(int argc, char *argv[])
>   {
>   	char b[4];
>   	int i = open(argv[0],O_RDONLY);
>   	if(i == -1)
> -		exit(1); /* fail */
> +		return(1); /* fail */
>   	if(read(i,b,4)==4 && b[0]==127 && b[1]=='E' && b[2]=='L' && b[3]=='F')
>   		return(0); /* succeed (yes, it's ELF) */
>   	else
> @@ -2928,7 +2917,6 @@ EOM
>       AC_TRY_COMMAND($DLLD $LDFLAGS $DLLDFLAGS -o conftest.$DL_EXT conftest.o 1>&AS_MESSAGE_LOG_FD) &&
>       AC_RUN_IFELSE([AC_LANG_SOURCE([[
>   #include <stdio.h>
> -#include <stdlib.h>
>   #ifdef HPUX10DYNAMIC
>   #include <dl.h>
>   #define RTLD_LAZY BIND_DEFERRED
> @@ -2960,7 +2948,7 @@ int main()
>       void * handle ;
>       void * symbol ;
>       FILE *f=fopen("conftestval", "w");
> -    if (!f) exit(1);
> +    if (!f) return(1);
>       handle = dlopen("./conftest.$DL_EXT", RTLD_LAZY) ;
>       if (handle == NULL) {
>           fprintf (f, "dlopen failed") ;
> 
> 
> 
> 


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2022-09-16 12:03 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-15  2:36 [PATCH] Fix configure test build errors with clang-15 Nicholas Vinson
2022-09-15 22:29 ` Bart Schaefer
2022-09-16  5:49   ` Jun T
2022-09-16  6:40   ` Roman Perepelitsa
2022-09-16  9:33 ` Jun T
2022-09-16 11:58   ` Nicholas Vinson

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).