diff options
| -rw-r--r-- | include/stdckdint.h | 26 | ||||
| -rw-r--r-- | sys/sys/ckdint.h | 47 |
2 files changed, 49 insertions, 24 deletions
diff --git a/include/stdckdint.h b/include/stdckdint.h index 9cb877fe8198..fe1e100abe32 100644 --- a/include/stdckdint.h +++ b/include/stdckdint.h @@ -7,33 +7,11 @@ #ifndef __STDC_VERSION_STDCKDINT_H__ #define __STDC_VERSION_STDCKDINT_H__ 202311L -#include <sys/cdefs.h> +#include <sys/_visible.h> #if __BSD_VISIBLE || __ISO_C_VISIBLE >= 2023 -#if __GNUC_PREREQ__(5, 1) || __has_builtin(__builtin_add_overflow) -#define ckd_add(result, a, b) \ - __builtin_add_overflow((a), (b), (result)) -#else -#define ckd_add(result, a, b) \ - _Static_assert(0, "checked addition not supported") -#endif - -#if __GNUC_PREREQ__(5, 1) || __has_builtin(__builtin_sub_overflow) -#define ckd_sub(result, a, b) \ - __builtin_sub_overflow((a), (b), (result)) -#else -#define ckd_sub(result, a, b) \ - _Static_assert(0, "checked subtraction not supported") -#endif - -#if __GNUC_PREREQ__(5, 1) || __has_builtin(__builtin_mul_overflow) -#define ckd_mul(result, a, b) \ - __builtin_mul_overflow((a), (b), (result)) -#else -#define ckd_mul(result, a, b) \ - _Static_assert(0, "checked multiplication not supported") -#endif +#include <sys/ckdint.h> #endif diff --git a/sys/sys/ckdint.h b/sys/sys/ckdint.h new file mode 100644 index 000000000000..273d38fd713b --- /dev/null +++ b/sys/sys/ckdint.h @@ -0,0 +1,47 @@ +/*- + * Copyright (c) 2023 Dag-Erling Smørgrav + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#ifndef _SYS_CKDINT_H_ +#define _SYS_CKDINT_H_ + +#include <sys/cdefs.h> + +#ifdef _KERNEL +/* If you're not checking the return value, what's the point? */ +__nodiscard static inline bool +__ckd_result(bool result) +{ + return (result); +} +#else +#define __ckd_result(result) (result) +#endif + +#if __GNUC_PREREQ__(5, 1) || __has_builtin(__builtin_add_overflow) +#define ckd_add(result, a, b) \ + __ckd_result(__builtin_add_overflow((a), (b), (result))) +#else +#define ckd_add(result, a, b) \ + _Static_assert(0, "checked addition not supported") +#endif + +#if __GNUC_PREREQ__(5, 1) || __has_builtin(__builtin_sub_overflow) +#define ckd_sub(result, a, b) \ + __ckd_result(__builtin_sub_overflow((a), (b), (result))) +#else +#define ckd_sub(result, a, b) \ + _Static_assert(0, "checked subtraction not supported") +#endif + +#if __GNUC_PREREQ__(5, 1) || __has_builtin(__builtin_mul_overflow) +#define ckd_mul(result, a, b) \ + __ckd_result(__builtin_mul_overflow((a), (b), (result))) +#else +#define ckd_mul(result, a, b) \ + _Static_assert(0, "checked multiplication not supported") +#endif + +#endif /* _SYS_CKDINT_H_ */ |
