xref: /freebsd/lib/libc/stdlib/memalignment.c (revision 6c57e368eb1777f6097158eeca2fcc175d068dba)
1 /*
2  * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org>
3  *
4  * SPDX-License-Identifier: BSD-2-Clause
5  */
6 
7 #include <stdint.h>
8 #include <stdlib.h>
9 
10 size_t
memalignment(const void * p)11 memalignment(const void *p)
12 {
13 	uintptr_t align;
14 
15 	if (p == NULL)
16 		return (0);
17 
18 	align = (uintptr_t)p;
19 	align &= -align;
20 
21 #if UINTPTR_MAX > SIZE_MAX
22 	/* if alignment overflows size_t, return maximum possible */
23 	if (align > SIZE_MAX)
24 		align = SIZE_MAX - SIZE_MAX/2;
25 #endif
26 
27 	return (align);
28 }
29