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