#ifndef os # define os(ptr) __builtin_object_size (ptr, 0) #endif /* This is one of the alternatives for object size checking. If dst has side-effects, size checking will never be done. */ #undef memcpy #define memcpy(dst, src, len) \ __builtin___memcpy_chk (dst, src, len, os (dst)) #undef mempcpy #define mempcpy(dst, src, len) \ __builtin___mempcpy_chk (dst, src, len, os (dst)) #undef memmove #define memmove(dst, src, len) \ __builtin___memmove_chk (dst, src, len, os (dst)) #undef memset #define memset(dst, val, len) \ __builtin___memset_chk (dst, val, len, os (dst)) #undef strcpy #define strcpy(dst, src) \ __builtin___strcpy_chk (dst, src, os (dst)) #undef stpcpy #define stpcpy(dst, src) \ __builtin___stpcpy_chk (dst, src, os (dst)) #undef strcat #define strcat(dst, src) \ __builtin___strcat_chk (dst, src, os (dst)) #undef strncpy #define strncpy(dst, src, len) \ __builtin___strncpy_chk (dst, src, len, os (dst)) #undef stpncpy #define stpncpy(dst, src, len) \ __builtin___stpncpy_chk (dst, src, len, os (dst)) #undef strncat #define strncat(dst, src, len) \ __builtin___strncat_chk (dst, src, len, os (dst)) #undef sprintf #define sprintf(dst, ...) \ __builtin___sprintf_chk (dst, 0, os (dst), __VA_ARGS__) #undef vsprintf #define vsprintf(dst, fmt, ap) \ __builtin___vsprintf_chk (dst, 0, os (dst), fmt, ap) #undef snprintf #define snprintf(dst, len, ...) \ __builtin___snprintf_chk (dst, len, 0, os (dst), __VA_ARGS__) #undef vsnprintf #define vsnprintf(dst, len, fmt, ap) \ __builtin___vsnprintf_chk (dst, len, 0, os (dst), fmt, ap) /* Now "redefine" even builtins for the purpose of testing. */ #undef __builtin_memcpy #define __builtin_memcpy(dst, src, len) memcpy (dst, src, len) #undef __builtin_mempcpy #define __builtin_mempcpy(dst, src, len) mempcpy (dst, src, len) #undef __builtin_memmove #define __builtin_memmove(dst, src, len) memmove (dst, src, len) #undef __builtin_memset #define __builtin_memset(dst, val, len) memset (dst, val, len) #undef __builtin_strcpy #define __builtin_strcpy(dst, src) strcpy (dst, src) #undef __builtin_stpcpy #define __builtin_stpcpy(dst, src) stpcpy (dst, src) #undef __builtin_strcat #define __builtin_strcat(dst, src) strcat (dst, src) #undef __builtin_strncpy #define __builtin_strncpy(dst, src, len) strncpy (dst, src, len) #undef __builtin_strncat #define __builtin_strncat(dst, src, len) strncat (dst, src, len) #undef __builtin_sprintf #define __builtin_sprintf(dst, ...) sprintf (dst, __VA_ARGS__) #undef __builtin_vsprintf #define __builtin_vsprintf(dst, fmt, ap) vsprintf (dst, fmt, ap) #undef __builtin_snprintf #define __builtin_snprintf(dst, len, ...) snprintf (dst, len, __VA_ARGS__) #undef __builtin_vsnprintf #define __builtin_vsnprintf(dst, len, fmt, ap) vsnprintf (dst, len, fmt, ap) extern void *chk_fail_buf[]; extern volatile int chk_fail_allowed, chk_calls; extern volatile int memcpy_disallowed, mempcpy_disallowed, memmove_disallowed; extern volatile int memset_disallowed, strcpy_disallowed, stpcpy_disallowed; extern volatile int strncpy_disallowed, stpncpy_disallowed, strcat_disallowed; extern volatile int strncat_disallowed, sprintf_disallowed, vsprintf_disallowed; extern volatile int snprintf_disallowed, vsnprintf_disallowed; /* A storage class that ensures that declarations bind locally. We want to test non-static declarations where we know it is safe to do so. */ #if __PIC__ && !__PIE__ #define LOCAL static #else #define LOCAL #endif