bug-autoconf
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

AC_FUNC_ALLOCA description is not clear, potentially wrong


From: Vincent Lefevre
Subject: AC_FUNC_ALLOCA description is not clear, potentially wrong
Date: Thu, 24 Jan 2019 16:45:55 +0100
User-agent: Mutt/1.11.2+89 (4e6744dc) vl-114617 (2019-01-18)

The current AC_FUNC_ALLOCA description is:

 -- Macro: AC_FUNC_ALLOCA
     Check how to get 'alloca'.  Tries to get a builtin version by
     checking for 'alloca.h' or the predefined C preprocessor macros
     '__GNUC__' and '_AIX'.  If this macro finds 'alloca.h', it defines
     'HAVE_ALLOCA_H'.

     If those attempts fail, it looks for the function in the standard C
     library.  If any of those methods succeed, it defines
     'HAVE_ALLOCA'.  Otherwise, it sets the output variable 'ALLOCA' to
     '${LIBOBJDIR}alloca.o' and defines 'C_ALLOCA' (so programs can
     periodically call 'alloca (0)' to garbage collect).  This variable
     is separate from 'LIBOBJS' so multiple programs can share the value
     of 'ALLOCA' without needing to create an actual library, in case
     only some of them use the code in 'LIBOBJS'.  The '${LIBOBJDIR}'
     prefix serves the same purpose as in 'LIBOBJS' (*note AC_LIBOBJ vs
     LIBOBJS::).

     This macro does not try to get 'alloca' from the System V R3
     'libPW' or the System V R4 'libucb' because those libraries contain
     some incompatible functions that cause trouble.  Some versions do
     not even contain 'alloca' or contain a buggy version.  If you still
     want to use their 'alloca', use 'ar' to extract 'alloca.o' from
     them instead of compiling 'alloca.c'.

     Source files that use 'alloca' should start with a piece of code
     like the following, to declare it properly.

          #ifdef STDC_HEADERS
          # include <stdlib.h>
          # include <stddef.h>
          #else
          # ifdef HAVE_STDLIB_H
          #  include <stdlib.h>
          # endif
          #endif
          #ifdef HAVE_ALLOCA_H
          # include <alloca.h>
          #elif !defined alloca
          # ifdef __GNUC__
          #  define alloca __builtin_alloca
          # elif defined _AIX
          #  define alloca __alloca
          # elif defined _MSC_VER
          #  include <malloc.h>
          #  define alloca _alloca
          # elif !defined HAVE_ALLOCA
          #  ifdef  __cplusplus
          extern "C"
          #  endif
          void *alloca (size_t);
          # endif
          #endif

The conditions under which 'HAVE_ALLOCA' is defined are not clear.

In particular, the line

          # elif !defined HAVE_ALLOCA

seems surprising. I would have thought that it should have been

          # elif defined HAVE_ALLOCA

(i.e. the function exists, but <alloca.h> is not there to declare
it, so that the code needs to do the declaration). If alloca() is
completely missing, one should not use it, so that declaring it
may not be a good idea. If this is for the case where the user
compiles alloca.c, then this should be handled in a separate case.

-- 
Vincent Lefèvre <address@hidden> - Web: <https://www.vinc17.net/>
100% accessible validated (X)HTML - Blog: <https://www.vinc17.net/blog/>
Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]