From a1022693641ebabf99e4c1ecd7561ad2663ad57a Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 4 Aug 2025 16:17:41 +1000 Subject: [PATCH] util: mark the various bitmask functions as nonnull Might as well get a bit of compiler help here. Part-of: --- src/util-bits.h | 48 ++++++++++++++++++----------------------------- src/util-macros.h | 1 + 2 files changed, 19 insertions(+), 30 deletions(-) diff --git a/src/util-bits.h b/src/util-bits.h index 3c5a21a9..fa37613b 100644 --- a/src/util-bits.h +++ b/src/util-bits.h @@ -140,8 +140,7 @@ bitmask_all(bitmask_t mask, bitmask_t bits) return bits.mask != 0 && (mask.mask & bits.mask) == bits.mask; } -static inline bool -bitmask_merge(bitmask_t *mask, bitmask_t bits) +_nonnull_(1) static inline bool bitmask_merge(bitmask_t *mask, bitmask_t bits) { bool all = bitmask_all(*mask, bits); @@ -150,8 +149,7 @@ bitmask_merge(bitmask_t *mask, bitmask_t bits) return all; } -static inline bool -bitmask_clear(bitmask_t *mask, bitmask_t bits) +_nonnull_(1) static inline bool bitmask_clear(bitmask_t *mask, bitmask_t bits) { bool all = bitmask_all(*mask, bits); @@ -166,16 +164,14 @@ bitmask_bit_is_set(bitmask_t mask, unsigned int bit) return !!(mask.mask & bit(bit)); } -static inline bool -bitmask_set_bit(bitmask_t *mask, unsigned int bit) +_nonnull_(1) static inline bool bitmask_set_bit(bitmask_t *mask, unsigned int bit) { bool isset = bitmask_bit_is_set(*mask, bit); mask->mask |= bit(bit); return isset; } -static inline bool -bitmask_clear_bit(bitmask_t *mask, unsigned int bit) +_nonnull_(1) static inline bool bitmask_clear_bit(bitmask_t *mask, unsigned int bit) { bool isset = bitmask_bit_is_set(*mask, bit); mask->mask &= ~bit(bit); @@ -259,8 +255,7 @@ _infmask_size_for_bit(unsigned int bit) return (bit / bitmask_size()) + 1; } -static inline void -_infmask_ensure_size(infmask_t *mask, unsigned int bit) +_nonnull_(1) static inline void _infmask_ensure_size(infmask_t *mask, unsigned int bit) { size_t required = _infmask_size_for_bit(bit); if (required > mask->nmasks) { @@ -279,23 +274,20 @@ infmask_new(void) return m; } -static inline void -infmask_reset(infmask_t *mask) +_nonnull_(1) static inline void infmask_reset(infmask_t *mask) { free(mask->mask); mask->mask = NULL; mask->nmasks = 0; } -static inline void -infmask_destroy(infmask_t *mask) +_nonnull_(1) static inline void infmask_destroy(infmask_t *mask) { infmask_reset(mask); free(mask); } -static inline bool -infmask_is_empty(const infmask_t *mask) +_nonnull_(1) static inline bool infmask_is_empty(const infmask_t *mask) { if (!mask->mask) return true; @@ -306,8 +298,8 @@ infmask_is_empty(const infmask_t *mask) return true; } -static inline bool -infmask_any(const infmask_t *mask, const infmask_t *bits) +_nonnull_(1) static inline bool infmask_any(const infmask_t *mask, + const infmask_t *bits) { if (!mask->mask || !bits->mask) return false; @@ -319,8 +311,8 @@ infmask_any(const infmask_t *mask, const infmask_t *bits) return false; } -static inline bool -infmask_all(const infmask_t *mask, const infmask_t *bits) +_nonnull_(1) static inline bool infmask_all(const infmask_t *mask, + const infmask_t *bits) { if (!bits->mask) return true; @@ -340,8 +332,7 @@ infmask_all(const infmask_t *mask, const infmask_t *bits) return true; } -static inline bool -infmask_merge(infmask_t *mask, const infmask_t *bits) +_nonnull_(1) static inline bool infmask_merge(infmask_t *mask, const infmask_t *bits) { if (!bits->mask) return true; @@ -357,8 +348,7 @@ infmask_merge(infmask_t *mask, const infmask_t *bits) return all; } -static inline bool -infmask_clear(infmask_t *mask, const infmask_t *bits) +_nonnull_(1) static inline bool infmask_clear(infmask_t *mask, const infmask_t *bits) { if (!mask->mask || !bits->mask) return false; @@ -372,8 +362,8 @@ infmask_clear(infmask_t *mask, const infmask_t *bits) return all; } -static inline bool -infmask_bit_is_set(const infmask_t *mask, unsigned int bit) +_nonnull_(1) static inline bool infmask_bit_is_set(const infmask_t *mask, + unsigned int bit) { if (!mask->mask || bit / bitmask_size() >= mask->nmasks) return false; @@ -382,8 +372,7 @@ infmask_bit_is_set(const infmask_t *mask, unsigned int bit) bit % bitmask_size()); } -static inline bool -infmask_set_bit(infmask_t *mask, unsigned int bit) +_nonnull_(1) static inline bool infmask_set_bit(infmask_t *mask, unsigned int bit) { _infmask_ensure_size(mask, bit); @@ -392,8 +381,7 @@ infmask_set_bit(infmask_t *mask, unsigned int bit) return isset; } -static inline bool -infmask_clear_bit(infmask_t *mask, unsigned int bit) +_nonnull_(1) static inline bool infmask_clear_bit(infmask_t *mask, unsigned int bit) { if (!mask->mask || bit / bitmask_size() >= mask->nmasks) return false; diff --git a/src/util-macros.h b/src/util-macros.h index f2b9dca0..79c13a95 100644 --- a/src/util-macros.h +++ b/src/util-macros.h @@ -115,6 +115,7 @@ #define _unused_ __attribute__((unused)) #define _fallthrough_ __attribute__((fallthrough)) +#define _nonnull_(...) __attribute__((nonnull(__VA_ARGS__))) /* Returns the number of macro arguments, this expands * _VARIABLE_MACRO_NARGS(a, b, c) to NTH_ARG(a, b, c, 15, 14, 13, .... 4, 3, 2, 1).