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