xref: /xnu-11215.1.10/osfmk/libsa/string.h (revision 8d741a5de7ff4191bf97d57b9f54c2f6d4a15585)
1*8d741a5dSApple OSS Distributions /*
2*8d741a5dSApple OSS Distributions  * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved.
3*8d741a5dSApple OSS Distributions  *
4*8d741a5dSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*8d741a5dSApple OSS Distributions  *
6*8d741a5dSApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*8d741a5dSApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*8d741a5dSApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*8d741a5dSApple OSS Distributions  * compliance with the License. The rights granted to you under the License
10*8d741a5dSApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
11*8d741a5dSApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
12*8d741a5dSApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
13*8d741a5dSApple OSS Distributions  * terms of an Apple operating system software license agreement.
14*8d741a5dSApple OSS Distributions  *
15*8d741a5dSApple OSS Distributions  * Please obtain a copy of the License at
16*8d741a5dSApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*8d741a5dSApple OSS Distributions  *
18*8d741a5dSApple OSS Distributions  * The Original Code and all software distributed under the License are
19*8d741a5dSApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*8d741a5dSApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*8d741a5dSApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*8d741a5dSApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*8d741a5dSApple OSS Distributions  * Please see the License for the specific language governing rights and
24*8d741a5dSApple OSS Distributions  * limitations under the License.
25*8d741a5dSApple OSS Distributions  *
26*8d741a5dSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*8d741a5dSApple OSS Distributions  */
28*8d741a5dSApple OSS Distributions /*
29*8d741a5dSApple OSS Distributions  * NOTICE: This file was modified by McAfee Research in 2004 to introduce
30*8d741a5dSApple OSS Distributions  * support for mandatory and extensible security protections.  This notice
31*8d741a5dSApple OSS Distributions  * is included in support of clause 2.2 (b) of the Apple Public License,
32*8d741a5dSApple OSS Distributions  * Version 2.0.
33*8d741a5dSApple OSS Distributions  */
34*8d741a5dSApple OSS Distributions /*
35*8d741a5dSApple OSS Distributions  * HISTORY
36*8d741a5dSApple OSS Distributions  * @OSF_COPYRIGHT@
37*8d741a5dSApple OSS Distributions  */
38*8d741a5dSApple OSS Distributions 
39*8d741a5dSApple OSS Distributions #if (defined(__has_include) && __has_include(<__xnu_libcxx_sentinel.h>) && !defined(XNU_LIBCXX_SDKROOT))
40*8d741a5dSApple OSS Distributions 
41*8d741a5dSApple OSS Distributions #if !__has_include_next(<string.h>)
42*8d741a5dSApple OSS Distributions #error Do not build with -nostdinc (use GCC_USE_STANDARD_INCLUDE_SEARCHING=NO)
43*8d741a5dSApple OSS Distributions #endif /* !__has_include_next(<string.h>) */
44*8d741a5dSApple OSS Distributions 
45*8d741a5dSApple OSS Distributions #include_next <string.h>
46*8d741a5dSApple OSS Distributions 
47*8d741a5dSApple OSS Distributions #else /* (defined(__has_include) && __has_include(<__xnu_libcxx_sentinel.h>) && !defined(XNU_LIBCXX_SDKROOT)) */
48*8d741a5dSApple OSS Distributions 
49*8d741a5dSApple OSS Distributions #ifndef _STRING_H_
50*8d741a5dSApple OSS Distributions #define _STRING_H_      1
51*8d741a5dSApple OSS Distributions 
52*8d741a5dSApple OSS Distributions #include <sys/cdefs.h>
53*8d741a5dSApple OSS Distributions #ifdef MACH_KERNEL_PRIVATE
54*8d741a5dSApple OSS Distributions #include <types.h>
55*8d741a5dSApple OSS Distributions #else /* MACH_KERNEL_PRIVATE */
56*8d741a5dSApple OSS Distributions #include <sys/types.h>
57*8d741a5dSApple OSS Distributions #endif /* MACH_KERNEL_PRIVATE */
58*8d741a5dSApple OSS Distributions 
59*8d741a5dSApple OSS Distributions #ifdef KERNEL
60*8d741a5dSApple OSS Distributions #include <machine/trap.h>
61*8d741a5dSApple OSS Distributions #endif /* KERNEL */
62*8d741a5dSApple OSS Distributions 
63*8d741a5dSApple OSS Distributions __BEGIN_DECLS
64*8d741a5dSApple OSS Distributions 
65*8d741a5dSApple OSS Distributions #ifndef NULL
66*8d741a5dSApple OSS Distributions #if defined (__cplusplus)
67*8d741a5dSApple OSS Distributions #if __cplusplus >= 201103L
68*8d741a5dSApple OSS Distributions #define NULL nullptr
69*8d741a5dSApple OSS Distributions #else
70*8d741a5dSApple OSS Distributions #define NULL 0
71*8d741a5dSApple OSS Distributions #endif
72*8d741a5dSApple OSS Distributions #else
73*8d741a5dSApple OSS Distributions #define NULL ((void *)0)
74*8d741a5dSApple OSS Distributions #endif
75*8d741a5dSApple OSS Distributions #endif
76*8d741a5dSApple OSS Distributions 
77*8d741a5dSApple OSS Distributions /*
78*8d741a5dSApple OSS Distributions  * Memory functions
79*8d741a5dSApple OSS Distributions  *
80*8d741a5dSApple OSS Distributions  *   int bcmp(const void *s1, const void *s2, size_t n);
81*8d741a5dSApple OSS Distributions  *   int memcmp(const void *s1, const void *s2, size_t n);
82*8d741a5dSApple OSS Distributions  *   int timingsafe_bcmp(const void *b1, const void *b2, size_t n);
83*8d741a5dSApple OSS Distributions  *
84*8d741a5dSApple OSS Distributions  *   void bzero(void *dst, size_t n);
85*8d741a5dSApple OSS Distributions  *   void *memset(void *s, int c, size_t n);
86*8d741a5dSApple OSS Distributions  *   int memset_s(void *s, size_t smax, int c, size_t n);
87*8d741a5dSApple OSS Distributions  *
88*8d741a5dSApple OSS Distributions  *   void bcopy(const void *src, void *dst, size_t n);
89*8d741a5dSApple OSS Distributions  *   void *memcpy(void *dst, const void *src, size_t n);
90*8d741a5dSApple OSS Distributions  *   void *memove(void *dst, const void *src, size_t n);
91*8d741a5dSApple OSS Distributions  *
92*8d741a5dSApple OSS Distributions  *
93*8d741a5dSApple OSS Distributions  * String functions
94*8d741a5dSApple OSS Distributions  *
95*8d741a5dSApple OSS Distributions  *   size_t strlen(const char *s);
96*8d741a5dSApple OSS Distributions  *   size_t strnlen(const char *s, size_t n);
97*8d741a5dSApple OSS Distributions  *
98*8d741a5dSApple OSS Distributions  *   int strcmp(const char *s1, const char *s2);
99*8d741a5dSApple OSS Distributions  *   int strncmp(const char *s1, const char *s2, size_t n);
100*8d741a5dSApple OSS Distributions  *   int strlcmp(const char *s1, const char *s2, size_t n);
101*8d741a5dSApple OSS Distributions  *   int strbufcmp(const char *s1, size_t n1, const char *s2, size_t n2);
102*8d741a5dSApple OSS Distributions  *   int strprefix(const char *s1, const char *s2);
103*8d741a5dSApple OSS Distributions  *   int strcasecmp(const char *s1, const char *s2);
104*8d741a5dSApple OSS Distributions  *   int strncasecmp(const char *s1, const char *s2, size_t n);
105*8d741a5dSApple OSS Distributions  *   int strlcasecmp(const char *s1, const char *s2, size_t n);
106*8d741a5dSApple OSS Distributions  *   int strbufcasecmp(const char *s1, size_t n1, const char *s2, size_t n2);
107*8d741a5dSApple OSS Distributions  *
108*8d741a5dSApple OSS Distributions  *   char *strchr(const char *s, int c);
109*8d741a5dSApple OSS Distributions  *   char *strrchr(const char *s, int c);
110*8d741a5dSApple OSS Distributions  *   char *strnstr(const char *s, const char *find, size_t slen);
111*8d741a5dSApple OSS Distributions  *
112*8d741a5dSApple OSS Distributions  *   size_t strlcpy(char *dst, const char *src, size_t n);
113*8d741a5dSApple OSS Distributions  *   const char *strbufcpy(char *dst, size_t dstlen, const char *src, size_t srclen);
114*8d741a5dSApple OSS Distributions  *   size_t strlcat(char *dst, const char *src, size_t n);
115*8d741a5dSApple OSS Distributions  *   const char *strbufcat(char *dst, size_t dstlen, const char *src, size_t srclen);
116*8d741a5dSApple OSS Distributions  */
117*8d741a5dSApple OSS Distributions 
118*8d741a5dSApple OSS Distributions 
119*8d741a5dSApple OSS Distributions #pragma mark _FORTIFY_SOURCE helpers
120*8d741a5dSApple OSS Distributions 
121*8d741a5dSApple OSS Distributions /*
122*8d741a5dSApple OSS Distributions  * If _FORTIFY_SOURCE is undefined, it is assumed to be 1.
123*8d741a5dSApple OSS Distributions  *
124*8d741a5dSApple OSS Distributions  * _FORTIFY_SOURCE > 0 will enable checked memory/string functions.
125*8d741a5dSApple OSS Distributions  *
126*8d741a5dSApple OSS Distributions  * _FORTIFY_SOURCE_STRICT will enable stricter checking (optional)
127*8d741a5dSApple OSS Distributions  * for memcpy/memmove/bcopy and will check that copies do not go
128*8d741a5dSApple OSS Distributions  * past the end of a struct member.
129*8d741a5dSApple OSS Distributions  */
130*8d741a5dSApple OSS Distributions #if KASAN
131*8d741a5dSApple OSS Distributions #  define __XNU_FORTIFY_SOURCE          0 /* kasan is a superset */
132*8d741a5dSApple OSS Distributions #elif defined (_FORTIFY_SOURCE) && _FORTIFY_SOURCE == 0
133*8d741a5dSApple OSS Distributions #  define __XNU_FORTIFY_SOURCE          0 /* forcefully disabled */
134*8d741a5dSApple OSS Distributions #elif XNU_KERNEL_PRIVATE || defined(_FORTIFY_SOURCE_STRICT)
135*8d741a5dSApple OSS Distributions #  define __XNU_FORTIFY_SOURCE          2
136*8d741a5dSApple OSS Distributions #else
137*8d741a5dSApple OSS Distributions #  define __XNU_FORTIFY_SOURCE          1
138*8d741a5dSApple OSS Distributions #endif
139*8d741a5dSApple OSS Distributions 
140*8d741a5dSApple OSS Distributions /*
141*8d741a5dSApple OSS Distributions  * The overloadable attribute is load bearing in two major ways:
142*8d741a5dSApple OSS Distributions  * - __builtin_${function} from ${function} would be infinite recursion and UB,
143*8d741a5dSApple OSS Distributions  * - we need to still expose the regular prototype for people wanting to take
144*8d741a5dSApple OSS Distributions  *   its address.
145*8d741a5dSApple OSS Distributions  */
146*8d741a5dSApple OSS Distributions #define __xnu_string_inline \
147*8d741a5dSApple OSS Distributions 	static inline __attribute__((__always_inline__, __overloadable__))
148*8d741a5dSApple OSS Distributions 
149*8d741a5dSApple OSS Distributions /*
150*8d741a5dSApple OSS Distributions  * We want to allow certain functions like strlen() to constant fold
151*8d741a5dSApple OSS Distributions  * at compile time (such as strlen("foo")).
152*8d741a5dSApple OSS Distributions  *
153*8d741a5dSApple OSS Distributions  * In order to do so, we need an overload that has a similar looking
154*8d741a5dSApple OSS Distributions  * signature but is different from the regular function so that it can
155*8d741a5dSApple OSS Distributions  * call its matching builtin without causing UB due to inifinite recursion.
156*8d741a5dSApple OSS Distributions  * We abuse that the pass_object_size class of attributes gives us
157*8d741a5dSApple OSS Distributions  * precisely that semantics.
158*8d741a5dSApple OSS Distributions  */
159*8d741a5dSApple OSS Distributions #define __xnu_force_overload            __xnu_pass_object_size
160*8d741a5dSApple OSS Distributions 
161*8d741a5dSApple OSS Distributions /*
162*8d741a5dSApple OSS Distributions  * The object_size extension defines two kinds of size: the "struct size" and
163*8d741a5dSApple OSS Distributions  * the "member size". The "struct size" is the size of the buffer from the
164*8d741a5dSApple OSS Distributions  * starting address to the end of the largest enclosing object. The "member
165*8d741a5dSApple OSS Distributions  * size" is the size of the buffer from the starting address to the end of the
166*8d741a5dSApple OSS Distributions  * immediately enclosing array. For instance, given this:
167*8d741a5dSApple OSS Distributions  *
168*8d741a5dSApple OSS Distributions  *  struct foo {
169*8d741a5dSApple OSS Distributions  *      char a[20];
170*8d741a5dSApple OSS Distributions  *      char b[20];
171*8d741a5dSApple OSS Distributions  *  } my_foo;
172*8d741a5dSApple OSS Distributions  *
173*8d741a5dSApple OSS Distributions  * The "struct size" for &my_foo.a[10] is 30 (`sizeof(struct foo) -
174*8d741a5dSApple OSS Distributions  * offsetof(struct foo, a[10])`), and the "member size" for it is 10
175*8d741a5dSApple OSS Distributions  * (`sizeof(my_foo.a) - 10`).
176*8d741a5dSApple OSS Distributions  *
177*8d741a5dSApple OSS Distributions  * In general, you should use the member size for string operations (as it is
178*8d741a5dSApple OSS Distributions  * always a mistake to go out of bounds of a char buffer with a string
179*8d741a5dSApple OSS Distributions  * operation) and the struct size for bytewise operations (like bcopy, bzero,
180*8d741a5dSApple OSS Distributions  * memset, etc). The object_size extension is intended to provide _some_ bounds
181*8d741a5dSApple OSS Distributions  * safety at a low engineering cost, and various patterns intentionally
182*8d741a5dSApple OSS Distributions  * overflowing from individual fields with bytewise operations have
183*8d741a5dSApple OSS Distributions  * historically been tolerated both by engineers and the compiler (despite
184*8d741a5dSApple OSS Distributions  * probably being undefined).
185*8d741a5dSApple OSS Distributions  *
186*8d741a5dSApple OSS Distributions  * As an important side note, -fbounds-safety does not allow naïvely
187*8d741a5dSApple OSS Distributions  * overflowing from individual fields. -fbounds-safety bounds checks are always
188*8d741a5dSApple OSS Distributions  * equivalent to checks against the member size.
189*8d741a5dSApple OSS Distributions  */
190*8d741a5dSApple OSS Distributions 
191*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_dynamic_object_size)
192*8d741a5dSApple OSS Distributions #  define __xnu_pass_struct_size        __attribute__((__pass_dynamic_object_size__(0)))
193*8d741a5dSApple OSS Distributions #  define __xnu_pass_member_size        __attribute__((__pass_dynamic_object_size__(1)))
194*8d741a5dSApple OSS Distributions #  define __xnu_struct_size(ptr)        __builtin_dynamic_object_size(ptr, 0)
195*8d741a5dSApple OSS Distributions #  define __xnu_member_size(ptr)        __builtin_dynamic_object_size(ptr, 1)
196*8d741a5dSApple OSS Distributions #else
197*8d741a5dSApple OSS Distributions #  define __xnu_pass_struct_size        __attribute__((__pass_object_size__(0)))
198*8d741a5dSApple OSS Distributions #  define __xnu_pass_member_size        __attribute__((__pass_object_size__(1)))
199*8d741a5dSApple OSS Distributions #  define __xnu_struct_size(ptr)        __builtin_object_size(ptr, 0)
200*8d741a5dSApple OSS Distributions #  define __xnu_member_size(ptr)        __builtin_object_size(ptr, 1)
201*8d741a5dSApple OSS Distributions #endif
202*8d741a5dSApple OSS Distributions 
203*8d741a5dSApple OSS Distributions #if __XNU_FORTIFY_SOURCE == 0 || !__has_attribute(diagnose_if)
204*8d741a5dSApple OSS Distributions #  define __xnu_struct_size_precondition(ptr, size, message)
205*8d741a5dSApple OSS Distributions #  define __xnu_member_size_precondition(ptr, size, message)
206*8d741a5dSApple OSS Distributions #else
207*8d741a5dSApple OSS Distributions #  define __xnu_struct_size_precondition(ptr, size, message) \
208*8d741a5dSApple OSS Distributions 	__attribute__((__diagnose_if__(__xnu_struct_size(ptr) < (size), message, "error")))
209*8d741a5dSApple OSS Distributions #  define __xnu_member_size_precondition(ptr, size, message) \
210*8d741a5dSApple OSS Distributions 	__attribute__((__diagnose_if__(__xnu_member_size(ptr) < (size), message, "error")))
211*8d741a5dSApple OSS Distributions #endif
212*8d741a5dSApple OSS Distributions 
213*8d741a5dSApple OSS Distributions 
214*8d741a5dSApple OSS Distributions #if __XNU_FORTIFY_SOURCE > 1
215*8d741a5dSApple OSS Distributions #  define __xnu_object_size_precondition(...) \
216*8d741a5dSApple OSS Distributions 	__xnu_member_size_precondition(__VA_ARGS__)
217*8d741a5dSApple OSS Distributions #  define __xnu_object_size_check(...) \
218*8d741a5dSApple OSS Distributions 	__xnu_member_size_check(__VA_ARGS__)
219*8d741a5dSApple OSS Distributions #  define __xnu_pass_object_size        __xnu_pass_member_size
220*8d741a5dSApple OSS Distributions #else
221*8d741a5dSApple OSS Distributions #  define __xnu_object_size_precondition(...) \
222*8d741a5dSApple OSS Distributions 	__xnu_struct_size_precondition(__VA_ARGS__)
223*8d741a5dSApple OSS Distributions #  define __xnu_object_size_check(...) \
224*8d741a5dSApple OSS Distributions 	__xnu_struct_size_check(__VA_ARGS__)
225*8d741a5dSApple OSS Distributions #  define __xnu_pass_object_size        __xnu_pass_struct_size
226*8d741a5dSApple OSS Distributions #endif
227*8d741a5dSApple OSS Distributions 
228*8d741a5dSApple OSS Distributions #if __XNU_FORTIFY_SOURCE == 0 || __has_ptrcheck
229*8d741a5dSApple OSS Distributions #define __xnu_struct_size_check(ptr, size, how)   ((void)0)
230*8d741a5dSApple OSS Distributions #define __xnu_member_size_check(ptr, size, how)   ((void)0)
231*8d741a5dSApple OSS Distributions #else
232*8d741a5dSApple OSS Distributions __xnu_string_inline __cold __dead2 void
233*8d741a5dSApple OSS Distributions __xnu_fortify_trap_write(void)
234*8d741a5dSApple OSS Distributions {
235*8d741a5dSApple OSS Distributions 	ml_fatal_trap(0xbffe); /* XNU_HARD_TRAP_STRING_CHK */
236*8d741a5dSApple OSS Distributions }
237*8d741a5dSApple OSS Distributions 
238*8d741a5dSApple OSS Distributions __xnu_string_inline __cold void
239*8d741a5dSApple OSS Distributions __xnu_fortify_trap_read(void)
240*8d741a5dSApple OSS Distributions {
241*8d741a5dSApple OSS Distributions 	/* for now do not emit read traps yet */
242*8d741a5dSApple OSS Distributions #if 0
243*8d741a5dSApple OSS Distributions 	ml_recoverable_trap(0xfffe); /* XNU_SOFT_TRAP_STRING_CHK */
244*8d741a5dSApple OSS Distributions #endif
245*8d741a5dSApple OSS Distributions }
246*8d741a5dSApple OSS Distributions 
247*8d741a5dSApple OSS Distributions #define __xnu_struct_size_check(ptr, size, how)  ({ \
248*8d741a5dSApple OSS Distributions 	if (__xnu_struct_size(ptr) < (size)) {                                  \
249*8d741a5dSApple OSS Distributions 	        __xnu_fortify_trap_ ## how();                                   \
250*8d741a5dSApple OSS Distributions 	}                                                                       \
251*8d741a5dSApple OSS Distributions })
252*8d741a5dSApple OSS Distributions #define __xnu_member_size_check(ptr, size, how)  ({ \
253*8d741a5dSApple OSS Distributions 	if (__xnu_member_size(ptr) < (size)) {                                  \
254*8d741a5dSApple OSS Distributions 	        __xnu_fortify_trap_ ## how();                                   \
255*8d741a5dSApple OSS Distributions 	}                                                                       \
256*8d741a5dSApple OSS Distributions })
257*8d741a5dSApple OSS Distributions #endif
258*8d741a5dSApple OSS Distributions 
259*8d741a5dSApple OSS Distributions /*
260*8d741a5dSApple OSS Distributions  * Verifies at compile-time that an expression is an array (of any type).
261*8d741a5dSApple OSS Distributions  */
262*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_types_compatible_p)
263*8d741a5dSApple OSS Distributions #define __xnu_is_array(A) __builtin_types_compatible_p(typeof((A)[0])[], typeof(A))
264*8d741a5dSApple OSS Distributions #else
265*8d741a5dSApple OSS Distributions #define __xnu_is_array(A) 1
266*8d741a5dSApple OSS Distributions #endif
267*8d741a5dSApple OSS Distributions #define __xnu_assert_is_array(A, MSG) _Static_assert(__xnu_is_array(A), MSG)
268*8d741a5dSApple OSS Distributions 
269*8d741a5dSApple OSS Distributions #define __xnu_count_args1(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, N, ...) N
270*8d741a5dSApple OSS Distributions #define __xnu_count_args(...) \
271*8d741a5dSApple OSS Distributions 	__xnu_count_args1(, ##__VA_ARGS__, _9, _8, _7, _6, _5, _4, _3, _2, _1, _0)
272*8d741a5dSApple OSS Distributions 
273*8d741a5dSApple OSS Distributions #define __xnu_argc_overload1(base, N, ...) __CONCAT(base, N)(__VA_ARGS__)
274*8d741a5dSApple OSS Distributions #define __xnu_argc_overload(base, ...) \
275*8d741a5dSApple OSS Distributions 	__xnu_argc_overload1(base, __xnu_count_args(__VA_ARGS__), ##__VA_ARGS__)
276*8d741a5dSApple OSS Distributions 
277*8d741a5dSApple OSS Distributions #pragma mark memory functions
278*8d741a5dSApple OSS Distributions 
279*8d741a5dSApple OSS Distributions 
280*8d741a5dSApple OSS Distributions extern int bcmp(const void *s1 __sized_by(n), const void *s2 __sized_by(n), size_t n) __stateful_pure;
281*8d741a5dSApple OSS Distributions 
282*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
283*8d741a5dSApple OSS Distributions int
bcmp(const void * const s1 __xnu_pass_struct_size __sized_by (n),const void * const s2 __xnu_pass_struct_size __sized_by (n),size_t n)284*8d741a5dSApple OSS Distributions bcmp(
285*8d741a5dSApple OSS Distributions 	const void *const       s1 __xnu_pass_struct_size __sized_by(n),
286*8d741a5dSApple OSS Distributions 	const void *const       s2 __xnu_pass_struct_size __sized_by(n),
287*8d741a5dSApple OSS Distributions 	size_t                  n)
288*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(s1, n, "read overflow (first argument)")
289*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(s2, n, "read overflow (second argument)")
290*8d741a5dSApple OSS Distributions {
291*8d741a5dSApple OSS Distributions 	extern int __xnu_bcmp(
292*8d741a5dSApple OSS Distributions 		const void * __sized_by(n),
293*8d741a5dSApple OSS Distributions 		const void * __sized_by(n),
294*8d741a5dSApple OSS Distributions 		size_t n) __asm("_bcmp");
295*8d741a5dSApple OSS Distributions 
296*8d741a5dSApple OSS Distributions 	__xnu_struct_size_check(s1, n, read);
297*8d741a5dSApple OSS Distributions 	__xnu_struct_size_check(s2, n, read);
298*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_bcmp)
299*8d741a5dSApple OSS Distributions 	return __builtin_bcmp(s1, s2, n);
300*8d741a5dSApple OSS Distributions #else
301*8d741a5dSApple OSS Distributions 	return __xnu_bcmp(s1, s2, n);
302*8d741a5dSApple OSS Distributions #endif
303*8d741a5dSApple OSS Distributions }
304*8d741a5dSApple OSS Distributions 
305*8d741a5dSApple OSS Distributions 
306*8d741a5dSApple OSS Distributions extern int memcmp(const void *s1 __sized_by(n), const void *s2 __sized_by(n), size_t n) __stateful_pure;
307*8d741a5dSApple OSS Distributions 
308*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
309*8d741a5dSApple OSS Distributions int
memcmp(const void * const s1 __xnu_pass_struct_size __sized_by (n),const void * const s2 __xnu_pass_struct_size __sized_by (n),size_t n)310*8d741a5dSApple OSS Distributions memcmp(
311*8d741a5dSApple OSS Distributions 	const void *const       s1 __xnu_pass_struct_size __sized_by(n),
312*8d741a5dSApple OSS Distributions 	const void *const       s2 __xnu_pass_struct_size __sized_by(n),
313*8d741a5dSApple OSS Distributions 	size_t                  n)
314*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(s1, n, "read overflow (first argument)")
315*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(s2, n, "read overflow (second argument)")
316*8d741a5dSApple OSS Distributions {
317*8d741a5dSApple OSS Distributions 	extern int __xnu_memcmp(
318*8d741a5dSApple OSS Distributions 		const void *__sized_by(n),
319*8d741a5dSApple OSS Distributions 		const void *__sized_by(n),
320*8d741a5dSApple OSS Distributions 		size_t n) __asm("_memcmp");
321*8d741a5dSApple OSS Distributions 
322*8d741a5dSApple OSS Distributions 	__xnu_struct_size_check(s1, n, read);
323*8d741a5dSApple OSS Distributions 	__xnu_struct_size_check(s2, n, read);
324*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_memcmp)
325*8d741a5dSApple OSS Distributions 	return __builtin_memcmp(s1, s2, n);
326*8d741a5dSApple OSS Distributions #else
327*8d741a5dSApple OSS Distributions 	return __xnu_memcmp(s1, s2, n);
328*8d741a5dSApple OSS Distributions #endif
329*8d741a5dSApple OSS Distributions }
330*8d741a5dSApple OSS Distributions 
331*8d741a5dSApple OSS Distributions 
332*8d741a5dSApple OSS Distributions #ifdef XNU_KERNEL_PRIVATE
333*8d741a5dSApple OSS Distributions /*
334*8d741a5dSApple OSS Distributions  * memcmp_zero_ptr_aligned() checks string s of n bytes contains all zeros.
335*8d741a5dSApple OSS Distributions  * Address and size of the string s must be pointer-aligned.
336*8d741a5dSApple OSS Distributions  * Return 0 if true, 1 otherwise. Also return 0 if n is 0.
337*8d741a5dSApple OSS Distributions  */
338*8d741a5dSApple OSS Distributions extern unsigned long memcmp_zero_ptr_aligned(const void *s __sized_by(n), size_t n) __stateful_pure;
339*8d741a5dSApple OSS Distributions #endif
340*8d741a5dSApple OSS Distributions 
341*8d741a5dSApple OSS Distributions 
342*8d741a5dSApple OSS Distributions extern int timingsafe_bcmp(const void *b1 __sized_by(n), const void *b2 __sized_by(n), size_t n);
343*8d741a5dSApple OSS Distributions 
344*8d741a5dSApple OSS Distributions 
345*8d741a5dSApple OSS Distributions extern void bzero(void *s __sized_by(n), size_t n);
346*8d741a5dSApple OSS Distributions 
347*8d741a5dSApple OSS Distributions __xnu_string_inline
348*8d741a5dSApple OSS Distributions void
bzero(void * const s __xnu_pass_struct_size __sized_by (n),size_t n)349*8d741a5dSApple OSS Distributions bzero(
350*8d741a5dSApple OSS Distributions 	void *const             s __xnu_pass_struct_size __sized_by(n),
351*8d741a5dSApple OSS Distributions 	size_t                  n)
352*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(s, n, "write overflow")
353*8d741a5dSApple OSS Distributions {
354*8d741a5dSApple OSS Distributions 	extern void __xnu_bzero(
355*8d741a5dSApple OSS Distributions 		const void *__sized_by(n),
356*8d741a5dSApple OSS Distributions 		size_t n) __asm("_bzero");
357*8d741a5dSApple OSS Distributions 
358*8d741a5dSApple OSS Distributions 	__xnu_struct_size_check(s, n, write);
359*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_bzero)
360*8d741a5dSApple OSS Distributions 	__builtin_bzero(s, n);
361*8d741a5dSApple OSS Distributions #else
362*8d741a5dSApple OSS Distributions 	__xnu_bzero(s, n);
363*8d741a5dSApple OSS Distributions #endif
364*8d741a5dSApple OSS Distributions }
365*8d741a5dSApple OSS Distributions 
366*8d741a5dSApple OSS Distributions 
367*8d741a5dSApple OSS Distributions extern void *memset(void *s __sized_by(n), int c, size_t n);
368*8d741a5dSApple OSS Distributions 
369*8d741a5dSApple OSS Distributions __xnu_string_inline
370*8d741a5dSApple OSS Distributions void *
__sized_by(n)371*8d741a5dSApple OSS Distributions __sized_by(n)
372*8d741a5dSApple OSS Distributions memset(
373*8d741a5dSApple OSS Distributions 	void *const             s __xnu_pass_object_size __sized_by(n),
374*8d741a5dSApple OSS Distributions 	int                     c,
375*8d741a5dSApple OSS Distributions 	size_t                  n)
376*8d741a5dSApple OSS Distributions __xnu_object_size_precondition(s, n, "write overflow")
377*8d741a5dSApple OSS Distributions {
378*8d741a5dSApple OSS Distributions 	extern void __xnu_memset(
379*8d741a5dSApple OSS Distributions 		void *__sized_by(n),
380*8d741a5dSApple OSS Distributions 		int,
381*8d741a5dSApple OSS Distributions 		size_t n) __asm("_memset");
382*8d741a5dSApple OSS Distributions 
383*8d741a5dSApple OSS Distributions 	__xnu_object_size_check(s, n, write);
384*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_memset)
385*8d741a5dSApple OSS Distributions 	return __builtin_memset(s, c, n);
386*8d741a5dSApple OSS Distributions #else
387*8d741a5dSApple OSS Distributions 	return __xnu_memset(s, c, n);
388*8d741a5dSApple OSS Distributions #endif
389*8d741a5dSApple OSS Distributions }
390*8d741a5dSApple OSS Distributions 
391*8d741a5dSApple OSS Distributions 
392*8d741a5dSApple OSS Distributions extern int memset_s(void *s __sized_by(smax), size_t smax, int c, size_t n);
393*8d741a5dSApple OSS Distributions 
394*8d741a5dSApple OSS Distributions 
395*8d741a5dSApple OSS Distributions extern void *memmove(void *dst __sized_by(n), const void *src __sized_by(n), size_t n);
396*8d741a5dSApple OSS Distributions 
397*8d741a5dSApple OSS Distributions __xnu_string_inline
398*8d741a5dSApple OSS Distributions void *
__sized_by(n)399*8d741a5dSApple OSS Distributions __sized_by(n)
400*8d741a5dSApple OSS Distributions memmove(
401*8d741a5dSApple OSS Distributions 	void *const             dst __xnu_pass_object_size __sized_by(n),
402*8d741a5dSApple OSS Distributions 	const void *const       src __xnu_pass_object_size __sized_by(n),
403*8d741a5dSApple OSS Distributions 	size_t                  n)
404*8d741a5dSApple OSS Distributions __xnu_object_size_precondition(dst, n, "write overflow")
405*8d741a5dSApple OSS Distributions __xnu_object_size_precondition(src, n, "read overflow")
406*8d741a5dSApple OSS Distributions {
407*8d741a5dSApple OSS Distributions 	extern void *__xnu_memmove(
408*8d741a5dSApple OSS Distributions 		void *dst __sized_by(n),
409*8d741a5dSApple OSS Distributions 		const void *src __sized_by(n),
410*8d741a5dSApple OSS Distributions 		size_t n) __asm("_memmove");
411*8d741a5dSApple OSS Distributions 
412*8d741a5dSApple OSS Distributions 	__xnu_object_size_check(dst, n, write);
413*8d741a5dSApple OSS Distributions 	__xnu_object_size_check(src, n, read);
414*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_memmove)
415*8d741a5dSApple OSS Distributions 	return __builtin_memmove(dst, src, n);
416*8d741a5dSApple OSS Distributions #else
417*8d741a5dSApple OSS Distributions 	return __xnu_memmove(dst, src, n);
418*8d741a5dSApple OSS Distributions #endif
419*8d741a5dSApple OSS Distributions }
420*8d741a5dSApple OSS Distributions 
421*8d741a5dSApple OSS Distributions __xnu_string_inline
422*8d741a5dSApple OSS Distributions void *
__sized_by(n)423*8d741a5dSApple OSS Distributions __sized_by(n)
424*8d741a5dSApple OSS Distributions __nochk_memmove(
425*8d741a5dSApple OSS Distributions 	void *const             dst __xnu_pass_struct_size __sized_by(n),
426*8d741a5dSApple OSS Distributions 	const void *const       src __xnu_pass_struct_size __sized_by(n),
427*8d741a5dSApple OSS Distributions 	size_t                  n)
428*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(dst, n, "write overflow")
429*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(src, n, "read overflow")
430*8d741a5dSApple OSS Distributions {
431*8d741a5dSApple OSS Distributions 	extern void *__xnu_memmove(
432*8d741a5dSApple OSS Distributions 		void *dst __sized_by(n),
433*8d741a5dSApple OSS Distributions 		const void *src __sized_by(n),
434*8d741a5dSApple OSS Distributions 		size_t n) __asm("_memmove");
435*8d741a5dSApple OSS Distributions 
436*8d741a5dSApple OSS Distributions 	__xnu_struct_size_check(dst, n, write);
437*8d741a5dSApple OSS Distributions 	__xnu_struct_size_check(src, n, read);
438*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_memmove)
439*8d741a5dSApple OSS Distributions 	return __builtin_memmove(dst, src, n);
440*8d741a5dSApple OSS Distributions #else
441*8d741a5dSApple OSS Distributions 	return __xnu_memmove(dst, src, n);
442*8d741a5dSApple OSS Distributions #endif
443*8d741a5dSApple OSS Distributions }
444*8d741a5dSApple OSS Distributions 
445*8d741a5dSApple OSS Distributions 
446*8d741a5dSApple OSS Distributions extern void bcopy(const void *src __sized_by(n), void *dst __sized_by(n), size_t n);
447*8d741a5dSApple OSS Distributions 
448*8d741a5dSApple OSS Distributions __xnu_string_inline
449*8d741a5dSApple OSS Distributions void
bcopy(const void * const src __xnu_pass_object_size __sized_by (n),void * const dst __xnu_pass_object_size __sized_by (n),size_t n)450*8d741a5dSApple OSS Distributions bcopy(
451*8d741a5dSApple OSS Distributions 	const void *const       src __xnu_pass_object_size __sized_by(n),
452*8d741a5dSApple OSS Distributions 	void *const             dst __xnu_pass_object_size __sized_by(n),
453*8d741a5dSApple OSS Distributions 	size_t                  n)
454*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(dst, n, "write overflow")
455*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(src, n, "read overflow")
456*8d741a5dSApple OSS Distributions {
457*8d741a5dSApple OSS Distributions 	(void)memmove(dst, src, n);
458*8d741a5dSApple OSS Distributions }
459*8d741a5dSApple OSS Distributions 
460*8d741a5dSApple OSS Distributions __xnu_string_inline
461*8d741a5dSApple OSS Distributions void
__nochk_bcopy(const void * const src __xnu_pass_struct_size __sized_by (n),void * const dst __xnu_pass_struct_size __sized_by (n),size_t n)462*8d741a5dSApple OSS Distributions __nochk_bcopy(
463*8d741a5dSApple OSS Distributions 	const void *const       src __xnu_pass_struct_size __sized_by(n),
464*8d741a5dSApple OSS Distributions 	void *const             dst __xnu_pass_struct_size __sized_by(n),
465*8d741a5dSApple OSS Distributions 	size_t                  n)
466*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(dst, n, "write overflow")
467*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(src, n, "read overflow")
468*8d741a5dSApple OSS Distributions {
469*8d741a5dSApple OSS Distributions 	(void)__nochk_memmove(dst, src, n);
470*8d741a5dSApple OSS Distributions }
471*8d741a5dSApple OSS Distributions 
472*8d741a5dSApple OSS Distributions 
473*8d741a5dSApple OSS Distributions extern void *memcpy(void *dst __sized_by(n), const void *src __sized_by(n), size_t n);
474*8d741a5dSApple OSS Distributions 
475*8d741a5dSApple OSS Distributions __xnu_string_inline
476*8d741a5dSApple OSS Distributions void *
__sized_by(n)477*8d741a5dSApple OSS Distributions __sized_by(n)
478*8d741a5dSApple OSS Distributions memcpy(
479*8d741a5dSApple OSS Distributions 	void *const             dst __xnu_pass_object_size __sized_by(n),
480*8d741a5dSApple OSS Distributions 	const void *const       src __xnu_pass_object_size __sized_by(n),
481*8d741a5dSApple OSS Distributions 	size_t                  n)
482*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(dst, n, "write overflow")
483*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(src, n, "read overflow")
484*8d741a5dSApple OSS Distributions {
485*8d741a5dSApple OSS Distributions 	return memmove(dst, src, n);
486*8d741a5dSApple OSS Distributions }
487*8d741a5dSApple OSS Distributions 
488*8d741a5dSApple OSS Distributions __xnu_string_inline
489*8d741a5dSApple OSS Distributions void *
__sized_by(n)490*8d741a5dSApple OSS Distributions __sized_by(n)
491*8d741a5dSApple OSS Distributions __nochk_memcpy(
492*8d741a5dSApple OSS Distributions 	void *const             dst __xnu_pass_struct_size __sized_by(n),
493*8d741a5dSApple OSS Distributions 	const void *const       src __xnu_pass_struct_size __sized_by(n),
494*8d741a5dSApple OSS Distributions 	size_t                  n)
495*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(dst, n, "write overflow")
496*8d741a5dSApple OSS Distributions __xnu_struct_size_precondition(src, n, "read overflow")
497*8d741a5dSApple OSS Distributions {
498*8d741a5dSApple OSS Distributions 	return __nochk_memmove(dst, src, n);
499*8d741a5dSApple OSS Distributions }
500*8d741a5dSApple OSS Distributions 
501*8d741a5dSApple OSS Distributions 
502*8d741a5dSApple OSS Distributions #pragma mark string functions
503*8d741a5dSApple OSS Distributions 
504*8d741a5dSApple OSS Distributions extern size_t strlen(const char *__null_terminated s) __stateful_pure;
505*8d741a5dSApple OSS Distributions 
506*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_strlen)
507*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
508*8d741a5dSApple OSS Distributions size_t
strlen(const char * const s __xnu_force_overload)509*8d741a5dSApple OSS Distributions strlen(const char * /* __null_terminated */ const s __xnu_force_overload)
510*8d741a5dSApple OSS Distributions {
511*8d741a5dSApple OSS Distributions 	return __builtin_strlen(s);
512*8d741a5dSApple OSS Distributions }
513*8d741a5dSApple OSS Distributions #endif
514*8d741a5dSApple OSS Distributions 
515*8d741a5dSApple OSS Distributions 
516*8d741a5dSApple OSS Distributions extern size_t strnlen(const char *__counted_by(n)s, size_t n) __stateful_pure;
517*8d741a5dSApple OSS Distributions 
518*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_strnlen)
519*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
520*8d741a5dSApple OSS Distributions size_t
strnlen(const char * const __counted_by (n)s __xnu_force_overload,size_t n)521*8d741a5dSApple OSS Distributions strnlen(const char *const __counted_by(n) s __xnu_force_overload, size_t n)
522*8d741a5dSApple OSS Distributions {
523*8d741a5dSApple OSS Distributions 	return __builtin_strnlen(s, n);
524*8d741a5dSApple OSS Distributions }
525*8d741a5dSApple OSS Distributions #endif
526*8d741a5dSApple OSS Distributions 
527*8d741a5dSApple OSS Distributions 
528*8d741a5dSApple OSS Distributions /* strbuflen is the same as strnlen. */
529*8d741a5dSApple OSS Distributions #define strbuflen_1(BUF) ({ \
530*8d741a5dSApple OSS Distributions 	__xnu_assert_is_array(BUF, "argument is not an array"); \
531*8d741a5dSApple OSS Distributions 	strnlen((BUF), sizeof(BUF)); \
532*8d741a5dSApple OSS Distributions })
533*8d741a5dSApple OSS Distributions #define strbuflen_2(BUF, LEN) strnlen(BUF, LEN)
534*8d741a5dSApple OSS Distributions #define strbuflen(...) __xnu_argc_overload(strbuflen, __VA_ARGS__)
535*8d741a5dSApple OSS Distributions 
536*8d741a5dSApple OSS Distributions 
537*8d741a5dSApple OSS Distributions extern int strcmp(const char *__null_terminated s1, const char *__null_terminated s2) __stateful_pure;
538*8d741a5dSApple OSS Distributions 
539*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_strcmp)
540*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
541*8d741a5dSApple OSS Distributions int
strcmp(const char * const s1 __xnu_force_overload,const char * const __null_terminated s2)542*8d741a5dSApple OSS Distributions strcmp(
543*8d741a5dSApple OSS Distributions 	const char *const /* __null_terminated */ s1 __xnu_force_overload,
544*8d741a5dSApple OSS Distributions 	const char *const __null_terminated s2)
545*8d741a5dSApple OSS Distributions {
546*8d741a5dSApple OSS Distributions 	return __builtin_strcmp(s1, s2);
547*8d741a5dSApple OSS Distributions }
548*8d741a5dSApple OSS Distributions #else
549*8d741a5dSApple OSS Distributions #endif
550*8d741a5dSApple OSS Distributions 
551*8d741a5dSApple OSS Distributions 
552*8d741a5dSApple OSS Distributions __ptrcheck_unavailable_r("strlcmp or strbufcmp")
553*8d741a5dSApple OSS Distributions extern int strncmp(const char *__unsafe_indexable s1, const char *__unsafe_indexable s2, size_t n) __stateful_pure;
554*8d741a5dSApple OSS Distributions 
555*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_strncmp)
556*8d741a5dSApple OSS Distributions __ptrcheck_unavailable_r("strlcmp or strbufcmp")
557*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
558*8d741a5dSApple OSS Distributions int
strncmp(const char * const __unsafe_indexable s1 __xnu_force_overload,const char * const __unsafe_indexable s2,size_t n)559*8d741a5dSApple OSS Distributions strncmp(
560*8d741a5dSApple OSS Distributions 	const char *const __unsafe_indexable s1 __xnu_force_overload,
561*8d741a5dSApple OSS Distributions 	const char *const __unsafe_indexable s2, size_t n)
562*8d741a5dSApple OSS Distributions {
563*8d741a5dSApple OSS Distributions 	return __builtin_strncmp(s1, s2, n);
564*8d741a5dSApple OSS Distributions }
565*8d741a5dSApple OSS Distributions #endif
566*8d741a5dSApple OSS Distributions 
567*8d741a5dSApple OSS Distributions /*
568*8d741a5dSApple OSS Distributions  * Use strlcmp if you want to compare one string with a known length (with or
569*8d741a5dSApple OSS Distributions  * without a NUL terminator) and one string with an unknown length (that always
570*8d741a5dSApple OSS Distributions  * has a NUL terminator).
571*8d741a5dSApple OSS Distributions  * See docs/primitives/string-handling.md for more information.
572*8d741a5dSApple OSS Distributions  */
573*8d741a5dSApple OSS Distributions extern int strlcmp(const char *__counted_by(n)s1, const char *s2, size_t n) __stateful_pure;
574*8d741a5dSApple OSS Distributions 
575*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_strncmp)
576*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
577*8d741a5dSApple OSS Distributions int
strlcmp(const char * const __counted_by (s1len)s1 __xnu_force_overload,const char * const s2,size_t s1len)578*8d741a5dSApple OSS Distributions strlcmp(
579*8d741a5dSApple OSS Distributions 	const char *const __counted_by(s1len) s1 __xnu_force_overload,
580*8d741a5dSApple OSS Distributions 	const char *const s2, size_t s1len)
581*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(s1, s1len, "read overflow")
582*8d741a5dSApple OSS Distributions {
583*8d741a5dSApple OSS Distributions 	extern int __xnu_strlcmp(
584*8d741a5dSApple OSS Distributions 		const char * __counted_by(s1len) s1,
585*8d741a5dSApple OSS Distributions 		const char *__null_terminated s2,
586*8d741a5dSApple OSS Distributions 		size_t s1len) __asm("_strlcmp");
587*8d741a5dSApple OSS Distributions 
588*8d741a5dSApple OSS Distributions 	__xnu_member_size_check(s1, s1len, read);
589*8d741a5dSApple OSS Distributions 	return __xnu_strlcmp(s1, s2, s1len);
590*8d741a5dSApple OSS Distributions }
591*8d741a5dSApple OSS Distributions #endif
592*8d741a5dSApple OSS Distributions 
593*8d741a5dSApple OSS Distributions 
594*8d741a5dSApple OSS Distributions /*
595*8d741a5dSApple OSS Distributions  * Use strbufcmp if you want to compare two strings and you know both of their
596*8d741a5dSApple OSS Distributions  * lengths. See docs/primitives/string-handling.md for more information.
597*8d741a5dSApple OSS Distributions  */
598*8d741a5dSApple OSS Distributions extern int strbufcmp(const char *__counted_by(s1len)s1, size_t s1len, const char *__counted_by(s2len)s2, size_t s2len) __stateful_pure;
599*8d741a5dSApple OSS Distributions 
600*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
601*8d741a5dSApple OSS Distributions int
strbufcmp(const char * const __counted_by (s1len)s1 __xnu_pass_member_size,size_t s1len,const char * const __counted_by (s2len)s2 __xnu_pass_member_size,size_t s2len)602*8d741a5dSApple OSS Distributions strbufcmp(
603*8d741a5dSApple OSS Distributions 	const char *const __counted_by(s1len) s1 __xnu_pass_member_size, size_t s1len,
604*8d741a5dSApple OSS Distributions 	const char *const __counted_by(s2len) s2 __xnu_pass_member_size, size_t s2len)
605*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(s1, s1len, "read overflow")
606*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(s2, s2len, "read overflow")
607*8d741a5dSApple OSS Distributions {
608*8d741a5dSApple OSS Distributions 	extern int __xnu_strbufcmp(
609*8d741a5dSApple OSS Distributions 		const char * __counted_by(s1len) s1,
610*8d741a5dSApple OSS Distributions 		size_t s1len,
611*8d741a5dSApple OSS Distributions 		const char *__counted_by(s2len) s2,
612*8d741a5dSApple OSS Distributions 		size_t s2len) __asm("_strbufcmp");
613*8d741a5dSApple OSS Distributions 
614*8d741a5dSApple OSS Distributions 	__xnu_member_size_check(s1, s1len, read);
615*8d741a5dSApple OSS Distributions 	__xnu_member_size_check(s2, s2len, read);
616*8d741a5dSApple OSS Distributions 	return __xnu_strbufcmp(s1, s1len, s2, s2len);
617*8d741a5dSApple OSS Distributions }
618*8d741a5dSApple OSS Distributions 
619*8d741a5dSApple OSS Distributions #define strbufcmp_2(A, B) ({ \
620*8d741a5dSApple OSS Distributions 	__xnu_assert_is_array(A, "first argument is not an array"); \
621*8d741a5dSApple OSS Distributions 	__xnu_assert_is_array(B, "second argument is not an array"); \
622*8d741a5dSApple OSS Distributions 	(strbufcmp)((A), sizeof(A), (B), sizeof(B)); \
623*8d741a5dSApple OSS Distributions })
624*8d741a5dSApple OSS Distributions #define strbufcmp_4 (strbufcmp)
625*8d741a5dSApple OSS Distributions #define strbufcmp(...) __xnu_argc_overload(strbufcmp, __VA_ARGS__)
626*8d741a5dSApple OSS Distributions 
627*8d741a5dSApple OSS Distributions 
628*8d741a5dSApple OSS Distributions extern int strprefix(const char *__null_terminated s1, const char *__null_terminated s2) __stateful_pure;
629*8d741a5dSApple OSS Distributions 
630*8d741a5dSApple OSS Distributions 
631*8d741a5dSApple OSS Distributions extern int strcasecmp(const char *__null_terminated s1, const char *__null_terminated s2) __stateful_pure;
632*8d741a5dSApple OSS Distributions 
633*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_strcasecmp)
634*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
635*8d741a5dSApple OSS Distributions int
strcasecmp(const char * const s1 __xnu_force_overload,const char * const __null_terminated s2)636*8d741a5dSApple OSS Distributions strcasecmp(
637*8d741a5dSApple OSS Distributions 	const char *const /* __null_terminated */ s1 __xnu_force_overload,
638*8d741a5dSApple OSS Distributions 	const char *const __null_terminated s2)
639*8d741a5dSApple OSS Distributions {
640*8d741a5dSApple OSS Distributions 	return __builtin_strcasecmp(s1, s2);
641*8d741a5dSApple OSS Distributions }
642*8d741a5dSApple OSS Distributions #endif
643*8d741a5dSApple OSS Distributions 
644*8d741a5dSApple OSS Distributions 
645*8d741a5dSApple OSS Distributions __ptrcheck_unavailable_r("strlcasecmp or strbufcasecmp")
646*8d741a5dSApple OSS Distributions extern int strncasecmp(const char *__unsafe_indexable s1, const char *__unsafe_indexable s2, size_t n) __stateful_pure;
647*8d741a5dSApple OSS Distributions 
648*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_strncasecmp)
649*8d741a5dSApple OSS Distributions __ptrcheck_unavailable_r("strlcasecmp or strbufcasecmp")
650*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
651*8d741a5dSApple OSS Distributions int
strncasecmp(const char * const __unsafe_indexable s1 __xnu_force_overload,const char * const __unsafe_indexable s2,size_t n)652*8d741a5dSApple OSS Distributions strncasecmp(
653*8d741a5dSApple OSS Distributions 	const char *const __unsafe_indexable s1 __xnu_force_overload,
654*8d741a5dSApple OSS Distributions 	const char *const __unsafe_indexable s2, size_t n)
655*8d741a5dSApple OSS Distributions {
656*8d741a5dSApple OSS Distributions 	return __builtin_strncasecmp(s1, s2, n);
657*8d741a5dSApple OSS Distributions }
658*8d741a5dSApple OSS Distributions #endif
659*8d741a5dSApple OSS Distributions 
660*8d741a5dSApple OSS Distributions /*
661*8d741a5dSApple OSS Distributions  * Use strlcasecmp if you want to compare one string with a known length (with
662*8d741a5dSApple OSS Distributions  * or without a NUL terminator) and one string with an unknown length (that
663*8d741a5dSApple OSS Distributions  * always has a NUL terminator).
664*8d741a5dSApple OSS Distributions  * See docs/primitives/string-handling.md for more information.
665*8d741a5dSApple OSS Distributions  */
666*8d741a5dSApple OSS Distributions extern int strlcasecmp(const char *__counted_by(n)s1, const char *s2, size_t n) __stateful_pure;
667*8d741a5dSApple OSS Distributions 
668*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
669*8d741a5dSApple OSS Distributions int
strlcasecmp(const char * const __counted_by (s1len)s1 __xnu_force_overload,const char * __null_terminated const s2,size_t s1len)670*8d741a5dSApple OSS Distributions strlcasecmp(
671*8d741a5dSApple OSS Distributions 	const char *const __counted_by(s1len) s1 __xnu_force_overload,
672*8d741a5dSApple OSS Distributions 	const char *__null_terminated const s2, size_t s1len)
673*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(s1, s1len, "read overflow")
674*8d741a5dSApple OSS Distributions {
675*8d741a5dSApple OSS Distributions 	extern int __xnu_strlcasecmp(
676*8d741a5dSApple OSS Distributions 		const char * __counted_by(s1len) s1,
677*8d741a5dSApple OSS Distributions 		const char *__null_terminated s2,
678*8d741a5dSApple OSS Distributions 		size_t s1len) __asm("_strlcasecmp");
679*8d741a5dSApple OSS Distributions 
680*8d741a5dSApple OSS Distributions 	__xnu_member_size_check(s1, s1len, read);
681*8d741a5dSApple OSS Distributions 	return __xnu_strlcasecmp(s1, s2, s1len);
682*8d741a5dSApple OSS Distributions }
683*8d741a5dSApple OSS Distributions 
684*8d741a5dSApple OSS Distributions 
685*8d741a5dSApple OSS Distributions /*
686*8d741a5dSApple OSS Distributions  * Use strbufcmp if you want to compare two strings and you know both of their
687*8d741a5dSApple OSS Distributions  * lengths. See docs/primitives/string-handling.md for more information.
688*8d741a5dSApple OSS Distributions  */
689*8d741a5dSApple OSS Distributions extern int strbufcasecmp(const char *__counted_by(s1len)s1, size_t s1len, const char *__counted_by(s2len)s2, size_t s2len) __stateful_pure;
690*8d741a5dSApple OSS Distributions 
691*8d741a5dSApple OSS Distributions __xnu_string_inline __stateful_pure
692*8d741a5dSApple OSS Distributions int
strbufcasecmp(const char * const __counted_by (s1len)s1 __xnu_pass_member_size,size_t s1len,const char * const __counted_by (s2len)s2 __xnu_pass_member_size,size_t s2len)693*8d741a5dSApple OSS Distributions strbufcasecmp(
694*8d741a5dSApple OSS Distributions 	const char *const __counted_by(s1len) s1 __xnu_pass_member_size, size_t s1len,
695*8d741a5dSApple OSS Distributions 	const char *const __counted_by(s2len) s2 __xnu_pass_member_size, size_t s2len)
696*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(s1, s1len, "read overflow")
697*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(s2, s2len, "read overflow")
698*8d741a5dSApple OSS Distributions {
699*8d741a5dSApple OSS Distributions 	extern int __xnu_strbufcasecmp(
700*8d741a5dSApple OSS Distributions 		const char * __counted_by(s1len) s1,
701*8d741a5dSApple OSS Distributions 		size_t s1len,
702*8d741a5dSApple OSS Distributions 		const char *__counted_by(s2len) s2,
703*8d741a5dSApple OSS Distributions 		size_t s2len) __asm("_strbufcasecmp");
704*8d741a5dSApple OSS Distributions 
705*8d741a5dSApple OSS Distributions 	__xnu_member_size_check(s1, s1len, read);
706*8d741a5dSApple OSS Distributions 	__xnu_member_size_check(s2, s2len, read);
707*8d741a5dSApple OSS Distributions 	return __xnu_strbufcasecmp(s1, s1len, s2, s2len);
708*8d741a5dSApple OSS Distributions }
709*8d741a5dSApple OSS Distributions 
710*8d741a5dSApple OSS Distributions #define strbufcasecmp_2(A, B) ({ \
711*8d741a5dSApple OSS Distributions 	__xnu_assert_is_array(A, "first argument is not an array"); \
712*8d741a5dSApple OSS Distributions 	__xnu_assert_is_array(B, "second argument is not an array"); \
713*8d741a5dSApple OSS Distributions 	(strbufcasecmp)((A), sizeof(A), (B), sizeof(B)); \
714*8d741a5dSApple OSS Distributions })
715*8d741a5dSApple OSS Distributions #define strbufcasecmp_4 (strbufcasecmp)
716*8d741a5dSApple OSS Distributions #define strbufcasecmp(...) __xnu_argc_overload(strbufcasecmp, __VA_ARGS__)
717*8d741a5dSApple OSS Distributions 
718*8d741a5dSApple OSS Distributions 
719*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_strchr)
720*8d741a5dSApple OSS Distributions __xnu_string_inline
721*8d741a5dSApple OSS Distributions char *__null_terminated
strchr(const char * const s __xnu_force_overload,int c)722*8d741a5dSApple OSS Distributions strchr(const char *const /* __null_terminated */ s __xnu_force_overload, int c)
723*8d741a5dSApple OSS Distributions {
724*8d741a5dSApple OSS Distributions 	return __unsafe_forge_null_terminated(char *, __builtin_strchr(s, c));
725*8d741a5dSApple OSS Distributions }
726*8d741a5dSApple OSS Distributions #endif
727*8d741a5dSApple OSS Distributions 
728*8d741a5dSApple OSS Distributions 
729*8d741a5dSApple OSS Distributions #if XNU_KERNEL_PRIVATE /* rdar://103276672 */
730*8d741a5dSApple OSS Distributions extern char *__null_terminated strrchr(const char *__null_terminated s, int c) __stateful_pure;
731*8d741a5dSApple OSS Distributions 
732*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_strrchr) && !__has_ptrcheck /* rdar://103265304 */
733*8d741a5dSApple OSS Distributions __xnu_string_inline
734*8d741a5dSApple OSS Distributions char *__null_terminated
strrchr(const char * const __null_terminated s __xnu_force_overload,int c)735*8d741a5dSApple OSS Distributions strrchr(const char *const __null_terminated s __xnu_force_overload, int c)
736*8d741a5dSApple OSS Distributions {
737*8d741a5dSApple OSS Distributions 	return __builtin_strrchr(s, c);
738*8d741a5dSApple OSS Distributions }
739*8d741a5dSApple OSS Distributions #endif
740*8d741a5dSApple OSS Distributions #endif
741*8d741a5dSApple OSS Distributions 
742*8d741a5dSApple OSS Distributions 
743*8d741a5dSApple OSS Distributions extern char *__null_terminated strnstr(const char *__null_terminated s, const char *__null_terminated find, size_t slen) __stateful_pure;
744*8d741a5dSApple OSS Distributions 
745*8d741a5dSApple OSS Distributions 
746*8d741a5dSApple OSS Distributions extern size_t strlcpy(char *__counted_by(n) dst, const char *__null_terminated src, size_t n);
747*8d741a5dSApple OSS Distributions 
748*8d741a5dSApple OSS Distributions __xnu_string_inline
749*8d741a5dSApple OSS Distributions size_t
strlcpy(char * const dst __xnu_pass_member_size __counted_by (n),const char * const src __null_terminated,size_t n)750*8d741a5dSApple OSS Distributions strlcpy(
751*8d741a5dSApple OSS Distributions 	char *const             dst __xnu_pass_member_size __counted_by(n),
752*8d741a5dSApple OSS Distributions 	const char *const       src __null_terminated,
753*8d741a5dSApple OSS Distributions 	size_t                  n)
754*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(dst, n, "write overflow")
755*8d741a5dSApple OSS Distributions {
756*8d741a5dSApple OSS Distributions 	extern size_t __xnu_strlcpy(
757*8d741a5dSApple OSS Distributions 		char * __counted_by(n),
758*8d741a5dSApple OSS Distributions 		const char *__null_terminated,
759*8d741a5dSApple OSS Distributions 		size_t n) __asm("_strlcpy");
760*8d741a5dSApple OSS Distributions 
761*8d741a5dSApple OSS Distributions 	__xnu_member_size_check(dst, n, write);
762*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_strlcpy)
763*8d741a5dSApple OSS Distributions 	return __builtin_strlcpy(dst, src, n);
764*8d741a5dSApple OSS Distributions #else
765*8d741a5dSApple OSS Distributions 	return __xnu_strlcpy(dst, src, n);
766*8d741a5dSApple OSS Distributions #endif
767*8d741a5dSApple OSS Distributions }
768*8d741a5dSApple OSS Distributions 
769*8d741a5dSApple OSS Distributions 
770*8d741a5dSApple OSS Distributions /*
771*8d741a5dSApple OSS Distributions  * strbufcpy returns its destination as a NUL-terminated string, which makes a
772*8d741a5dSApple OSS Distributions  * difference when -fbounds-safety is enabled.
773*8d741a5dSApple OSS Distributions  * See docs/primitives/string-handling.md for more information.
774*8d741a5dSApple OSS Distributions  */
775*8d741a5dSApple OSS Distributions extern const char *__null_terminated
776*8d741a5dSApple OSS Distributions     strbufcpy(
777*8d741a5dSApple OSS Distributions 	char *__counted_by(dstsz) dst,
778*8d741a5dSApple OSS Distributions 	size_t dstsz,
779*8d741a5dSApple OSS Distributions 	const char *__counted_by(srcsz) src,
780*8d741a5dSApple OSS Distributions 	size_t srcsz);
781*8d741a5dSApple OSS Distributions 
782*8d741a5dSApple OSS Distributions __xnu_string_inline
783*8d741a5dSApple OSS Distributions const char *
strbufcpy(char * const dst __xnu_pass_member_size __counted_by (dstsz),size_t dstsz,const char * const src __xnu_pass_member_size __counted_by (srcsz),size_t srcsz)784*8d741a5dSApple OSS Distributions strbufcpy(
785*8d741a5dSApple OSS Distributions 	char *const             dst __xnu_pass_member_size __counted_by(dstsz),
786*8d741a5dSApple OSS Distributions 	size_t                  dstsz,
787*8d741a5dSApple OSS Distributions 	const char *const       src __xnu_pass_member_size __counted_by(srcsz),
788*8d741a5dSApple OSS Distributions 	size_t                  srcsz)
789*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(dst, dstsz, "write overflow")
790*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(src, srcsz, "read overflow")
791*8d741a5dSApple OSS Distributions {
792*8d741a5dSApple OSS Distributions 	extern const char *__xnu_strbufcpy(
793*8d741a5dSApple OSS Distributions 		char *__counted_by(dstsz) dst,
794*8d741a5dSApple OSS Distributions 		size_t dstsz,
795*8d741a5dSApple OSS Distributions 		const char *__counted_by(srcsz) src,
796*8d741a5dSApple OSS Distributions 		size_t srcsz) __asm("_strbufcpy");
797*8d741a5dSApple OSS Distributions 
798*8d741a5dSApple OSS Distributions 	__xnu_member_size_check(dst, dstsz, write);
799*8d741a5dSApple OSS Distributions 	__xnu_member_size_check(src, srcsz, read);
800*8d741a5dSApple OSS Distributions 	return __xnu_strbufcpy(dst, dstsz, src, srcsz);
801*8d741a5dSApple OSS Distributions }
802*8d741a5dSApple OSS Distributions 
803*8d741a5dSApple OSS Distributions #define strbufcpy_2(DST, SRC) ({ \
804*8d741a5dSApple OSS Distributions 	__xnu_assert_is_array(DST, "dst is not an array"); \
805*8d741a5dSApple OSS Distributions 	__xnu_assert_is_array(SRC, "src is not an array"); \
806*8d741a5dSApple OSS Distributions 	(strbufcpy)((DST), sizeof(DST), (SRC), sizeof(SRC)); \
807*8d741a5dSApple OSS Distributions })
808*8d741a5dSApple OSS Distributions #define strbufcpy_4     (strbufcpy)
809*8d741a5dSApple OSS Distributions #define strbufcpy(...)  __xnu_argc_overload(strbufcpy, __VA_ARGS__)
810*8d741a5dSApple OSS Distributions 
811*8d741a5dSApple OSS Distributions extern size_t strlcat(char *__counted_by(n) dst, const char *__null_terminated src, size_t n);
812*8d741a5dSApple OSS Distributions 
813*8d741a5dSApple OSS Distributions __xnu_string_inline
814*8d741a5dSApple OSS Distributions size_t
strlcat(char * const dst __xnu_pass_member_size __counted_by (n),const char * const src __null_terminated,size_t n)815*8d741a5dSApple OSS Distributions strlcat(
816*8d741a5dSApple OSS Distributions 	char *const             dst __xnu_pass_member_size __counted_by(n),
817*8d741a5dSApple OSS Distributions 	const char *const       src __null_terminated,
818*8d741a5dSApple OSS Distributions 	size_t                  n)
819*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(dst, n, "write overflow")
820*8d741a5dSApple OSS Distributions {
821*8d741a5dSApple OSS Distributions 	extern size_t __xnu_strlcat(
822*8d741a5dSApple OSS Distributions 		char * __sized_by(n),
823*8d741a5dSApple OSS Distributions 		const char *__null_terminated,
824*8d741a5dSApple OSS Distributions 		size_t n) __asm("_strlcat");
825*8d741a5dSApple OSS Distributions 
826*8d741a5dSApple OSS Distributions 	__xnu_member_size_check(dst, n, write);
827*8d741a5dSApple OSS Distributions #if __has_builtin(__builtin_strlcat)
828*8d741a5dSApple OSS Distributions 	return __builtin_strlcat(dst, src, n);
829*8d741a5dSApple OSS Distributions #else
830*8d741a5dSApple OSS Distributions 	return __xnu_strlcat(dst, src, n);
831*8d741a5dSApple OSS Distributions #endif
832*8d741a5dSApple OSS Distributions }
833*8d741a5dSApple OSS Distributions 
834*8d741a5dSApple OSS Distributions 
835*8d741a5dSApple OSS Distributions /*
836*8d741a5dSApple OSS Distributions  * strbufcat returns its destination as a NUL-terminated string, which makes a
837*8d741a5dSApple OSS Distributions  * difference when -fbounds-safety is enabled.
838*8d741a5dSApple OSS Distributions  * See docs/primitives/string-handling.md for more information.
839*8d741a5dSApple OSS Distributions  */
840*8d741a5dSApple OSS Distributions extern const char *__null_terminated
841*8d741a5dSApple OSS Distributions     strbufcat(
842*8d741a5dSApple OSS Distributions 	char *__counted_by(dstsz) dst,
843*8d741a5dSApple OSS Distributions 	size_t dstsz,
844*8d741a5dSApple OSS Distributions 	const char *__counted_by(srcsz) src,
845*8d741a5dSApple OSS Distributions 	size_t srcsz);
846*8d741a5dSApple OSS Distributions 
847*8d741a5dSApple OSS Distributions __xnu_string_inline
848*8d741a5dSApple OSS Distributions const char *
strbufcat(char * const dst __xnu_pass_member_size __counted_by (dstsz),size_t dstsz,const char * const src __xnu_pass_member_size __counted_by (srcsz),size_t srcsz)849*8d741a5dSApple OSS Distributions strbufcat(
850*8d741a5dSApple OSS Distributions 	char *const             dst __xnu_pass_member_size __counted_by(dstsz),
851*8d741a5dSApple OSS Distributions 	size_t                  dstsz,
852*8d741a5dSApple OSS Distributions 	const char *const       src __xnu_pass_member_size __counted_by(srcsz),
853*8d741a5dSApple OSS Distributions 	size_t                  srcsz)
854*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(dst, dstsz, "write overflow")
855*8d741a5dSApple OSS Distributions __xnu_member_size_precondition(src, srcsz, "read overflow")
856*8d741a5dSApple OSS Distributions {
857*8d741a5dSApple OSS Distributions 	extern const char *__xnu_strbufcat(
858*8d741a5dSApple OSS Distributions 		char *__counted_by(dstsz) dst,
859*8d741a5dSApple OSS Distributions 		size_t dstsz,
860*8d741a5dSApple OSS Distributions 		const char *__counted_by(srcsz) src,
861*8d741a5dSApple OSS Distributions 		size_t srcsz) __asm("_strbufcat");
862*8d741a5dSApple OSS Distributions 
863*8d741a5dSApple OSS Distributions 	__xnu_member_size_check(dst, dstsz, write);
864*8d741a5dSApple OSS Distributions 	__xnu_member_size_check(src, srcsz, read);
865*8d741a5dSApple OSS Distributions 	return __xnu_strbufcat(dst, dstsz, src, srcsz);
866*8d741a5dSApple OSS Distributions }
867*8d741a5dSApple OSS Distributions 
868*8d741a5dSApple OSS Distributions #define strbufcat_2(DST, SRC) ({ \
869*8d741a5dSApple OSS Distributions 	__xnu_assert_is_array(DST, "dst is not an array"); \
870*8d741a5dSApple OSS Distributions 	__xnu_assert_is_array(SRC, "src is not an array"); \
871*8d741a5dSApple OSS Distributions 	(strbufcat)((DST), sizeof(DST), (SRC), sizeof(SRC)); \
872*8d741a5dSApple OSS Distributions })
873*8d741a5dSApple OSS Distributions #define strbufcat_4     (strbufcat)
874*8d741a5dSApple OSS Distributions #define strbufcat(...) __xnu_argc_overload(strbufcat, __VA_ARGS__)
875*8d741a5dSApple OSS Distributions 
876*8d741a5dSApple OSS Distributions #pragma mark deprecated functions
877*8d741a5dSApple OSS Distributions #if !__has_ptrcheck && !__has_include(<__xnu_libcxx_sentinel.h>)
878*8d741a5dSApple OSS Distributions 
879*8d741a5dSApple OSS Distributions /*
880*8d741a5dSApple OSS Distributions  * char *strncat(char *dst, const char *src, size_t n);
881*8d741a5dSApple OSS Distributions  * char *strncpy(char *dst, const char *src, size_t n);
882*8d741a5dSApple OSS Distributions  *
883*8d741a5dSApple OSS Distributions  * char *strcat(char *dst, const char *src);
884*8d741a5dSApple OSS Distributions  * char *strcpy(char *, const char *);
885*8d741a5dSApple OSS Distributions  *
886*8d741a5dSApple OSS Distributions  * char *STRDUP(const char *, int);
887*8d741a5dSApple OSS Distributions  */
888*8d741a5dSApple OSS Distributions 
889*8d741a5dSApple OSS Distributions __deprecated_msg("use strlcat")
890*8d741a5dSApple OSS Distributions __kpi_deprecated_arm64_macos_unavailable
891*8d741a5dSApple OSS Distributions extern char *strncat(char *dst, const char *src, size_t n);
892*8d741a5dSApple OSS Distributions #if __XNU_FORTIFY_SOURCE && __has_builtin(__builtin___strncat_chk)
893*8d741a5dSApple OSS Distributions #define strncat(dst, src, n)            __builtin___strncat_chk(dst, src, n, __xnu_member_size(dst))
894*8d741a5dSApple OSS Distributions #endif
895*8d741a5dSApple OSS Distributions 
896*8d741a5dSApple OSS Distributions 
897*8d741a5dSApple OSS Distributions __deprecated_msg("use strlcpy")
898*8d741a5dSApple OSS Distributions __kpi_deprecated_arm64_macos_unavailable
899*8d741a5dSApple OSS Distributions extern char *strncpy(char *dst, const char *src, size_t n);
900*8d741a5dSApple OSS Distributions #if __XNU_FORTIFY_SOURCE && __has_builtin(__builtin___strncpy_chk)
901*8d741a5dSApple OSS Distributions #define strncpy(dst, src, n)            __builtin___strncpy_chk(dst, src, n, __xnu_member_size(dst))
902*8d741a5dSApple OSS Distributions #endif
903*8d741a5dSApple OSS Distributions 
904*8d741a5dSApple OSS Distributions __deprecated_msg("use strlcpy")
905*8d741a5dSApple OSS Distributions __kpi_deprecated_arm64_macos_unavailable
906*8d741a5dSApple OSS Distributions extern char *strcpy(char *, const char *);
907*8d741a5dSApple OSS Distributions #if __XNU_FORTIFY_SOURCE && __has_builtin(__builtin___strcpy_chk)
908*8d741a5dSApple OSS Distributions /* rdar://103287225 */
909*8d741a5dSApple OSS Distributions #define strcpy(dst, src, len)           __builtin___strcpy_chk(dst, src, __xnu_member_size(dst))
910*8d741a5dSApple OSS Distributions #endif
911*8d741a5dSApple OSS Distributions 
912*8d741a5dSApple OSS Distributions __deprecated_msg("use strlcat")
913*8d741a5dSApple OSS Distributions __kpi_deprecated_arm64_macos_unavailable
914*8d741a5dSApple OSS Distributions extern char *strcat(char *dst, const char *src);
915*8d741a5dSApple OSS Distributions #if __XNU_FORTIFY_SOURCE && __has_builtin(__builtin___strcat_chk)
916*8d741a5dSApple OSS Distributions #define strcat(dst, src)                __builtin___strcat_chk(dst, src, __xnu_member_size(dst))
917*8d741a5dSApple OSS Distributions #endif
918*8d741a5dSApple OSS Distributions 
919*8d741a5dSApple OSS Distributions #if XNU_PLATFORM_MacOSX
920*8d741a5dSApple OSS Distributions #ifndef KERNEL_PRIVATE
921*8d741a5dSApple OSS Distributions extern char *STRDUP(const char *, int);
922*8d741a5dSApple OSS Distributions #endif
923*8d741a5dSApple OSS Distributions #endif /* XNU_PLATFORM_MacOSX */
924*8d741a5dSApple OSS Distributions 
925*8d741a5dSApple OSS Distributions #endif /* !__has_ptrcheck && !__has_include(<__xnu_libcxx_sentinel.h>) */
926*8d741a5dSApple OSS Distributions 
927*8d741a5dSApple OSS Distributions #if __has_include(<san/memintrinsics.h>)
928*8d741a5dSApple OSS Distributions #include <san/memintrinsics.h>
929*8d741a5dSApple OSS Distributions #endif
930*8d741a5dSApple OSS Distributions 
931*8d741a5dSApple OSS Distributions __END_DECLS
932*8d741a5dSApple OSS Distributions 
933*8d741a5dSApple OSS Distributions #endif  /* _STRING_H_ */
934*8d741a5dSApple OSS Distributions 
935*8d741a5dSApple OSS Distributions #endif
936