mirror of
https://github.com/freebsd/freebsd-src.git
synced 2026-10-28 11:25:21 +01:00
sys: Add sys/ckdint.h
We have a C23 stdckdint.h header for userspace, which provides checked addition, subtraction and multiplication. We lack similar helpers in the kernel, where they are regularly needed. Let's just adopt the C23 macros. For bonus points, I added a wrapper to ensure that ignored an return value is raised as an error by the compiler. Reviewed by: kib, emaste MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D58773
This commit is contained in:
1 parent
4c1004c00f
commit
37bd69d43c
2 files changed
+49
-24
No files matched your search
+2
-24
@@ -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
|
||||
|
||||
|
||||
@@ -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_ */
|
||||
Reference in new issue
Block a user