• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) Huawei Technologies Co., Ltd. 2014-2018. All rights reserved.
3  * Description: Define internal used macro and data type. The marco of SECUREC_ON_64BITS
4  *              will be determined in this header file, which is a switch for part
5  *              of code. Some macro are used to supress warning by MS compiler.
6  * Author: lishunda
7  * Create: 2014-02-25
8  * Notes: User can change the value of SECUREC_STRING_MAX_LEN and SECUREC_MEM_MAX_LEN
9  *        macro to meet their special need, but The maximum value should not exceed 2G.
10  * History: 2018-09-27 zhaozhijian Code base quality improvement
11  */
12 /*
13  * [Standardize-exceptions]: Performance-sensitive
14  * [reason]: Strict parameter verification has been done before use
15  */
16 
17 #ifndef __SECURECTYPE_H__A7BBB686_AADA_451B_B9F9_44DACDAE18A7
18 #define __SECURECTYPE_H__A7BBB686_AADA_451B_B9F9_44DACDAE18A7
19 
20 #ifndef SECUREC_USING_STD_SECURE_LIB
21 #if defined(_MSC_VER) && _MSC_VER >= 1400
22 #if defined(__STDC_WANT_SECURE_LIB__) && __STDC_WANT_SECURE_LIB__ == 0
23 /* Security functions have been provided since vs2005, default use of system library functions */
24 #define SECUREC_USING_STD_SECURE_LIB    0
25 #else
26 #define SECUREC_USING_STD_SECURE_LIB    1
27 #endif
28 #else
29 #define SECUREC_USING_STD_SECURE_LIB    0
30 #endif
31 #endif
32 
33 
34 /* Compatibility with older Secure C versions, shielding VC symbol redefinition warning */
35 #if defined(_MSC_VER) && _MSC_VER >= 1400 && SECUREC_USING_STD_SECURE_LIB == 0
36 #ifndef SECUREC_DISABLE_CRT_FUNC
37 #define SECUREC_DISABLE_CRT_FUNC        1
38 #endif
39 #ifndef SECUREC_DISABLE_CRT_IMP
40 #define SECUREC_DISABLE_CRT_IMP         1
41 #endif
42 #else /*  MSC VER */
43 #ifndef SECUREC_DISABLE_CRT_FUNC
44 #define SECUREC_DISABLE_CRT_FUNC        0
45 #endif
46 #ifndef SECUREC_DISABLE_CRT_IMP
47 #define SECUREC_DISABLE_CRT_IMP         0
48 #endif
49 #endif
50 
51 #if SECUREC_DISABLE_CRT_FUNC
52 #ifdef __STDC_WANT_SECURE_LIB__
53 #undef __STDC_WANT_SECURE_LIB__
54 #endif
55 #define __STDC_WANT_SECURE_LIB__        0
56 #endif
57 
58 #if SECUREC_DISABLE_CRT_IMP
59 #ifdef _CRTIMP_ALTERNATIVE
60 #undef _CRTIMP_ALTERNATIVE
61 #endif
62 #define _CRTIMP_ALTERNATIVE     /* Comment microsoft *_s function */
63 #endif
64 
65 /* Compile in kernel under macro control */
66 #ifndef SECUREC_IN_KERNEL
67 #ifdef __KERNEL__
68 #define SECUREC_IN_KERNEL               1
69 #else
70 #define SECUREC_IN_KERNEL               0
71 #endif
72 #endif
73 
74 #if SECUREC_IN_KERNEL
75 #ifndef SECUREC_ENABLE_SCANF_FILE
76 #define SECUREC_ENABLE_SCANF_FILE       0
77 #endif
78 #ifndef SECUREC_ENABLE_WCHAR_FUNC
79 #define SECUREC_ENABLE_WCHAR_FUNC       0
80 #endif
81 #else /* SECUREC_IN_KERNEL */
82 #ifndef SECUREC_ENABLE_SCANF_FILE
83 #define SECUREC_ENABLE_SCANF_FILE       1
84 #endif
85 #ifndef SECUREC_ENABLE_WCHAR_FUNC
86 #define SECUREC_ENABLE_WCHAR_FUNC       1
87 #endif
88 #endif
89 
90 
91 /* Default secure function declaration, default declarations for non-standard functions */
92 #ifndef SECUREC_SNPRINTF_TRUNCATED
93 #define SECUREC_SNPRINTF_TRUNCATED      1
94 #endif
95 
96 #if SECUREC_USING_STD_SECURE_LIB
97 #if defined(_MSC_VER) && _MSC_VER >= 1400
98 /* Declare secure functions that are not available in the VS compiler */
99 #ifndef SECUREC_ENABLE_MEMSET
100 #define SECUREC_ENABLE_MEMSET           1
101 #endif
102 /* VS 2005 have vsnprintf_s function */
103 #ifndef SECUREC_ENABLE_VSNPRINTF
104 #define SECUREC_ENABLE_VSNPRINTF        0
105 #endif
106 #ifndef SECUREC_ENABLE_SNPRINTF
107 /* VS 2005 have vsnprintf_s function Adapt the snprintf_s of the security function */
108 #define snprintf_s _snprintf_s
109 #define SECUREC_ENABLE_SNPRINTF         0
110 #endif
111 /* Before VS 2010 do not have v functions */
112 #if _MSC_VER <= 1600 || defined(SECUREC_FOR_V_SCANFS)
113 #ifndef SECUREC_ENABLE_VFSCANF
114 #define SECUREC_ENABLE_VFSCANF          1
115 #endif
116 #ifndef SECUREC_ENABLE_VSCANF
117 #define SECUREC_ENABLE_VSCANF           1
118 #endif
119 #ifndef SECUREC_ENABLE_VSSCANF
120 #define SECUREC_ENABLE_VSSCANF          1
121 #endif
122 #endif
123 
124 #else /* MSC VER */
125 #ifndef SECUREC_ENABLE_MEMSET
126 #define SECUREC_ENABLE_MEMSET           0
127 #endif
128 #ifndef SECUREC_ENABLE_SNPRINTF
129 #define SECUREC_ENABLE_SNPRINTF         0
130 #endif
131 #ifndef SECUREC_ENABLE_VSNPRINTF
132 #define SECUREC_ENABLE_VSNPRINTF        0
133 #endif
134 #endif
135 
136 #ifndef SECUREC_ENABLE_MEMMOVE
137 #define SECUREC_ENABLE_MEMMOVE          0
138 #endif
139 #ifndef SECUREC_ENABLE_MEMCPY
140 #define SECUREC_ENABLE_MEMCPY           0
141 #endif
142 #ifndef SECUREC_ENABLE_STRCPY
143 #define SECUREC_ENABLE_STRCPY           0
144 #endif
145 #ifndef SECUREC_ENABLE_STRNCPY
146 #define SECUREC_ENABLE_STRNCPY          0
147 #endif
148 #ifndef SECUREC_ENABLE_STRCAT
149 #define SECUREC_ENABLE_STRCAT           0
150 #endif
151 #ifndef SECUREC_ENABLE_STRNCAT
152 #define SECUREC_ENABLE_STRNCAT          0
153 #endif
154 #ifndef SECUREC_ENABLE_SPRINTF
155 #define SECUREC_ENABLE_SPRINTF          0
156 #endif
157 #ifndef SECUREC_ENABLE_VSPRINTF
158 #define SECUREC_ENABLE_VSPRINTF          0
159 #endif
160 #ifndef SECUREC_ENABLE_SSCANF
161 #define SECUREC_ENABLE_SSCANF           0
162 #endif
163 #ifndef SECUREC_ENABLE_VSSCANF
164 #define SECUREC_ENABLE_VSSCANF          0
165 #endif
166 #ifndef SECUREC_ENABLE_SCANF
167 #define SECUREC_ENABLE_SCANF            0
168 #endif
169 #ifndef SECUREC_ENABLE_VSCANF
170 #define SECUREC_ENABLE_VSCANF           0
171 #endif
172 
173 #ifndef SECUREC_ENABLE_FSCANF
174 #define SECUREC_ENABLE_FSCANF           0
175 #endif
176 #ifndef SECUREC_ENABLE_VFSCANF
177 #define SECUREC_ENABLE_VFSCANF          0
178 #endif
179 #ifndef SECUREC_ENABLE_STRTOK
180 #define SECUREC_ENABLE_STRTOK           0
181 #endif
182 #ifndef SECUREC_ENABLE_GETS
183 #define SECUREC_ENABLE_GETS             0
184 #endif
185 
186 #else /* SECUREC USE STD SECURE LIB */
187 
188 #ifndef SECUREC_ENABLE_MEMSET
189 #define SECUREC_ENABLE_MEMSET           1
190 #endif
191 #ifndef SECUREC_ENABLE_MEMMOVE
192 #define SECUREC_ENABLE_MEMMOVE          1
193 #endif
194 #ifndef SECUREC_ENABLE_MEMCPY
195 #define SECUREC_ENABLE_MEMCPY           1
196 #endif
197 #ifndef SECUREC_ENABLE_STRCPY
198 #define SECUREC_ENABLE_STRCPY           1
199 #endif
200 #ifndef SECUREC_ENABLE_STRNCPY
201 #define SECUREC_ENABLE_STRNCPY          1
202 #endif
203 #ifndef SECUREC_ENABLE_STRCAT
204 #define SECUREC_ENABLE_STRCAT           1
205 #endif
206 #ifndef SECUREC_ENABLE_STRNCAT
207 #define SECUREC_ENABLE_STRNCAT          1
208 #endif
209 #ifndef SECUREC_ENABLE_SPRINTF
210 #define SECUREC_ENABLE_SPRINTF          1
211 #endif
212 #ifndef SECUREC_ENABLE_VSPRINTF
213 #define SECUREC_ENABLE_VSPRINTF          1
214 #endif
215 #ifndef SECUREC_ENABLE_SNPRINTF
216 #define SECUREC_ENABLE_SNPRINTF         1
217 #endif
218 #ifndef SECUREC_ENABLE_VSNPRINTF
219 #define SECUREC_ENABLE_VSNPRINTF        1
220 #endif
221 #ifndef SECUREC_ENABLE_SSCANF
222 #define SECUREC_ENABLE_SSCANF           1
223 #endif
224 #ifndef SECUREC_ENABLE_VSSCANF
225 #define SECUREC_ENABLE_VSSCANF          1
226 #endif
227 #ifndef SECUREC_ENABLE_SCANF
228 #if SECUREC_ENABLE_SCANF_FILE
229 #define SECUREC_ENABLE_SCANF            1
230 #else
231 #define SECUREC_ENABLE_SCANF            0
232 #endif
233 #endif
234 #ifndef SECUREC_ENABLE_VSCANF
235 #if SECUREC_ENABLE_SCANF_FILE
236 #define SECUREC_ENABLE_VSCANF           1
237 #else
238 #define SECUREC_ENABLE_VSCANF           0
239 #endif
240 #endif
241 
242 #ifndef SECUREC_ENABLE_FSCANF
243 #if SECUREC_ENABLE_SCANF_FILE
244 #define SECUREC_ENABLE_FSCANF           1
245 #else
246 #define SECUREC_ENABLE_FSCANF           0
247 #endif
248 #endif
249 #ifndef SECUREC_ENABLE_VFSCANF
250 #if SECUREC_ENABLE_SCANF_FILE
251 #define SECUREC_ENABLE_VFSCANF          1
252 #else
253 #define SECUREC_ENABLE_VFSCANF          0
254 #endif
255 #endif
256 
257 #ifndef SECUREC_ENABLE_STRTOK
258 #define SECUREC_ENABLE_STRTOK           1
259 #endif
260 #ifndef SECUREC_ENABLE_GETS
261 #define SECUREC_ENABLE_GETS             1
262 #endif
263 #endif /* SECUREC_USE_STD_SECURE_LIB */
264 
265 #if SECUREC_ENABLE_SCANF_FILE == 0
266 #if SECUREC_ENABLE_FSCANF
267 #undef SECUREC_ENABLE_FSCANF
268 #define SECUREC_ENABLE_FSCANF           0
269 #endif
270 #if SECUREC_ENABLE_VFSCANF
271 #undef SECUREC_ENABLE_VFSCANF
272 #define SECUREC_ENABLE_VFSCANF          0
273 #endif
274 #if SECUREC_ENABLE_SCANF
275 #undef SECUREC_ENABLE_SCANF
276 #define SECUREC_ENABLE_SCANF            0
277 #endif
278 #if SECUREC_ENABLE_FSCANF
279 #undef SECUREC_ENABLE_FSCANF
280 #define SECUREC_ENABLE_FSCANF           0
281 #endif
282 
283 #endif
284 
285 #if SECUREC_IN_KERNEL
286 #include <linux/kernel.h>
287 #include <linux/module.h>
288 #else
289 #ifndef SECUREC_HAVE_STDIO_H
290 #define SECUREC_HAVE_STDIO_H 1
291 #endif
292 #ifndef SECUREC_HAVE_STRING_H
293 #define SECUREC_HAVE_STRING_H 1
294 #endif
295 #ifndef SECUREC_HAVE_STDLIB_H
296 #define SECUREC_HAVE_STDLIB_H 1
297 #endif
298 #if SECUREC_HAVE_STDIO_H
299 #include <stdio.h>
300 #endif
301 #if SECUREC_HAVE_STRING_H
302 #include <string.h>
303 #endif
304 #if SECUREC_HAVE_STDLIB_H
305 #include <stdlib.h>
306 #endif
307 #endif
308 
309 /*
310  * If you need high performance, enable the SECUREC_WITH_PERFORMANCE_ADDONS macro, default is enable.
311  * The macro is automatically closed on the windows platform and linux kernel
312  */
313 #ifndef SECUREC_WITH_PERFORMANCE_ADDONS
314 #if SECUREC_IN_KERNEL
315 #define SECUREC_WITH_PERFORMANCE_ADDONS 0
316 #else
317 #define SECUREC_WITH_PERFORMANCE_ADDONS 0
318 #endif
319 #endif
320 
321 /* If enable SECUREC_COMPATIBLE_WIN_FORMAT, the output format will be compatible to Windows. */
322 #if (defined(_WIN32) || defined(_WIN64) || defined(_MSC_VER)) && !defined(SECUREC_COMPATIBLE_LINUX_FORMAT)
323 #ifndef SECUREC_COMPATIBLE_WIN_FORMAT
324 #define SECUREC_COMPATIBLE_WIN_FORMAT
325 #endif
326 #endif
327 
328 #if defined(SECUREC_COMPATIBLE_WIN_FORMAT)
329 /* On windows platform, can't use optimized function for there is no __builtin_constant_p like function */
330 /* If need optimized macro, can define this: define __builtin_constant_p(x) 0 */
331 #ifdef SECUREC_WITH_PERFORMANCE_ADDONS
332 #undef SECUREC_WITH_PERFORMANCE_ADDONS
333 #define SECUREC_WITH_PERFORMANCE_ADDONS 0
334 #endif
335 #endif
336 
337 #if defined(__VXWORKS__) || defined(__vxworks) || defined(__VXWORKS) || defined(_VXWORKS_PLATFORM_)  || \
338     defined(SECUREC_VXWORKS_VERSION_5_4)
339 #ifndef SECUREC_VXWORKS_PLATFORM
340 #define SECUREC_VXWORKS_PLATFORM
341 #endif
342 #endif
343 
344 /* If enable SECUREC_COMPATIBLE_LINUX_FORMAT, the output format will be compatible to Linux. */
345 #if !defined(SECUREC_COMPATIBLE_WIN_FORMAT) && !defined(SECUREC_VXWORKS_PLATFORM)
346 #ifndef SECUREC_COMPATIBLE_LINUX_FORMAT
347 #define SECUREC_COMPATIBLE_LINUX_FORMAT
348 #endif
349 #endif
350 
351 #ifdef SECUREC_COMPATIBLE_LINUX_FORMAT
352 #ifndef SECUREC_HAVE_STDDEF_H
353 #define SECUREC_HAVE_STDDEF_H 1
354 #endif
355 /* Some system may no stddef.h */
356 #if SECUREC_HAVE_STDDEF_H
357 #include <stddef.h>
358 #endif
359 #endif
360 
361 /*
362  * Add  the -DSECUREC_SUPPORT_FORMAT_WARNING  compiler option to supoort  -Wformat.
363  * Default does not check the format is that the same data type in the actual code.
364  * In the product is different in the original data type definition of VxWorks and Linux.
365  */
366 #ifndef SECUREC_SUPPORT_FORMAT_WARNING
367 #define SECUREC_SUPPORT_FORMAT_WARNING 0
368 #endif
369 
370 /* SECUREC_PCLINT for tool do not recognize __attribute__  just for pclint */
371 #if SECUREC_SUPPORT_FORMAT_WARNING && !defined(SECUREC_PCLINT)
372 #define SECUREC_ATTRIBUTE(x, y)  __attribute__((format(printf, (x), (y))))
373 #else
374 #define SECUREC_ATTRIBUTE(x, y)
375 #endif
376 
377 /* SECUREC_PCLINT for tool do not recognize __builtin_expect, just for pclint */
378 #if defined(__GNUC__) && \
379     ((__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3))) && \
380     !defined(SECUREC_PCLINT)
381 /*
382  * This is a built-in function that can be used without a declaration, if you encounter an undeclared compilation alarm,
383  * you can add -DSECUREC_NEED_BUILTIN_EXPECT_DECLARE to complier options
384  */
385 #ifdef SECUREC_NEED_BUILTIN_EXPECT_DECLARE
386 long __builtin_expect(long exp, long c);
387 #endif
388 #define SECUREC_LIKELY(x) __builtin_expect(!!(x), 1)
389 #define SECUREC_UNLIKELY(x) __builtin_expect(!!(x), 0)
390 #else
391 #define SECUREC_LIKELY(x) (x)
392 #define SECUREC_UNLIKELY(x) (x)
393 #endif
394 
395 /* Define the max length of the string */
396 #ifndef SECUREC_STRING_MAX_LEN
397 #define SECUREC_STRING_MAX_LEN 0x7fffffffUL
398 #endif
399 #define SECUREC_WCHAR_STRING_MAX_LEN (SECUREC_STRING_MAX_LEN / sizeof(wchar_t))
400 
401 /* Add SECUREC_MEM_MAX_LEN for memcpy and memmove */
402 #ifndef SECUREC_MEM_MAX_LEN
403 #define SECUREC_MEM_MAX_LEN 0x7fffffffUL
404 #endif
405 #define SECUREC_WCHAR_MEM_MAX_LEN (SECUREC_MEM_MAX_LEN / sizeof(wchar_t))
406 
407 #if SECUREC_STRING_MAX_LEN > 0x7fffffff
408 #error "max string is 2G"
409 #endif
410 
411 #if (defined(__GNUC__) && defined(__SIZEOF_POINTER__))
412 #if (__SIZEOF_POINTER__ != 4) && (__SIZEOF_POINTER__ != 8)
413 #error "unsupported system"
414 #endif
415 #endif
416 
417 #if defined(_WIN64) || defined(WIN64) || defined(__LP64__) || defined(_LP64)
418 #define SECUREC_ON_64BITS
419 #endif
420 
421 #if (!defined(SECUREC_ON_64BITS) && defined(__GNUC__) && defined(__SIZEOF_POINTER__))
422 #if __SIZEOF_POINTER__ == 8
423 #define SECUREC_ON_64BITS
424 #endif
425 #endif
426 
427 #if defined(__SVR4) || defined(__svr4__)
428 #define SECUREC_ON_SOLARIS
429 #endif
430 
431 #if (defined(__hpux) || defined(_AIX) || defined(SECUREC_ON_SOLARIS))
432 #define SECUREC_ON_UNIX
433 #endif
434 
435 /*
436  * Codes should run under the macro SECUREC_COMPATIBLE_LINUX_FORMAT in unknow system on default,
437  * and strtold.
438  * The function strtold is referenced first at ISO9899:1999(C99), and some old compilers can
439  * not support these functions. Here provides a macro to open these functions:
440  * SECUREC_SUPPORT_STRTOLD  -- If defined, strtold will be used
441  */
442 #ifndef SECUREC_SUPPORT_STRTOLD
443 #define SECUREC_SUPPORT_STRTOLD 0
444 #if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT))
445 #if defined(__USE_ISOC99)  || \
446     (defined(_AIX) && defined(_ISOC99_SOURCE)) || \
447     (defined(__hpux) && defined(__ia64)) || \
448     (defined(SECUREC_ON_SOLARIS) && (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \
449     defined(_STDC_C99) || defined(__EXTENSIONS__))
450 #undef  SECUREC_SUPPORT_STRTOLD
451 #define SECUREC_SUPPORT_STRTOLD 1
452 #endif
453 #endif
454 #if ((defined(SECUREC_WRLINUX_BELOW4) || defined(_WRLINUX_BELOW4_)))
455 #undef  SECUREC_SUPPORT_STRTOLD
456 #define SECUREC_SUPPORT_STRTOLD 0
457 #endif
458 #endif
459 
460 
461 #if SECUREC_WITH_PERFORMANCE_ADDONS
462 
463 #ifndef SECUREC_TWO_MIN
464 #define SECUREC_TWO_MIN(a, b) ((a) < (b) ? (a) : (b))
465 #endif
466 
467 /* For strncpy_s performance optimization */
468 #define SECUREC_STRNCPY_SM(dest, destMax, src, count) \
469     (((void *)(dest) != NULL && (void *)(src) != NULL && (size_t)(destMax) > 0 && \
470     (((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN) && \
471     (SECUREC_TWO_MIN((size_t)(count), strlen(src)) + 1) <= (size_t)(destMax)) ? \
472     (((size_t)(count) < strlen(src)) ? (memcpy((dest), (src), (count)), *((char *)(dest) + (count)) = '\0', EOK) : \
473     (memcpy((dest), (src), strlen(src) + 1), EOK)) : (strncpy_error((dest), (destMax), (src), (count))))
474 
475 #define SECUREC_STRCPY_SM(dest, destMax, src) \
476     (((void *)(dest) != NULL && (void *)(src) != NULL && (size_t)(destMax) > 0 && \
477     (((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN) && \
478     (strlen(src) + 1) <= (size_t)(destMax)) ? (memcpy((dest), (src), strlen(src) + 1), EOK) : \
479     (strcpy_error((dest), (destMax), (src))))
480 
481 /* For strcat_s performance optimization */
482 #if defined(__GNUC__)
483 #define SECUREC_STRCAT_SM(dest, destMax, src) ({ \
484     int catRet = EOK; \
485     if ((void *)(dest) != NULL && (void *)(src) != NULL && (size_t)(destMax) > 0 && \
486         (((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN)) { \
487         char *catTmpDst = (char *)(dest); \
488         size_t catRestSize = (destMax); \
489         while (catRestSize > 0 && *catTmpDst != '\0') { \
490             ++catTmpDst; \
491             --catRestSize; \
492         } \
493         if (catRestSize == 0) { \
494             catRet = EINVAL; \
495         } else if ((strlen(src) + 1) <= catRestSize) { \
496             memcpy(catTmpDst, (src), strlen(src) + 1); \
497             catRet = EOK; \
498         } else { \
499             catRet = ERANGE; \
500         } \
501         if (catRet != EOK) { \
502             catRet = strcat_s((dest), (destMax), (src)); \
503         } \
504     } else { \
505         catRet = strcat_s((dest), (destMax), (src)); \
506     } \
507     catRet; \
508 })
509 #else
510 #define SECUREC_STRCAT_SM(dest, destMax, src) strcat_s((dest), (destMax), (src))
511 #endif
512 
513 /* For strncat_s performance optimization */
514 #if defined(__GNUC__)
515 #define SECUREC_STRNCAT_SM(dest, destMax, src, count) ({ \
516     int ncatRet = EOK; \
517     if ((void *)(dest) != NULL && (void *)(src) != NULL && (size_t)(destMax) > 0 && \
518         (((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN)  && \
519         (((unsigned long long)(count) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN)) { \
520         char *ncatTmpDest = (char *)(dest); \
521         size_t ncatRestSize = (size_t)(destMax); \
522         while (ncatRestSize > 0 && *ncatTmpDest != '\0') { \
523             ++ncatTmpDest; \
524             --ncatRestSize; \
525         } \
526         if (ncatRestSize == 0) { \
527             ncatRet = EINVAL; \
528         } else if ((SECUREC_TWO_MIN((count), strlen(src)) + 1) <= ncatRestSize) { \
529             if ((size_t)(count) < strlen(src)) { \
530                 memcpy(ncatTmpDest, (src), (count)); \
531                 *(ncatTmpDest + (count)) = '\0'; \
532             } else { \
533                 memcpy(ncatTmpDest, (src), strlen(src) + 1); \
534             } \
535         } else { \
536             ncatRet = ERANGE; \
537         } \
538         if (ncatRet != EOK) { \
539             ncatRet = strncat_s((dest), (destMax), (src), (count)); \
540         } \
541     } else { \
542         ncatRet = strncat_s((dest), (destMax), (src), (count)); \
543     } \
544     ncatRet; \
545 })
546 #else
547 #define SECUREC_STRNCAT_SM(dest, destMax, src, count) strncat_s((dest), (destMax), (src), (count))
548 #endif
549 
550 /* This macro do not check buffer overlap by default */
551 #define  SECUREC_MEMCPY_SM(dest, destMax, src, count) \
552     (!(((size_t)(destMax) == 0) || \
553         (((unsigned long long)(destMax) & (unsigned long long)(-2)) > SECUREC_MEM_MAX_LEN) || \
554         ((size_t)(count) > (size_t)(destMax)) || ((void *)(dest)) == NULL || ((void *)(src) == NULL)) ? \
555         (memcpy((dest), (src), (count)), EOK) : \
556         (memcpy_s((dest), (destMax), (src), (count))))
557 
558 #define  SECUREC_MEMSET_SM(dest, destMax, c, count) \
559     (!((((unsigned long long)(destMax) & (unsigned long long)(-2)) > SECUREC_MEM_MAX_LEN) || \
560         ((void *)(dest) == NULL) || ((size_t)(count) > (size_t)(destMax))) ? \
561         (memset((dest), (c), (count)), EOK) : \
562         (memset_s((dest), (destMax), (c), (count))))
563 
564 #endif
565 #endif /* __SECURECTYPE_H__A7BBB686_AADA_451B_B9F9_44DACDAE18A7 */
566 
567