1/* Checking macros for string functions. 2 Copyright (C) 2004, 2005 Free Software Foundation, Inc. 3 4This file is part of GCC. 5 6GCC is free software; you can redistribute it and/or modify it under 7the terms of the GNU General Public License as published by the Free 8Software Foundation; either version 2, or (at your option) any later 9version. 10 11In addition to the permissions in the GNU General Public License, the 12Free Software Foundation gives you unlimited permission to link the 13compiled version of this file into combinations with other programs, 14and to distribute those combinations without any restriction coming 15from the use of this file. (The General Public License restrictions 16do apply in other respects; for example, they cover modification of 17the file, and distribution when not linked into a combine 18executable.) 19 20GCC is distributed in the hope that it will be useful, but WITHOUT ANY 21WARRANTY; without even the implied warranty of MERCHANTABILITY or 22FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 23for more details. 24 25You should have received a copy of the GNU General Public License 26along with GCC; see the file COPYING. If not, write to the Free 27Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 2802110-1301, USA. */ 29 30/* As a special exception, if you link this library with files compiled with 31 GCC to produce an executable, this does not cause the resulting executable 32 to be covered by the GNU General Public License. This exception does not 33 however invalidate any other reasons why the executable file might be 34 covered by the GNU General Public License. */ 35 36#ifndef _SSP_STRING_H 37#define _SSP_STRING_H 1 38 39#include <ssp.h> 40#include_next <string.h> 41 42#if __SSP_FORTIFY_LEVEL > 0 43 44#undef memcpy 45#undef memmove 46#undef memset 47#undef strcat 48#undef strcpy 49#undef strncat 50#undef strncpy 51#undef mempcpy 52#undef stpcpy 53#undef bcopy 54#undef bzero 55 56#define memcpy(dest, src, len) \ 57 ((__ssp_bos0 (dest) != (size_t) -1) \ 58 ? __builtin___memcpy_chk (dest, src, len, __ssp_bos0 (dest)) \ 59 : __memcpy_ichk (dest, src, len)) 60static inline __attribute__((__always_inline__)) void * 61__memcpy_ichk (void *__restrict__ __dest, const void *__restrict__ __src, 62 size_t __len) 63{ 64 return __builtin___memcpy_chk (__dest, __src, __len, __ssp_bos0 (__dest)); 65} 66 67 68#define memmove(dest, src, len) \ 69 ((__ssp_bos0 (dest) != (size_t) -1) \ 70 ? __builtin___memmove_chk (dest, src, len, __ssp_bos0 (dest)) \ 71 : __memmove_ichk (dest, src, len)) 72static inline __attribute__((__always_inline__)) void * 73__memmove_ichk (void *__dest, const void *__src, size_t __len) 74{ 75 return __builtin___memmove_chk (__dest, __src, __len, __ssp_bos0 (__dest)); 76} 77 78 79#define mempcpy(dest, src, len) \ 80 ((__ssp_bos0 (dest) != (size_t) -1) \ 81 ? __builtin___mempcpy_chk (dest, src, len, __ssp_bos0 (dest)) \ 82 : __mempcpy_ichk (dest, src, len)) 83static inline __attribute__((__always_inline__)) void * 84__mempcpy_ichk (void *__restrict__ __dest, const void *__restrict__ __src, 85 size_t __len) 86{ 87 return __builtin___mempcpy_chk (__dest, __src, __len, __ssp_bos0 (__dest)); 88} 89 90 91#define memset(dest, ch, len) \ 92 ((__ssp_bos0 (dest) != (size_t) -1) \ 93 ? __builtin___memset_chk (dest, ch, len, __ssp_bos0 (dest)) \ 94 : __memset_ichk (dest, ch, len)) 95static inline __attribute__((__always_inline__)) void * 96__memset_ichk (void *__dest, int __ch, size_t __len) 97{ 98 return __builtin___memset_chk (__dest, __ch, __len, __ssp_bos0 (__dest)); 99} 100 101#define bcopy(src, dest, len) ((void) \ 102 ((__ssp_bos0 (dest) != (size_t) -1) \ 103 ? __builtin___memmove_chk (dest, src, len, __ssp_bos0 (dest)) \ 104 : __memmove_ichk (dest, src, len))) 105#define bzero(dest, len) ((void) \ 106 ((__ssp_bos0 (dest) != (size_t) -1) \ 107 ? __builtin___memset_chk (dest, '\0', len, __ssp_bos0 (dest)) \ 108 : __memset_ichk (dest, '\0', len))) 109 110 111#define strcpy(dest, src) \ 112 ((__ssp_bos (dest) != (size_t) -1) \ 113 ? __builtin___strcpy_chk (dest, src, __ssp_bos (dest)) \ 114 : __strcpy_ichk (dest, src)) 115static inline __attribute__((__always_inline__)) char * 116__strcpy_ichk (char *__restrict__ __dest, const char *__restrict__ __src) 117{ 118 return __builtin___strcpy_chk (__dest, __src, __ssp_bos (__dest)); 119} 120 121 122#define stpcpy(dest, src) \ 123 ((__ssp_bos (dest) != (size_t) -1) \ 124 ? __builtin___stpcpy_chk (dest, src, __ssp_bos (dest)) \ 125 : __stpcpy_ichk (dest, src)) 126static inline __attribute__((__always_inline__)) char * 127__stpcpy_ichk (char *__restrict__ __dest, const char *__restrict__ __src) 128{ 129 return __builtin___stpcpy_chk (__dest, __src, __ssp_bos (__dest)); 130} 131 132 133#define strncpy(dest, src, len) \ 134 ((__ssp_bos (dest) != (size_t) -1) \ 135 ? __builtin___strncpy_chk (dest, src, len, __ssp_bos (dest)) \ 136 : __strncpy_ichk (dest, src, len)) 137static inline __attribute__((__always_inline__)) char * 138__strncpy_ichk (char *__restrict__ __dest, const char *__restrict__ __src, 139 size_t __len) 140{ 141 return __builtin___strncpy_chk (__dest, __src, __len, __ssp_bos (__dest)); 142} 143 144 145#define strcat(dest, src) \ 146 ((__ssp_bos (dest) != (size_t) -1) \ 147 ? __builtin___strcat_chk (dest, src, __ssp_bos (dest)) \ 148 : __strcat_ichk (dest, src)) 149static inline __attribute__((__always_inline__)) char * 150__strcat_ichk (char *__restrict__ __dest, const char *__restrict__ __src) 151{ 152 return __builtin___strcat_chk (__dest, __src, __ssp_bos (__dest)); 153} 154 155 156#define strncat(dest, src, len) \ 157 ((__ssp_bos (dest) != (size_t) -1) \ 158 ? __builtin___strncat_chk (dest, src, len, __ssp_bos (dest)) \ 159 : __strncat_ichk (dest, src, len)) 160static inline __attribute__((__always_inline__)) char * 161__strncat_ichk (char *__restrict__ __dest, const char *__restrict__ __src, 162 size_t __len) 163{ 164 return __builtin___strncat_chk (__dest, __src, __len, __ssp_bos (__dest)); 165} 166 167#endif /* __SSP_FORTIFY_LEVEL > 0 */ 168#endif /* _SSP_STRING_H */ 169