# realloc.m4 # serial 39 dnl Copyright (C) 2007, 2009-2024 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl This file is offered as-is, without any warranty. # An an experimental option, the user can request a sanitized realloc() # implementation, i.e. one that aborts upon undefined behaviour, # by setting # gl_cv_func_realloc_sanitize=yes # at configure time. AC_DEFUN([gl_FUNC_REALLOC_SANITIZED], [ AC_CACHE_CHECK([whether realloc should abort upon undefined behaviour], [gl_cv_func_realloc_sanitize], [test -n "$gl_cv_func_realloc_sanitize" || gl_cv_func_realloc_sanitize=no]) ]) # gl_FUNC_REALLOC_POSIX # --------------------- # Test whether 'realloc' is POSIX compliant (sets errno to ENOMEM when it # fails, and doesn't mess up with ptrdiff_t overflow), # and replace realloc if it is not. AC_DEFUN([gl_FUNC_REALLOC_POSIX], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_REQUIRE([gl_FUNC_MALLOC_POSIX]) AC_REQUIRE([gl_FUNC_REALLOC_SANITIZED]) if test "$gl_cv_func_realloc_sanitize" != no; then REPLACE_REALLOC_FOR_REALLOC_POSIX=1 AC_DEFINE([NEED_SANITIZED_REALLOC], [1], [Define to 1 if realloc should abort upon undefined behaviour.]) else REPLACE_REALLOC_FOR_REALLOC_POSIX=$REPLACE_MALLOC_FOR_MALLOC_POSIX fi ]) # gl_FUNC_REALLOC_0_NONNULL # ------------------------- # Replace realloc if realloc (..., 0) returns null. # Modules that use this macro directly or indirectly should depend # on extensions-aix, so that _LINUX_SOURCE_COMPAT gets defined # before this macro gets invoked. This helps if !(__VEC__ || __AIXVEC), # and doesn't hurt otherwise. AC_DEFUN([gl_FUNC_REALLOC_0_NONNULL], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) AC_REQUIRE([AC_CANONICAL_HOST])dnl for cross-compiles AC_REQUIRE([gl_FUNC_REALLOC_POSIX]) AC_CACHE_CHECK([whether realloc (..., 0) returns nonnull], [gl_cv_func_realloc_0_nonnull], [AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[#include /* Use prealloc to test; "volatile" prevents the compiler from optimizing the realloc call away. */ void *(*volatile prealloc) (void *, size_t) = realloc;]], [[void *p = prealloc (0, 0); int result = !p; p = prealloc (p, 0); result |= !p; free (p); return result;]])], [gl_cv_func_realloc_0_nonnull=yes], [gl_cv_func_realloc_0_nonnull=no], [AS_CASE([$host_os], [# Guess yes on platforms where we know the result. freebsd* | netbsd* | openbsd* | darwin* | bitrig* \ | *-musl* | midipix* | midnightbsd* \ | hpux* | solaris* | cygwin*], [gl_cv_func_realloc_0_nonnull="guessing yes"], [# Guess as follows if we don't know. gl_cv_func_realloc_0_nonnull=$gl_cross_guess_normal])])]) AS_CASE([$gl_cv_func_realloc_0_nonnull], [*yes], [AC_DEFINE([HAVE_REALLOC_0_NONNULL], [1], [Define to 1 if realloc (..., 0) returns nonnull.])], [AS_CASE([$gl_cv_func_realloc_sanitize,$gl_cv_malloc_ptrdiff,$gl_cv_func_malloc_posix,$host], [yes,*,*,* | *,no,*,* | *,*,*no,* | *,*,*,aarch64c-*-freebsd*], [REPLACE_REALLOC_FOR_REALLOC_POSIX=1], [# Optimize for common case of glibc 2.1.1+ and compatibles. REPLACE_REALLOC_FOR_REALLOC_POSIX=2])]) ])