Re: how to test for a prototype difference

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

 



On 04/30/2014 06:12 PM, Thomas Klausner wrote:
> Hi!
> 
> I found out that the prototypes for backtrace() and backtrace_symbol()
> differ on some operating systems.
> 

> 
> The main difference is that on NetBSD, size_t is used for most
> arguments that are int on the other systems; also,
> backtrace_symbols_fd returns an int.
> 
> I'd like to test for the difference int <-> size_t in a configure
> script so I can get integer type/sign conversion-warnings free code on
> all these operating systems.
> 
> I'm however not sure how to do this. Does anyone have a suggestion?

Yep - use function pointer assignment or redeclaration to force the
compiler to complain if the redeclaration used the wrong type.  Gnulib
has some examples; here's one with ioctl(), which on Linux takes an
'unsigned long' instead of the POSIX 'int' for the second parameter:

    AC_CACHE_CHECK([for ioctl with POSIX signature],
      [gl_cv_func_ioctl_posix_signature],
      [AC_COMPILE_IFELSE(
         [AC_LANG_PROGRAM(
            [[#include <sys/ioctl.h>]],
            [[extern
              #ifdef __cplusplus
              "C"
              #endif
              int ioctl (int, int, ...);
            ]])
         ],
         [gl_cv_func_ioctl_posix_signature=yes],
         [gl_cv_func_ioctl_posix_signature=no])
      ])
    if test $gl_cv_func_ioctl_posix_signature != yes; then
      REPLACE_IOCTL=1
    fi

Or this one originally from gettext (but annoyingly encroaching on
automake's namespace), checking whether iconv() uses a const or not:

    AC_MSG_CHECKING([for iconv declaration])
    AC_CACHE_VAL([am_cv_proto_iconv], [
      AC_COMPILE_IFELSE(
        [AC_LANG_PROGRAM(
           [[
#include <stdlib.h>
#include <iconv.h>
extern
#ifdef __cplusplus
"C"
#endif
#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus)
size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char *
*outbuf, size_t *outbytesleft);
#else
size_t iconv();
#endif
           ]],
           [[]])],
        [am_cv_proto_iconv_arg1=""],
        [am_cv_proto_iconv_arg1="const"])
      am_cv_proto_iconv="extern size_t iconv (iconv_t cd,
$am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char *
*outbuf, size_t *outbytesleft);"])
    am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e
's/( /(/'`
    AC_MSG_RESULT([
         $am_cv_proto_iconv])
    AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1],
      [Define as const if the declaration of iconv() needs const.])

Hopefully that gives you some ideas.

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Autoconf mailing list
Autoconf@xxxxxxx
https://lists.gnu.org/mailman/listinfo/autoconf

[Index of Archives]     [GCC Help]     [Kernel Discussion]     [RPM Discussion]     [Red Hat Development]     [Yosemite News]     [Linux USB]     [Samba]

  Powered by Linux