diff options
| author | Robert Clausecker <fuz@FreeBSD.org> | 2025-11-10 17:54:41 +0000 |
|---|---|---|
| committer | Robert Clausecker <fuz@FreeBSD.org> | 2025-12-12 10:32:58 +0000 |
| commit | 24ea81047de7c75fd57c54deda0b36c3225c367b (patch) | |
| tree | 802f24d2b6f4b3caa4322b41010f23ba97c194c5 /lib/libc/stdlib/memalignment.c | |
| parent | e72536a11fab2dbd17174a3205c394b82ae65b88 (diff) | |
lib/libc: implement C23 memalignment()
This new function computes the alignment of a pointer.
It is part of ISO/IEC 9899:2024, the new C standard.
If the pointer is a null pointer, null is returned.
I have tried to write an implementation that can cope
with traditional address-based architectures, even if
size_t and uintptr_t are of different length. Adjustments
may be needed for CHERI though.
A man page is provided, too. No unit test for now.
Reviewed by: kib, imp, ziaee (manpages), pauamma@gundo.com
Approved by: markj (mentor)
MFC after: 1 month
Relnotes: yes
Differential Revision: https://reviews.freebsd.org/D53673
(cherry picked from commit 6c57e368eb1777f6097158eeca2fcc175d068dba)
Diffstat (limited to 'lib/libc/stdlib/memalignment.c')
| -rw-r--r-- | lib/libc/stdlib/memalignment.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/lib/libc/stdlib/memalignment.c b/lib/libc/stdlib/memalignment.c new file mode 100644 index 000000000000..771ddc2f5253 --- /dev/null +++ b/lib/libc/stdlib/memalignment.c @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include <stdint.h> +#include <stdlib.h> + +size_t +memalignment(const void *p) +{ + uintptr_t align; + + if (p == NULL) + return (0); + + align = (uintptr_t)p; + align &= -align; + +#if UINTPTR_MAX > SIZE_MAX + /* if alignment overflows size_t, return maximum possible */ + if (align > SIZE_MAX) + align = SIZE_MAX - SIZE_MAX/2; +#endif + + return (align); +} |
