diff options
author | Ulrich Drepper <drepper@redhat.com> | 2007-09-15 02:38:04 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2007-09-15 02:38:04 +0000 |
commit | de1c3ebb59c9e9f7caaf5a71920fe613e3e7cfaa (patch) | |
tree | 96902cb9b4854e8653e71679430233195b3ec132 /string/bits | |
parent | b53eef9c021cbeea45b2f3df590e93e1a51d8acd (diff) | |
download | glibc-de1c3ebb59c9e9f7caaf5a71920fe613e3e7cfaa.tar.gz glibc-de1c3ebb59c9e9f7caaf5a71920fe613e3e7cfaa.tar.xz glibc-de1c3ebb59c9e9f7caaf5a71920fe613e3e7cfaa.zip |
* misc/sys/cdefs.h (__va_arg_pack): Define for GCC 4.3+.
* misc/bits/syslog.h (syslog): When __va_arg_pack is defined, implement as __extern_always_inline function. (vsyslog): Define as __extern_always_inline function unconditionally. * libio/bits/stdio2.h (sprintf, snprintf, printf, fprintf): When __va_arg_pack is defined, implement as __extern_always_inline functions. (vsprintf, vsnprintf, vprintf, vfprintf): Define as __extern_always_inline functions unconditionally. * libio/bits/stdio.h (vprintf): Ifdef out the inline when bits/stdio2.h will be included. * wcsmbs/bits/wchar2.h (__swprintf_alias): New redirect. (swprintf, wprintf, fwprintf): When __va_arg_pack is defined, implement as __extern_always_inline functions. (vswprintf, vwprintf, vfwprintf): Define as __extern_always_inline functions unconditionally. * debug/tst-chk1.c (do_test): Enable remaining tests for C++. 2007-09-03 Jakub Jelinek <jakub@redhat.com> * misc/sys/cdefs.h (__extern_inline, __extern_always_inline): Only define in C++ for GCC 4.3+, in C++ always use __gnu_inline__ attribute. * include/features.h (__USE_EXTERN_INLINES): Define only when __extern_inline is defined. * stdlib/stdlib.h: Include bits/stdlib.h when __extern_always_inline is defined instead of when not __cplusplus. * misc/sys/syslog.h: Include bits/syslog.h when __extern_always_inline is defined instead of when not __cplusplus. * socket/sys/socket.h: Include bits/socket2.h when __extern_always_inline is defined instead of when not __cplusplus. * libio/stdio.h: Include bits/stdio2.h when __extern_always_inline is defined instead of when not __cplusplus. * posix/unistd.h: Include bits/unistd.h when __extern_always_inline is defined instead of when not __cplusplus. * string/string.h: Include bits/string3.h when __extern_always_inline is defined instead of when not __cplusplus. * wcsmbs/wchar.h: Include bits/wchar2.h when __extern_always_inline is defined instead of when not __cplusplus. (btowc, wctob): Don't guard the inlines with ifndef __cplusplus. * io/fcntl.h: Don't include bits/fcntl2.h if __extern_always_inline is not defined. * misc/bits/syslog-ldbl.h: Guard *_chk stuff with defined __extern_always_inline instead of !defined __cplusplus. * libio/bits/stdio-ldbl.h: Likewise. * wcsmbs/bits/wchar-ldbl.h: Likewise. * misc/bits/syslog.h (syslog): Don't define for C++. (vsyslog): Use __extern_always_inline function for C++ instead of a macro. * libio/bits/stdio.h (__STDIO_INLINE): Define to __extern_inline whenever that macro is defined. (vprintf): Don't provide the inline for C++. (fread_unlocked, fwrite_unlocked): Don't define the macros for C++. * libio/bits/stdio2.h (sprintf, snprintf, printf, fprintf): Don't define the macros for C++. (vsprintf, vsnprintf, vprintf, vfprintf): Define as __extern_always_inline functions for C++. * io/sys/stat.h (stat, lstat, fstat, fstatat, mknod, mknodat, stat64, lstat64, fstat64, fstatat64): Don't define if not __USE_EXTERN_INLINES. * wcsmbs/bits/wchar2.h: Fix #error message. (swprintf, wprintf, fwprintf): Don't define the macros for C++. (vswprintf, vwprintf, vfwprintf): Define using __extern_always_inline functions for C++. * string/bits/string3.h: Don't #undef macros if __cplusplus. (memcpy, memmove, mempcpy, memset, bcopy, bzero, strcpy, stpcpy, strncpy, strcat, strncat): Define as __extern_always_inline functions instead of macros for C++. * math/bits/cmathcalls.h: Guard __extern_inline routines with defined __extern_inline. * sysdeps/alpha/fpu/bits/mathinline.h (__MATH_INLINE): Define to __extern_inline whenever that macro is defined. * sysdeps/ia64/fpu/bits/mathinline.h (__MATH_INLINE): Likewise. * sysdeps/i386/fpu/bits/mathinline.h (__MATH_INLINE): Likewise. * sysdeps/i386/i486/bits/string.h (__STRING_INLINE): Likewise. * sysdeps/s390/bits/string.h (__STRING_INLINE): Likewise. * sysdeps/s390/fpu/bits/mathinline.h (__MATH_INLINE): Likewise. * sysdeps/powerpc/fpu/bits/mathinline.h (__MATH_INLINE): Likewise. * sysdeps/x86_64/fpu/bits/mathinline.h (__MATH_INLINE): Likewise. * sysdeps/sparc/fpu/bits/mathinline.h (__MATH_INLINE): Likewise. * sysdeps/unix/sysv/linux/sys/sysmacros.h (gnu_dev_major, gnu_dev_minor, gnu_dev_makedev): Remove __extern_inline from prototypes. Only provide __extern_inline routines if __USE_EXTERN_INLINES. * debug/Makefile: Add rules to build and run tst-{,lfs}chk{4,5,6} tests. * debug/tst-chk1.c (do_prepare, do_test): Allow compilation as C++. For now avoid some *printf tests in C++. Skip all testing if __USE_FORTIFY_LEVEL is defined, but __extern_always_inline macro is not. * debug/tst-chk4.cc: New file. * debug/tst-chk5.cc: New file. * debug/tst-chk6.cc: New file. * debug/tst-lfschk4.cc: New file. * debug/tst-lfschk5.cc: New file. * debug/tst-lfschk6.cc: New file. * include/wchar.h (__vfwprintf_chk, __vswprintf_chk): Avoid prototypes in C++. * include/stdio.h (__sprintf_chk, __snprintf_chk, __vsprintf_chk, __vsnprintf_chk, __printf_chk, __fprintf_chk, __vprintf_chk, __vfprintf_chk, __fgets_unlocked_chk, __fgets_chk): Likewise.
Diffstat (limited to 'string/bits')
-rw-r--r-- | string/bits/string3.h | 158 |
1 files changed, 126 insertions, 32 deletions
diff --git a/string/bits/string3.h b/string/bits/string3.h index f68ce5899f..876fe77929 100644 --- a/string/bits/string3.h +++ b/string/bits/string3.h @@ -20,27 +20,40 @@ # error "Never use <bits/string3.h> directly; include <string.h> instead." #endif +__warndecl (__warn_memset_zero_len, + "memset used with constant zero length parameter; this could be due to transposed parameters"); + +#ifndef __cplusplus /* XXX This is temporarily. We should not redefine any of the symbols and instead integrate the error checking into the original definitions. */ -#undef memcpy -#undef memmove -#undef memset -#undef strcat -#undef strcpy -#undef strncat -#undef strncpy -#ifdef __USE_GNU -# undef mempcpy -# undef stpcpy -#endif -#ifdef __USE_BSD -# undef bcopy -# undef bzero +# undef memcpy +# undef memmove +# undef memset +# undef strcat +# undef strcpy +# undef strncat +# undef strncpy +# ifdef __USE_GNU +# undef mempcpy +# undef stpcpy +# endif +# ifdef __USE_BSD +# undef bcopy +# undef bzero +# endif #endif -#define memcpy(dest, src, len) \ +#ifdef __cplusplus +__extern_always_inline void * +__NTH (memcpy (void *__restrict __dest, __const void *__restrict __src, + size_t __len)) +{ + return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest)); +} +#else +# define memcpy(dest, src, len) \ ((__bos0 (dest) != (size_t) -1) \ ? __builtin___memcpy_chk (dest, src, len, __bos0 (dest)) \ : __memcpy_ichk (dest, src, len)) @@ -50,9 +63,17 @@ __NTH (__memcpy_ichk (void *__restrict __dest, __const void *__restrict __src, { return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest)); } +#endif - -#define memmove(dest, src, len) \ +#ifdef __cplusplus +__extern_always_inline void * +__NTH (memmove (void *__restrict __dest, __const void *__restrict __src, + size_t __len)) +{ + return __builtin___memmove_chk (__dest, __src, __len, __bos0 (__dest)); +} +#else +# define memmove(dest, src, len) \ ((__bos0 (dest) != (size_t) -1) \ ? __builtin___memmove_chk (dest, src, len, __bos0 (dest)) \ : __memmove_ichk (dest, src, len)) @@ -61,10 +82,18 @@ __NTH (__memmove_ichk (void *__dest, __const void *__src, size_t __len)) { return __builtin___memmove_chk (__dest, __src, __len, __bos0 (__dest)); } - +#endif #ifdef __USE_GNU -# define mempcpy(dest, src, len) \ +# ifdef __cplusplus +__extern_always_inline void * +__NTH (mempcpy (void *__restrict __dest, __const void *__restrict __src, + size_t __len)) +{ + return __builtin___mempcpy_chk (__dest, __src, __len, __bos0 (__dest)); +} +# else +# define mempcpy(dest, src, len) \ ((__bos0 (dest) != (size_t) -1) \ ? __builtin___mempcpy_chk (dest, src, len, __bos0 (dest)) \ : __mempcpy_ichk (dest, src, len)) @@ -74,6 +103,7 @@ __NTH (__mempcpy_ichk (void *__restrict __dest, { return __builtin___mempcpy_chk (__dest, __src, __len, __bos0 (__dest)); } +# endif #endif @@ -82,9 +112,19 @@ __NTH (__mempcpy_ichk (void *__restrict __dest, especially problematic if the intended fill value is zero. In this case no work is done at all. We detect these problems by referring non-existing functions. */ -__warndecl (__warn_memset_zero_len, - "memset used with constant zero length parameter; this could be due to transposed parameters"); -#define memset(dest, ch, len) \ +#ifdef __cplusplus +__extern_always_inline void * +__NTH (memset (void *__dest, int __ch, size_t __len)) +{ + if (__builtin_constant_p (__len) && __len == 0) + { + __warn_memset_zero_len (); + return __dest; + } + return __builtin___memset_chk (__dest, __ch, __len, __bos0 (__dest)); +} +#else +# define memset(dest, ch, len) \ (__builtin_constant_p (len) && (len) == 0 \ ? (__warn_memset_zero_len (), (void) (ch), (void) (len), (void *) (dest)) \ : ((__bos0 (dest) != (size_t) -1) \ @@ -95,20 +135,41 @@ __NTH (__memset_ichk (void *__dest, int __ch, size_t __len)) { return __builtin___memset_chk (__dest, __ch, __len, __bos0 (__dest)); } +#endif #ifdef __USE_BSD -# define bcopy(src, dest, len) ((void) \ +# ifdef __cplusplus +__extern_always_inline void +__NTH (bcopy (__const void *__restrict __src, void *__restrict __dest, + size_t __len)) +{ + __builtin___memmove_chk (__dest, __src, __len, __bos0 (__dest)); +} +__extern_always_inline void +__NTH (bzero (void *__dest, size_t __len)) +{ + __builtin___memset_chk (__dest, '\0', __len, __bos0 (__dest)); +} +# else +# define bcopy(src, dest, len) ((void) \ ((__bos0 (dest) != (size_t) -1) \ ? __builtin___memmove_chk (dest, src, len, __bos0 (dest)) \ : __memmove_ichk (dest, src, len))) -# define bzero(dest, len) ((void) \ +# define bzero(dest, len) ((void) \ ((__bos0 (dest) != (size_t) -1) \ ? __builtin___memset_chk (dest, '\0', len, __bos0 (dest)) \ : __memset_ichk (dest, '\0', len))) +# endif #endif - -#define strcpy(dest, src) \ +#ifdef __cplusplus +__extern_always_inline char * +__NTH (strcpy (char *__restrict __dest, __const char *__restrict __src)) +{ + return __builtin___strcpy_chk (__dest, __src, __bos (__dest)); +} +#else +# define strcpy(dest, src) \ ((__bos (dest) != (size_t) -1) \ ? __builtin___strcpy_chk (dest, src, __bos (dest)) \ : __strcpy_ichk (dest, src)) @@ -117,10 +178,17 @@ __NTH (__strcpy_ichk (char *__restrict __dest, __const char *__restrict __src)) { return __builtin___strcpy_chk (__dest, __src, __bos (__dest)); } - +#endif #ifdef __USE_GNU -# define stpcpy(dest, src) \ +# ifdef __cplusplus +__extern_always_inline char * +__NTH (stpcpy (char *__restrict __dest, __const char *__restrict __src)) +{ + return __builtin___stpcpy_chk (__dest, __src, __bos (__dest)); +} +# else +# define stpcpy(dest, src) \ ((__bos (dest) != (size_t) -1) \ ? __builtin___stpcpy_chk (dest, src, __bos (dest)) \ : __stpcpy_ichk (dest, src)) @@ -129,10 +197,19 @@ __NTH (__stpcpy_ichk (char *__restrict __dest, __const char *__restrict __src)) { return __builtin___stpcpy_chk (__dest, __src, __bos (__dest)); } +# endif #endif -#define strncpy(dest, src, len) \ +#ifdef __cplusplus +__extern_always_inline char * +__NTH (strncpy (char *__restrict __dest, __const char *__restrict __src, + size_t __len)) +{ + return __builtin___strncpy_chk (__dest, __src, __len, __bos (__dest)); +} +#else +# define strncpy(dest, src, len) \ ((__bos (dest) != (size_t) -1) \ ? __builtin___strncpy_chk (dest, src, len, __bos (dest)) \ : __strncpy_ichk (dest, src, len)) @@ -142,7 +219,7 @@ __NTH (__strncpy_ichk (char *__restrict __dest, __const char *__restrict __src, { return __builtin___strncpy_chk (__dest, __src, __len, __bos (__dest)); } - +#endif // XXX We have no corresponding builtin yet. extern char *__stpncpy_chk (char *__dest, __const char *__src, size_t __n, @@ -161,7 +238,14 @@ __NTH (stpncpy (char *__dest, __const char *__src, size_t __n)) } -#define strcat(dest, src) \ +#ifdef __cplusplus +__extern_always_inline char * +__NTH (strcat (char *__restrict __dest, __const char *__restrict __src)) +{ + return __builtin___strcat_chk (__dest, __src, __bos (__dest)); +} +#else +# define strcat(dest, src) \ ((__bos (dest) != (size_t) -1) \ ? __builtin___strcat_chk (dest, src, __bos (dest)) \ : __strcat_ichk (dest, src)) @@ -170,9 +254,18 @@ __NTH (__strcat_ichk (char *__restrict __dest, __const char *__restrict __src)) { return __builtin___strcat_chk (__dest, __src, __bos (__dest)); } +#endif -#define strncat(dest, src, len) \ +#ifdef __cplusplus +__extern_always_inline char * +__NTH (strncat (char *__restrict __dest, __const char *__restrict __src, + size_t __len)) +{ + return __builtin___strncat_chk (__dest, __src, __len, __bos (__dest)); +} +#else +# define strncat(dest, src, len) \ ((__bos (dest) != (size_t) -1) \ ? __builtin___strncat_chk (dest, src, len, __bos (dest)) \ : __strncat_ichk (dest, src, len)) @@ -182,3 +275,4 @@ __NTH (__strncat_ichk (char *__restrict __dest, __const char *__restrict __src, { return __builtin___strncat_chk (__dest, __src, __len, __bos (__dest)); } +#endif |