libmicrohttpd2

HTTP server C library (MHD 2.x, alpha)
Log | Files | Refs | README | LICENSE

commit 881319d4ec275b9f216b6dbd0c626d614a6ab341
parent 8dce8e2c7408b0f391b5f64cafb4392e91fb387a
Author: Evgeny Grin (Karlson2k) <k2k@drgrin.dev>
Date:   Fri, 30 Oct 2026 17:15:06 +0100

Added a new macro MHD_FN_PAR_NONNULL_IF_NONZERO_(ptr,size)

Diffstat:
Mconfigure.ac | 24++++++++++++++++++++++++
Mcontrib/uncrustify.cfg | 6++++--
Msrc/incl_priv/mhd_sys_options.h | 7+++++++
Msrc/include/microhttpd2_portability.h | 16++++++++++++++++
Msrc/mhd2/cpp.hint | 2++
5 files changed, 53 insertions(+), 2 deletions(-)

diff --git a/configure.ac b/configure.ac @@ -5566,6 +5566,30 @@ AS_VAR_IF([mhd_cv_cc_attr_nonnull_num],["yes"], ) ] ) +AC_CACHE_CHECK([whether $CC supports __attribute__ ((nonnull_if_nonzero(NUM1,NUM2)))],[mhd_cv_cc_attr_nonnull_if_nonzero], + [ + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ +static __attribute__ ((nonnull_if_nonzero(1,2))) int +test_func(int *p1, unsigned int num) { + return (0 == num) ? 0 : (p1[0] + 1); +} + +int main(void) { + return test_func( (int *)(void *)0, 0); +} + ]]) + ], + [mhd_cv_cc_attr_nonnull_if_nonzero="yes"],[mhd_cv_cc_attr_nonnull_if_nonzero="no"] + ) + ] +) +AS_VAR_IF([mhd_cv_cc_attr_nonnull_if_nonzero],["yes"], + [ + AC_DEFINE([HAVE_ATTR_NONNULL_IF_NONZERO],[1], + [Define to '1' if your compiler supports __attribute__ ((nonnull_if_nonzero(NUM1,NUM2)))] + ) + ] +) AC_CACHE_CHECK([whether $CC supports __attribute__ ((access (read_only,NUM)))],[mhd_cv_cc_attr_access_read], [ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ diff --git a/contrib/uncrustify.cfg b/contrib/uncrustify.cfg @@ -160,7 +160,9 @@ set QUALIFIER MHD_FN_RETURNS_NONNULL_ set QUALIFIER MHD_FN_PAR_CSTR_ MHD_FN_PAR_FD_READ_ MHD_FN_PAR_FIX_ARR_SIZE_ set QUALIFIER MHD_FN_PAR_DYN_ARR_SIZE_ set QUALIFIER MHD_FN_PAR_IN_ MHD_FN_PAR_IN_SIZE_ MHD_FN_PAR_INOUT_ -set QUALIFIER MHD_FN_PAR_INOUT_SIZE_ MHD_FN_PAR_NONNULL_ -set QUALIFIER MHD_FN_PAR_NONNULL_ALL_ MHD_FN_PAR_OUT_ MHD_FN_PAR_OUT_SIZE_ +set QUALIFIER MHD_FN_PAR_INOUT_SIZE_ +set QUALIFIER MHD_FN_PAR_NONNULL_ MHD_FN_PAR_NONNULL_ALL_ +set QUALIFIER MHD_FN_PAR_NONNULL_IF_NONZERO_ +set QUALIFIER MHD_FN_PAR_OUT_ MHD_FN_PAR_OUT_SIZE_ set QUALIFIER mhd_FN_OBJ_CONSTRUCTOR mhd_FN_RET_ALIGNED mhd_FN_RET_SIZED set QUALIFIER mhd_FN_RET_UNALIASED diff --git a/src/incl_priv/mhd_sys_options.h b/src/incl_priv/mhd_sys_options.h @@ -174,6 +174,13 @@ # define MHD_FN_PAR_NONNULL_ALL_ /* empty */ #endif +#ifdef HAVE_ATTR_NONNULL_IF_NONZERO +# define MHD_FN_PAR_NONNULL_IF_NONZERO_(ptr_num, size_num) \ + __attribute__ ((nonnull_if_nonzero (ptr_num, size_num))) +#else +# define MHD_FN_PAR_NONNULL_IF_NONZERO_(ptr_num, size_num) /* empty */ +#endif + #ifdef HAVE_ATTR_ACCESS_READ # define MHD_FN_PAR_IN_(param_num) \ __attribute__ ((access (read_only,param_num))) diff --git a/src/include/microhttpd2_portability.h b/src/include/microhttpd2_portability.h @@ -710,6 +710,19 @@ # define MHD_FN_PAR_NONNULL_ALL_ __attribute__ ((nonnull)) # endif /* nonnull && !MHD_FN_PAR_NONNULL_ALL_ */ +/* Override detected value of MHD_FN_PAR_NONNULL_IF_NONZERO_ by defining it + * before including the header */ +# if __has_attribute (nonnull_if_nonzero) && \ + !defined(MHD_FN_PAR_NONNULL_IF_NONZERO_) +/** + * MHD_FN_PAR_NONNULL_IF_NONZERO_ indicates function parameter number + * @a ptr_num must never be NULL if function parameter number @a size_num + * is non-zero. + */ +# define MHD_FN_PAR_NONNULL_IF_NONZERO_(ptr_num, size_num) \ + __attribute__ ((nonnull_if_nonzero (ptr_num,size_num))) +# endif /* nonnull_if_nonzero && !MHD_FN_PAR_NONNULL_IF_NONZERO_ */ + # if __has_attribute (access) /* Override detected value of MHD_FN_PAR_IN_ by defining it before @@ -850,6 +863,9 @@ #ifndef MHD_FN_PAR_NONNULL_ALL_ # define MHD_FN_PAR_NONNULL_ALL_ /* empty */ #endif /* ! MHD_FN_PAR_NONNULL_ALL_ */ +#ifndef MHD_FN_PAR_NONNULL_IF_NONZERO_ +# define MHD_FN_PAR_NONNULL_IF_NONZERO_(ptr_num, size_num) /* empty */ +#endif /* ! MHD_FN_PAR_NONNULL_IF_NONZERO_ */ #ifndef MHD_FN_PAR_IN_ # define MHD_FN_PAR_IN_(param_num) /* empty */ #endif /* !MHD_FN_PAR_IN_ */ diff --git a/src/mhd2/cpp.hint b/src/mhd2/cpp.hint @@ -27,6 +27,8 @@ #define MHD_FN_PAR_NONNULL_ALL_ /* empty */ +#define MHD_FN_PAR_NONNULL_IF_NONZERO_(ptr_num,size_num) /* empty */ + #define MHD_FN_PAR_IN_(param_num) /* empty */ #define MHD_FN_PAR_IN_SIZE_(param_num,size_num) /* empty */