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:
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 */