diff options
Diffstat (limited to 'string/bits')
-rw-r--r-- | string/bits/string3.h | 87 |
1 files changed, 52 insertions, 35 deletions
diff --git a/string/bits/string3.h b/string/bits/string3.h index 87cbe35bb1..041ac11259 100644 --- a/string/bits/string3.h +++ b/string/bits/string3.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2004 Free Software Foundation, Inc. +/* Copyright (C) 2004, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -44,10 +44,9 @@ ((__bos0 (dest) != (size_t) -1) \ ? __builtin___memcpy_chk (dest, src, len, __bos0 (dest)) \ : __memcpy_ichk (dest, src, len)) -static __inline__ void * -__attribute__ ((__always_inline__)) -__memcpy_ichk (void *__restrict __dest, const void *__restrict __src, - size_t __len) +static __always_inline void * +__NTH (__memcpy_ichk (void *__restrict __dest, __const void *__restrict __src, + size_t __len)) { return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest)); } @@ -57,9 +56,8 @@ __memcpy_ichk (void *__restrict __dest, const void *__restrict __src, ((__bos0 (dest) != (size_t) -1) \ ? __builtin___memmove_chk (dest, src, len, __bos0 (dest)) \ : __memmove_ichk (dest, src, len)) -static __inline__ void * -__attribute__ ((__always_inline__)) -__memmove_ichk (void *__dest, const void *__src, size_t __len) +static __always_inline void * +__NTH (__memmove_ichk (void *__dest, __const void *__src, size_t __len)) { return __builtin___memmove_chk (__dest, __src, __len, __bos0 (__dest)); } @@ -70,23 +68,30 @@ __memmove_ichk (void *__dest, const void *__src, size_t __len) ((__bos0 (dest) != (size_t) -1) \ ? __builtin___mempcpy_chk (dest, src, len, __bos0 (dest)) \ : __mempcpy_ichk (dest, src, len)) -static __inline__ void * -__attribute__ ((__always_inline__)) -__mempcpy_ichk (void *__restrict __dest, const void *__restrict __src, - size_t __len) +static __always_inline void * +__NTH (__mempcpy_ichk (void *__restrict __dest, + __const void *__restrict __src, size_t __len)) { return __builtin___mempcpy_chk (__dest, __src, __len, __bos0 (__dest)); } #endif +/* The first two tests here help to catch a somewhat common problem + where the second and third parameter are transposed. This is + 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) \ - ((__bos0 (dest) != (size_t) -1) \ - ? __builtin___memset_chk (dest, ch, len, __bos0 (dest)) \ - : __memset_ichk (dest, ch, len)) -static __inline__ void * -__attribute__ ((__always_inline__)) -__memset_ichk (void *__dest, int __ch, size_t __len) + (__builtin_constant_p (len) && (len) == 0 \ + ? (__warn_memset_zero_len (), (void) (ch), (void) (len), (void *) (dest)) \ + : ((__bos0 (dest) != (size_t) -1) \ + ? __builtin___memset_chk (dest, ch, len, __bos0 (dest)) \ + : __memset_ichk (dest, ch, len))) +static __always_inline void * +__NTH (__memset_ichk (void *__dest, int __ch, size_t __len)) { return __builtin___memset_chk (__dest, __ch, __len, __bos0 (__dest)); } @@ -107,9 +112,8 @@ __memset_ichk (void *__dest, int __ch, size_t __len) ((__bos (dest) != (size_t) -1) \ ? __builtin___strcpy_chk (dest, src, __bos (dest)) \ : __strcpy_ichk (dest, src)) -static __inline__ char * -__attribute__ ((__always_inline__)) -__strcpy_ichk (char *__restrict __dest, const char *__restrict __src) +static __always_inline char * +__NTH (__strcpy_ichk (char *__restrict __dest, __const char *__restrict __src)) { return __builtin___strcpy_chk (__dest, __src, __bos (__dest)); } @@ -120,9 +124,8 @@ __strcpy_ichk (char *__restrict __dest, const char *__restrict __src) ((__bos (dest) != (size_t) -1) \ ? __builtin___stpcpy_chk (dest, src, __bos (dest)) \ : __stpcpy_ichk (dest, src)) -static __inline__ char * -__attribute__ ((__always_inline__)) -__stpcpy_ichk (char *__restrict __dest, const char *__restrict __src) +static __always_inline char * +__NTH (__stpcpy_ichk (char *__restrict __dest, __const char *__restrict __src)) { return __builtin___stpcpy_chk (__dest, __src, __bos (__dest)); } @@ -133,22 +136,37 @@ __stpcpy_ichk (char *__restrict __dest, const char *__restrict __src) ((__bos (dest) != (size_t) -1) \ ? __builtin___strncpy_chk (dest, src, len, __bos (dest)) \ : __strncpy_ichk (dest, src, len)) -static __inline__ char * -__attribute__ ((__always_inline__)) -__strncpy_ichk (char *__restrict __dest, const char *__restrict __src, - size_t __len) +static __always_inline char * +__NTH (__strncpy_ichk (char *__restrict __dest, __const char *__restrict __src, + size_t __len)) { return __builtin___strncpy_chk (__dest, __src, __len, __bos (__dest)); } +// XXX We have no corresponding builtin yet. +extern char *__stpncpy_chk (char *__dest, __const char *__src, size_t __n, + size_t __destlen) __THROW; +extern char *__REDIRECT_NTH (__stpncpy_alias, (char *__dest, + __const char *__src, + size_t __n), stpncpy); + +extern __always_inline char * +__NTH (stpncpy (char *__dest, __const char *__src, size_t __n)) +{ + if (__bos (__dest) != (size_t) -1 + && (!__builtin_constant_p (__n) || __n <= __bos (__dest))) + return __stpncpy_chk (__dest, __src, __n, __bos (__dest)); + return __stpncpy_alias (__dest, __src, __n); +} + + #define strcat(dest, src) \ ((__bos (dest) != (size_t) -1) \ ? __builtin___strcat_chk (dest, src, __bos (dest)) \ : __strcat_ichk (dest, src)) -static __inline__ char * -__attribute__ ((__always_inline__)) -__strcat_ichk (char *__restrict __dest, const char *__restrict __src) +static __always_inline char * +__NTH (__strcat_ichk (char *__restrict __dest, __const char *__restrict __src)) { return __builtin___strcat_chk (__dest, __src, __bos (__dest)); } @@ -158,10 +176,9 @@ __strcat_ichk (char *__restrict __dest, const char *__restrict __src) ((__bos (dest) != (size_t) -1) \ ? __builtin___strncat_chk (dest, src, len, __bos (dest)) \ : __strncat_ichk (dest, src, len)) -static __inline__ char * -__attribute__ ((__always_inline__)) -__strncat_ichk (char *__restrict __dest, const char *__restrict __src, - size_t __len) +static __always_inline char * +__NTH (__strncat_ichk (char *__restrict __dest, __const char *__restrict __src, + size_t __len)) { return __builtin___strncat_chk (__dest, __src, __len, __bos (__dest)); } |