1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

* 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.
This commit is contained in:
Ulrich Drepper
2007-09-15 02:38:04 +00:00
parent b53eef9c02
commit de1c3ebb59
41 changed files with 499 additions and 118 deletions

104
ChangeLog
View File

@ -1,3 +1,107 @@
2007-09-07 Jakub Jelinek <jakub@redhat.com>
* 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.
2007-09-13 Ulrich Drepper <drepper@redhat.com> 2007-09-13 Ulrich Drepper <drepper@redhat.com>
* po/cs.po: Update from translation team. * po/cs.po: Update from translation team.

View File

@ -79,15 +79,37 @@ CFLAGS-recvfrom_chk.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-tst-chk1.c = -Wno-format CFLAGS-tst-chk1.c = -Wno-format
CFLAGS-tst-chk2.c = -Wno-format CFLAGS-tst-chk2.c = -Wno-format
CFLAGS-tst-chk3.c = -Wno-format CFLAGS-tst-chk3.c = -Wno-format
CFLAGS-tst-chk4.cc = -Wno-format
CFLAGS-tst-chk5.cc = -Wno-format
CFLAGS-tst-chk6.cc = -Wno-format
CFLAGS-tst-lfschk1.c = -Wno-format
CFLAGS-tst-lfschk2.c = -Wno-format
CFLAGS-tst-lfschk3.c = -Wno-format
CFLAGS-tst-lfschk4.cc = -Wno-format
CFLAGS-tst-lfschk5.cc = -Wno-format
CFLAGS-tst-lfschk6.cc = -Wno-format
tst-chk1-ENV = LOCPATH=$(common-objpfx)localedata tst-chk1-ENV = LOCPATH=$(common-objpfx)localedata
tst-chk2-ENV = LOCPATH=$(common-objpfx)localedata tst-chk2-ENV = LOCPATH=$(common-objpfx)localedata
tst-chk3-ENV = LOCPATH=$(common-objpfx)localedata tst-chk3-ENV = LOCPATH=$(common-objpfx)localedata
tst-chk4-ENV = LOCPATH=$(common-objpfx)localedata
tst-chk5-ENV = LOCPATH=$(common-objpfx)localedata
tst-chk6-ENV = LOCPATH=$(common-objpfx)localedata
tst-lfschk1-ENV = LOCPATH=$(common-objpfx)localedata tst-lfschk1-ENV = LOCPATH=$(common-objpfx)localedata
tst-lfschk2-ENV = LOCPATH=$(common-objpfx)localedata tst-lfschk2-ENV = LOCPATH=$(common-objpfx)localedata
tst-lfschk3-ENV = LOCPATH=$(common-objpfx)localedata tst-lfschk3-ENV = LOCPATH=$(common-objpfx)localedata
tst-lfschk4-ENV = LOCPATH=$(common-objpfx)localedata
tst-lfschk5-ENV = LOCPATH=$(common-objpfx)localedata
tst-lfschk6-ENV = LOCPATH=$(common-objpfx)localedata
LDFLAGS-tst-chk4 = -lstdc++
LDFLAGS-tst-chk5 = -lstdc++
LDFLAGS-tst-chk6 = -lstdc++
LDFLAGS-tst-lfschk4 = -lstdc++
LDFLAGS-tst-lfschk5 = -lstdc++
LDFLAGS-tst-lfschk6 = -lstdc++
tests = backtrace-tst tst-chk1 tst-chk2 tst-chk3 \ tests = backtrace-tst tst-chk1 tst-chk2 tst-chk3 \
tst-lfschk1 tst-lfschk2 tst-lfschk3 test-strcpy_chk test-stpcpy_chk tst-lfschk1 tst-lfschk2 tst-lfschk3 test-strcpy_chk test-stpcpy_chk \
tst-chk4 tst-chk5 tst-chk6 tst-lfschk4 tst-lfschk5 tst-lfschk6
extra-libs = libSegFault libpcprofile extra-libs = libSegFault libpcprofile
extra-libs-others = $(extra-libs) extra-libs-others = $(extra-libs)

View File

@ -49,7 +49,7 @@ do_prepare (void)
} }
const char *strs = "abcdefgh\nABCDEFGHI\nabcdefghij\nABCDEFGHIJ"; const char *strs = "abcdefgh\nABCDEFGHI\nabcdefghij\nABCDEFGHIJ";
if (write (temp_fd, strs, strlen (strs)) != strlen (strs)) if ((size_t) write (temp_fd, strs, strlen (strs)) != strlen (strs))
{ {
puts ("could not write test strings into file"); puts ("could not write test strings into file");
unlink (temp_filename); unlink (temp_filename);
@ -102,7 +102,7 @@ int num2 = 987654;
chk_fail_ok = 0; \ chk_fail_ok = 0; \
FAIL (); \ FAIL (); \
} }
#if __USE_FORTIFY_LEVEL >= 2 #if __USE_FORTIFY_LEVEL >= 2 && (!defined __cplusplus || defined __va_arg_pack)
#define CHK_FAIL2_START CHK_FAIL_START #define CHK_FAIL2_START CHK_FAIL_START
#define CHK_FAIL2_END CHK_FAIL_END #define CHK_FAIL2_END CHK_FAIL_END
#else #else
@ -142,6 +142,12 @@ do_test (void)
#endif #endif
); );
#if defined __USE_FORTIFY_LEVEL && !defined __extern_always_inline
printf ("Test skipped");
if (l0 == 0)
return 0;
#endif
/* These ops can be done without runtime checking of object size. */ /* These ops can be done without runtime checking of object size. */
memcpy (buf, "abcdefghij", 10); memcpy (buf, "abcdefghij", 10);
memmove (buf + 1, buf, 9); memmove (buf + 1, buf, 9);
@ -280,7 +286,7 @@ do_test (void)
CHK_FAIL_END CHK_FAIL_END
CHK_FAIL_START CHK_FAIL_START
p = mempcpy (buf + 6, "abcde", l0 + 5); p = (char *) mempcpy (buf + 6, "abcde", l0 + 5);
CHK_FAIL_END CHK_FAIL_END
CHK_FAIL_START CHK_FAIL_START
@ -303,6 +309,7 @@ do_test (void)
stpncpy (buf + 6, "cd", l0 + 5); stpncpy (buf + 6, "cd", l0 + 5);
CHK_FAIL_END CHK_FAIL_END
# if !defined __cplusplus || defined __va_arg_pack
CHK_FAIL_START CHK_FAIL_START
sprintf (buf + 8, "%d", num1); sprintf (buf + 8, "%d", num1);
CHK_FAIL_END CHK_FAIL_END
@ -310,6 +317,7 @@ do_test (void)
CHK_FAIL_START CHK_FAIL_START
snprintf (buf + 8, l0 + 3, "%d", num2); snprintf (buf + 8, l0 + 3, "%d", num2);
CHK_FAIL_END CHK_FAIL_END
# endif
memcpy (buf, str1 + 2, l0 + 9); memcpy (buf, str1 + 2, l0 + 9);
CHK_FAIL_START CHK_FAIL_START
@ -330,7 +338,7 @@ do_test (void)
CHK_FAIL_END CHK_FAIL_END
CHK_FAIL_START CHK_FAIL_START
p = mempcpy (a.buf1 + 6, "abcde", l0 + 5); p = (char *) mempcpy (a.buf1 + 6, "abcde", l0 + 5);
CHK_FAIL_END CHK_FAIL_END
CHK_FAIL_START CHK_FAIL_START
@ -355,6 +363,7 @@ do_test (void)
strncpy (a.buf1 + (O + 6), "X", l0 + 4); strncpy (a.buf1 + (O + 6), "X", l0 + 4);
CHK_FAIL_END CHK_FAIL_END
# if !defined __cplusplus || defined __va_arg_pack
CHK_FAIL_START CHK_FAIL_START
sprintf (a.buf1 + (O + 7), "%d", num1); sprintf (a.buf1 + (O + 7), "%d", num1);
CHK_FAIL_END CHK_FAIL_END
@ -362,6 +371,7 @@ do_test (void)
CHK_FAIL_START CHK_FAIL_START
snprintf (a.buf1 + (O + 7), l0 + 3, "%d", num2); snprintf (a.buf1 + (O + 7), l0 + 3, "%d", num2);
CHK_FAIL_END CHK_FAIL_END
# endif
memcpy (a.buf1, str1 + (3 - O), l0 + 8 + O); memcpy (a.buf1, str1 + (3 - O), l0 + 8 + O);
CHK_FAIL_START CHK_FAIL_START
@ -919,7 +929,8 @@ do_test (void)
else else
{ {
const char *sendstr = "abcdefgh\nABCDEFGH\n0123456789\n"; const char *sendstr = "abcdefgh\nABCDEFGH\n0123456789\n";
if (send (sp[0], sendstr, strlen (sendstr), 0) != strlen (sendstr)) if ((size_t) send (sp[0], sendstr, strlen (sendstr), 0)
!= strlen (sendstr))
FAIL (); FAIL ();
char recvbuf[12]; char recvbuf[12];
@ -951,29 +962,30 @@ do_test (void)
struct sockaddr_un sa_un; struct sockaddr_un sa_un;
sl = sizeof (sa_un); sl = sizeof (sa_un);
if (recvfrom (sp[1], recvbuf, sizeof recvbuf, MSG_PEEK, &sa_un, &sl) if (recvfrom (sp[1], recvbuf, sizeof recvbuf, MSG_PEEK,
(struct sockaddr *) &sa_un, &sl)
!= sizeof recvbuf != sizeof recvbuf
|| memcmp (recvbuf, sendstr, sizeof recvbuf) != 0) || memcmp (recvbuf, sendstr, sizeof recvbuf) != 0)
FAIL (); FAIL ();
sl = sizeof (sa_un); sl = sizeof (sa_un);
if (recvfrom (sp[1], recvbuf + 6, l0 + sizeof recvbuf - 7, MSG_PEEK, if (recvfrom (sp[1], recvbuf + 6, l0 + sizeof recvbuf - 7, MSG_PEEK,
&sa_un, &sl) != sizeof recvbuf - 7 (struct sockaddr *) &sa_un, &sl) != sizeof recvbuf - 7
|| memcmp (recvbuf + 6, sendstr, sizeof recvbuf - 7) != 0) || memcmp (recvbuf + 6, sendstr, sizeof recvbuf - 7) != 0)
FAIL (); FAIL ();
#if __USE_FORTIFY_LEVEL >= 1 #if __USE_FORTIFY_LEVEL >= 1
CHK_FAIL_START CHK_FAIL_START
sl = sizeof (sa_un); sl = sizeof (sa_un);
if (recvfrom (sp[1], recvbuf + 1, sizeof recvbuf, MSG_PEEK, &sa_un, &sl) if (recvfrom (sp[1], recvbuf + 1, sizeof recvbuf, MSG_PEEK,
!= sizeof recvbuf) (struct sockaddr *) &sa_un, &sl) != sizeof recvbuf)
FAIL (); FAIL ();
CHK_FAIL_END CHK_FAIL_END
CHK_FAIL_START CHK_FAIL_START
sl = sizeof (sa_un); sl = sizeof (sa_un);
if (recvfrom (sp[1], recvbuf + 4, l0 + sizeof recvbuf - 3, MSG_PEEK, if (recvfrom (sp[1], recvbuf + 4, l0 + sizeof recvbuf - 3, MSG_PEEK,
&sa_un, &sl) != sizeof recvbuf - 3) (struct sockaddr *) &sa_un, &sl) != sizeof recvbuf - 3)
FAIL (); FAIL ();
CHK_FAIL_END CHK_FAIL_END
#endif #endif

1
debug/tst-chk4.cc Normal file
View File

@ -0,0 +1 @@
#include "tst-chk1.c"

2
debug/tst-chk5.cc Normal file
View File

@ -0,0 +1,2 @@
#define _FORTIFY_SOURCE 1
#include "tst-chk1.c"

2
debug/tst-chk6.cc Normal file
View File

@ -0,0 +1,2 @@
#define _FORTIFY_SOURCE 2
#include "tst-chk1.c"

2
debug/tst-lfschk4.cc Normal file
View File

@ -0,0 +1,2 @@
#define _FILE_OFFSET_BITS 64
#include "tst-chk1.c"

2
debug/tst-lfschk5.cc Normal file
View File

@ -0,0 +1,2 @@
#define _FILE_OFFSET_BITS 64
#include "tst-chk2.c"

2
debug/tst-lfschk6.cc Normal file
View File

@ -0,0 +1,2 @@
#define _FILE_OFFSET_BITS 64
#include "tst-chk3.c"

View File

@ -341,7 +341,8 @@
/* Decide whether we can define 'extern inline' functions in headers. */ /* Decide whether we can define 'extern inline' functions in headers. */
#if __GNUC_PREREQ (2, 7) && defined __OPTIMIZE__ \ #if __GNUC_PREREQ (2, 7) && defined __OPTIMIZE__ \
&& !defined __OPTIMIZE_SIZE__ && !defined __NO_INLINE__ && !defined __OPTIMIZE_SIZE__ && !defined __NO_INLINE__ \
&& defined __extern_inline
# define __USE_EXTERN_INLINES 1 # define __USE_EXTERN_INLINES 1
#endif #endif

View File

@ -27,6 +27,7 @@ extern int __vsscanf (__const char *__restrict __s,
_G_va_list __arg) _G_va_list __arg)
__attribute__ ((__format__ (__scanf__, 2, 0))); __attribute__ ((__format__ (__scanf__, 2, 0)));
#ifndef __cplusplus
extern int __sprintf_chk (char *, int, size_t, const char *, ...) __THROW; extern int __sprintf_chk (char *, int, size_t, const char *, ...) __THROW;
extern int __snprintf_chk (char *, size_t, int, size_t, const char *, ...) extern int __snprintf_chk (char *, size_t, int, size_t, const char *, ...)
__THROW; __THROW;
@ -40,6 +41,7 @@ extern int __vprintf_chk (int, const char *, _G_va_list);
extern int __vfprintf_chk (FILE *, int, const char *, _G_va_list); extern int __vfprintf_chk (FILE *, int, const char *, _G_va_list);
extern char *__fgets_unlocked_chk (char *buf, size_t size, int n, FILE *fp); extern char *__fgets_unlocked_chk (char *buf, size_t size, int n, FILE *fp);
extern char *__fgets_chk (char *buf, size_t size, int n, FILE *fp); extern char *__fgets_chk (char *buf, size_t size, int n, FILE *fp);
#endif
/* Prototypes for compatibility functions. */ /* Prototypes for compatibility functions. */
extern FILE *__new_tmpfile (void); extern FILE *__new_tmpfile (void);

View File

@ -152,6 +152,7 @@ extern int __vfwprintf (__FILE *__restrict __s,
__const wchar_t *__restrict __format, __const wchar_t *__restrict __format,
__gnuc_va_list __arg) __gnuc_va_list __arg)
/* __attribute__ ((__format__ (__wprintf__, 2, 0))) */; /* __attribute__ ((__format__ (__wprintf__, 2, 0))) */;
#ifndef __cplusplus
extern int __vfwprintf_chk (FILE *__restrict __s, int __flag, extern int __vfwprintf_chk (FILE *__restrict __s, int __flag,
const wchar_t *__restrict __format, const wchar_t *__restrict __format,
__gnuc_va_list __arg) __gnuc_va_list __arg)
@ -163,6 +164,7 @@ extern int __vswprintf_chk (wchar_t *__restrict __s, size_t __n,
/* __attribute__ ((__format__ (__wprintf__, 5, 0))) */; /* __attribute__ ((__format__ (__wprintf__, 5, 0))) */;
libc_hidden_proto (__vfwprintf_chk) libc_hidden_proto (__vfwprintf_chk)
libc_hidden_proto (__vswprintf_chk) libc_hidden_proto (__vswprintf_chk)
#endif
/* Internal functions. */ /* Internal functions. */
extern size_t __mbsrtowcs_l (wchar_t *dst, const char **src, size_t len, extern size_t __mbsrtowcs_l (wchar_t *dst, const char **src, size_t len,

View File

@ -212,7 +212,8 @@ extern int posix_fallocate64 (int __fd, __off64_t __offset, __off64_t __len);
/* Define some macros helping to catch common problems. */ /* Define some macros helping to catch common problems. */
#if __USE_FORTIFY_LEVEL > 0 && !defined __cplusplus #if __USE_FORTIFY_LEVEL > 0 && defined __extern_always_inline \
&& !defined __cplusplus
# include <bits/fcntl2.h> # include <bits/fcntl2.h>
#endif #endif

View File

@ -444,7 +444,7 @@ extern int __xmknodat (int __ver, int __fd, __const char *__path,
__mode_t __mode, __dev_t *__dev) __mode_t __mode, __dev_t *__dev)
__THROW __nonnull ((3, 5)); __THROW __nonnull ((3, 5));
#if defined __GNUC__ && __GNUC__ >= 2 #if defined __GNUC__ && __GNUC__ >= 2 && defined __USE_EXTERN_INLINES
/* Inlined versions of the real stat and mknod functions. */ /* Inlined versions of the real stat and mknod functions. */
__extern_inline int __extern_inline int

View File

@ -1,5 +1,5 @@
/* -mlong-double-64 compatibility mode for stdio functions. /* -mlong-double-64 compatibility mode for stdio functions.
Copyright (C) 2006 Free Software Foundation, Inc. Copyright (C) 2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -58,7 +58,7 @@ __LDBL_REDIR_DECL (obstack_printf)
__LDBL_REDIR_DECL (obstack_vprintf) __LDBL_REDIR_DECL (obstack_vprintf)
#endif #endif
#if __USE_FORTIFY_LEVEL > 0 && !defined __cplusplus #if __USE_FORTIFY_LEVEL > 0 && defined __extern_always_inline
__LDBL_REDIR_DECL (__sprintf_chk) __LDBL_REDIR_DECL (__sprintf_chk)
__LDBL_REDIR_DECL (__vsprintf_chk) __LDBL_REDIR_DECL (__vsprintf_chk)
# if defined __USE_BSD || defined __USE_ISOC99 || defined __USE_UNIX98 # if defined __USE_BSD || defined __USE_ISOC99 || defined __USE_UNIX98

View File

@ -21,7 +21,7 @@
# error "Never include <bits/stdio.h> directly; use <stdio.h> instead." # error "Never include <bits/stdio.h> directly; use <stdio.h> instead."
#endif #endif
#ifdef __cplusplus #ifndef __extern_inline
# define __STDIO_INLINE inline # define __STDIO_INLINE inline
#else #else
# define __STDIO_INLINE __extern_inline # define __STDIO_INLINE __extern_inline
@ -29,12 +29,16 @@
#ifdef __USE_EXTERN_INLINES #ifdef __USE_EXTERN_INLINES
/* For -D_FORTIFY_SOURCE{,=2} bits/stdio2.h will define a different
inline. */
# if !(__USE_FORTIFY_LEVEL > 0 && defined __extern_always_inline)
/* Write formatted output to stdout from argument list ARG. */ /* Write formatted output to stdout from argument list ARG. */
__STDIO_INLINE int __STDIO_INLINE int
vprintf (__const char *__restrict __fmt, _G_va_list __arg) vprintf (__const char *__restrict __fmt, _G_va_list __arg)
{ {
return vfprintf (stdout, __fmt, __arg); return vfprintf (stdout, __fmt, __arg);
} }
# endif
/* Read a character from stdin. */ /* Read a character from stdin. */
__STDIO_INLINE int __STDIO_INLINE int
@ -135,7 +139,8 @@ __NTH (ferror_unlocked (FILE *__stream))
#endif /* Use extern inlines. */ #endif /* Use extern inlines. */
#if defined __USE_MISC && defined __GNUC__ && defined __OPTIMIZE__ #if defined __USE_MISC && defined __GNUC__ && defined __OPTIMIZE__ \
&& !defined __cplusplus
/* Perform some simple optimizations. */ /* Perform some simple optimizations. */
# define fread_unlocked(ptr, size, n, stream) \ # define fread_unlocked(ptr, size, n, stream) \
(__extension__ ((__builtin_constant_p (size) && __builtin_constant_p (n) \ (__extension__ ((__builtin_constant_p (size) && __builtin_constant_p (n) \

View File

@ -27,11 +27,26 @@ extern int __vsprintf_chk (char *__restrict __s, int __flag, size_t __slen,
__const char *__restrict __format, __const char *__restrict __format,
_G_va_list __ap) __THROW; _G_va_list __ap) __THROW;
#ifdef __va_arg_pack
__extern_always_inline int
__NTH (sprintf (char *__restrict __s, __const char *__restrict __fmt, ...))
{
return __builtin___sprintf_chk (__s, __USE_FORTIFY_LEVEL - 1,
__bos (__s), __fmt, __va_arg_pack ());
}
#elif !defined __cplusplus
# define sprintf(str, ...) \ # define sprintf(str, ...) \
__builtin___sprintf_chk (str, __USE_FORTIFY_LEVEL - 1, __bos (str), \ __builtin___sprintf_chk (str, __USE_FORTIFY_LEVEL - 1, __bos (str), \
__VA_ARGS__) __VA_ARGS__)
#define vsprintf(str, fmt, ap) \ #endif
__builtin___vsprintf_chk (str, __USE_FORTIFY_LEVEL - 1, __bos (str), fmt, ap)
__extern_always_inline int
__NTH (vsprintf (char *__restrict __s, __const char *__restrict __fmt,
_G_va_list __ap))
{
return __builtin___vsprintf_chk (__s, __USE_FORTIFY_LEVEL - 1,
__bos (__s), __fmt, __ap);
}
#if defined __USE_BSD || defined __USE_ISOC99 || defined __USE_UNIX98 #if defined __USE_BSD || defined __USE_ISOC99 || defined __USE_UNIX98
@ -42,12 +57,27 @@ extern int __vsnprintf_chk (char *__restrict __s, size_t __n, int __flag,
size_t __slen, __const char *__restrict __format, size_t __slen, __const char *__restrict __format,
_G_va_list __ap) __THROW; _G_va_list __ap) __THROW;
# ifdef __va_arg_pack
__extern_always_inline int
__NTH (snprintf (char *__restrict __s, size_t __n,
__const char *__restrict __fmt, ...))
{
return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
__bos (__s), __fmt, __va_arg_pack ());
}
# elif !defined __cplusplus
# define snprintf(str, len, ...) \ # define snprintf(str, len, ...) \
__builtin___snprintf_chk (str, len, __USE_FORTIFY_LEVEL - 1, __bos (str), \ __builtin___snprintf_chk (str, len, __USE_FORTIFY_LEVEL - 1, __bos (str), \
__VA_ARGS__) __VA_ARGS__)
# define vsnprintf(str, len, fmt, ap) \ # endif
__builtin___vsnprintf_chk (str, len, __USE_FORTIFY_LEVEL - 1, __bos (str), \
fmt, ap) __extern_always_inline int
__NTH (vsnprintf (char *__restrict __s, size_t __n,
__const char *__restrict __fmt, _G_va_list __ap))
{
return __builtin___vsnprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
__bos (__s), __fmt, __ap);
}
#endif #endif
@ -61,14 +91,42 @@ extern int __vfprintf_chk (FILE *__restrict __stream, int __flag,
extern int __vprintf_chk (int __flag, __const char *__restrict __format, extern int __vprintf_chk (int __flag, __const char *__restrict __format,
_G_va_list __ap); _G_va_list __ap);
# ifdef __va_arg_pack
__extern_always_inline int
fprintf (FILE *__restrict __stream, __const char *__restrict __fmt, ...)
{
return __fprintf_chk (__stream, __USE_FORTIFY_LEVEL - 1, __fmt,
__va_arg_pack ());
}
__extern_always_inline int
printf (__const char *__restrict __fmt, ...)
{
return __printf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __va_arg_pack ());
}
# elif !defined __cplusplus
# define printf(...) \ # define printf(...) \
__printf_chk (__USE_FORTIFY_LEVEL - 1, __VA_ARGS__) __printf_chk (__USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
# define fprintf(stream, ...) \ # define fprintf(stream, ...) \
__fprintf_chk (stream, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__) __fprintf_chk (stream, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
# define vprintf(format, ap) \ # endif
__vprintf_chk (__USE_FORTIFY_LEVEL - 1, format, ap)
# define vfprintf(stream, format, ap) \ __extern_always_inline int
__vfprintf_chk (stream, __USE_FORTIFY_LEVEL - 1, format, ap) vprintf (__const char *__restrict __fmt, _G_va_list __ap)
{
#ifdef __USE_EXTERN_INLINES
return __vfprintf_chk (stdout, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
#else
return __vprintf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __ap);
#endif
}
__extern_always_inline int
vfprintf (FILE *__restrict __stream,
__const char *__restrict __fmt, _G_va_list __ap)
{
return __vfprintf_chk (__stream, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
}
#endif #endif

View File

@ -838,7 +838,7 @@ extern void funlockfile (FILE *__stream) __THROW;
#ifdef __USE_EXTERN_INLINES #ifdef __USE_EXTERN_INLINES
# include <bits/stdio.h> # include <bits/stdio.h>
#endif #endif
#if __USE_FORTIFY_LEVEL > 0 && !defined __cplusplus #if __USE_FORTIFY_LEVEL > 0 && defined __extern_always_inline
# include <bits/stdio2.h> # include <bits/stdio2.h>
#endif #endif
#ifdef __LDBL_COMPAT #ifdef __LDBL_COMPAT

View File

@ -132,7 +132,8 @@ __MATHDECL (_Mdouble_,creal, (_Mdouble_complex_ __z));
/* Now some optimized versions. GCC has handy notations for these /* Now some optimized versions. GCC has handy notations for these
functions. Recent GCC handles these as builtin functions so does functions. Recent GCC handles these as builtin functions so does
not need inlines. */ not need inlines. */
#if defined __GNUC__ && !__GNUC_PREREQ (2, 97) && defined __OPTIMIZE__ #if defined __GNUC__ && !__GNUC_PREREQ (2, 97) && defined __OPTIMIZE__ \
&& defined __extern_inline
/* Imaginary part of Z. */ /* Imaginary part of Z. */
__extern_inline _Mdouble_ __extern_inline _Mdouble_

View File

@ -27,7 +27,7 @@ __LDBL_REDIR_DECL (syslog)
__LDBL_REDIR_DECL (vsyslog) __LDBL_REDIR_DECL (vsyslog)
#endif #endif
#if __USE_FORTIFY_LEVEL > 0 && !defined __cplusplus #if __USE_FORTIFY_LEVEL > 0 && defined __extern_always_inline
__LDBL_REDIR_DECL (__syslog_chk) __LDBL_REDIR_DECL (__syslog_chk)
# ifdef __USE_BSD # ifdef __USE_BSD

View File

@ -1,5 +1,5 @@
/* Checking macros for syslog functions. /* Checking macros for syslog functions.
Copyright (C) 2005 Free Software Foundation, Inc. Copyright (C) 2005, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -25,8 +25,16 @@
extern void __syslog_chk (int __pri, int __flag, __const char *__fmt, ...) extern void __syslog_chk (int __pri, int __flag, __const char *__fmt, ...)
__attribute__ ((__format__ (__printf__, 3, 4))); __attribute__ ((__format__ (__printf__, 3, 4)));
#ifdef __va_arg_pack
__extern_always_inline void
syslog (int __pri, int __flag, __const char *__fmt, ...)
{
return __syslog_chk (__pri, __flag, __fmt, __va_arg_pack ());
}
#elif !defined __cplusplus
# define syslog(pri, ...) \ # define syslog(pri, ...) \
__syslog_chk (pri, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__) __syslog_chk (pri, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
#endif
#ifdef __USE_BSD #ifdef __USE_BSD
@ -34,6 +42,9 @@ extern void __vsyslog_chk (int __pri, int __flag, __const char *__fmt,
__gnuc_va_list __ap) __gnuc_va_list __ap)
__attribute__ ((__format__ (__printf__, 3, 0))); __attribute__ ((__format__ (__printf__, 3, 0)));
# define vsyslog(pri, fmt, ap) \ __extern_always_inline void
__vsyslog_chk (pri, __USE_FORTIFY_LEVEL - 1, fmt, ap) vsyslog (int __pri, __const char *__fmt, __gnuc_va_list __ap)
{
return __vsyslog_chk (__pri, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
}
#endif #endif

View File

@ -281,7 +281,8 @@
/* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99 /* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
inline semantics, unless -fgnu89-inline is used. */ inline semantics, unless -fgnu89-inline is used. */
#ifdef __GNUC_STDC_INLINE__ #if !defined __cplusplus || __GNUC_PREREQ (4,3)
# if defined __GNUC_STDC_INLINE__ || defined __cplusplus
# define __extern_inline extern __inline __attribute__ ((__gnu_inline__)) # define __extern_inline extern __inline __attribute__ ((__gnu_inline__))
# define __extern_always_inline \ # define __extern_always_inline \
extern __always_inline __attribute__ ((__gnu_inline__)) extern __always_inline __attribute__ ((__gnu_inline__))
@ -289,6 +290,13 @@
# define __extern_inline extern __inline # define __extern_inline extern __inline
# define __extern_always_inline extern __always_inline # define __extern_always_inline extern __always_inline
# endif # endif
#endif
/* GCC 4.3 and above allow passing all anonymous arguments of an
__extern_always_inline function to some other vararg function. */
#if __GNUC_PREREQ (4,3)
# define __va_arg_pack() __builtin_va_arg_pack ()
#endif
/* It is possible to compile containing GCC extensions even if GCC is /* It is possible to compile containing GCC extensions even if GCC is
run in pedantic mode if the uses are carefully marked using the run in pedantic mode if the uses are carefully marked using the

View File

@ -203,7 +203,7 @@ extern void vsyslog (int __pri, __const char *__fmt, __gnuc_va_list __ap)
/* Define some macros helping to catch buffer overflows. */ /* Define some macros helping to catch buffer overflows. */
#if __USE_FORTIFY_LEVEL > 0 && !defined __cplusplus #if __USE_FORTIFY_LEVEL > 0 && defined __extern_always_inline
# include <bits/syslog.h> # include <bits/syslog.h>
#endif #endif
#ifdef __LDBL_COMPAT #ifdef __LDBL_COMPAT

View File

@ -1096,7 +1096,7 @@ extern char *ctermid (char *__s) __THROW;
/* Define some macros helping to catch buffer overflows. */ /* Define some macros helping to catch buffer overflows. */
#if __USE_FORTIFY_LEVEL > 0 && !defined __cplusplus #if __USE_FORTIFY_LEVEL > 0 && defined __extern_always_inline
# include <bits/unistd.h> # include <bits/unistd.h>
#endif #endif

View File

@ -1,5 +1,6 @@
/* Declarations of socket constants, types, and functions. /* Declarations of socket constants, types, and functions.
Copyright (C) 1991,92,1994-2001,2003,2005 Free Software Foundation, Inc. Copyright (C) 1991,92,1994-2001,2003,2005,2007
Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -233,7 +234,7 @@ extern int isfdtype (int __fd, int __fdtype) __THROW;
/* Define some macros helping to catch buffer overflows. */ /* Define some macros helping to catch buffer overflows. */
#if __USE_FORTIFY_LEVEL > 0 && !defined __cplusplus #if __USE_FORTIFY_LEVEL > 0 && defined __extern_always_inline
# include <bits/socket2.h> # include <bits/socket2.h>
#endif #endif

View File

@ -870,7 +870,7 @@ extern int getloadavg (double __loadavg[], int __nelem)
/* Define some macros helping to catch buffer overflows. */ /* Define some macros helping to catch buffer overflows. */
#if __USE_FORTIFY_LEVEL > 0 && !defined __cplusplus #if __USE_FORTIFY_LEVEL > 0 && defined __extern_always_inline
# include <bits/stdlib.h> # include <bits/stdlib.h>
#endif #endif
#ifdef __LDBL_COMPAT #ifdef __LDBL_COMPAT

View File

@ -20,6 +20,10 @@
# error "Never use <bits/string3.h> directly; include <string.h> instead." # error "Never use <bits/string3.h> directly; include <string.h> instead."
#endif #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 /* XXX This is temporarily. We should not redefine any of the symbols
and instead integrate the error checking into the original and instead integrate the error checking into the original
definitions. */ definitions. */
@ -38,8 +42,17 @@
# undef bcopy # undef bcopy
# undef bzero # undef bzero
# endif # endif
#endif
#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) \ # define memcpy(dest, src, len) \
((__bos0 (dest) != (size_t) -1) \ ((__bos0 (dest) != (size_t) -1) \
? __builtin___memcpy_chk (dest, src, len, __bos0 (dest)) \ ? __builtin___memcpy_chk (dest, src, len, __bos0 (dest)) \
@ -50,8 +63,16 @@ __NTH (__memcpy_ichk (void *__restrict __dest, __const void *__restrict __src,
{ {
return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest)); return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest));
} }
#endif
#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) \ # define memmove(dest, src, len) \
((__bos0 (dest) != (size_t) -1) \ ((__bos0 (dest) != (size_t) -1) \
? __builtin___memmove_chk (dest, src, len, __bos0 (dest)) \ ? __builtin___memmove_chk (dest, src, len, __bos0 (dest)) \
@ -61,9 +82,17 @@ __NTH (__memmove_ichk (void *__dest, __const void *__src, size_t __len))
{ {
return __builtin___memmove_chk (__dest, __src, __len, __bos0 (__dest)); return __builtin___memmove_chk (__dest, __src, __len, __bos0 (__dest));
} }
#endif
#ifdef __USE_GNU #ifdef __USE_GNU
# 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) \ # define mempcpy(dest, src, len) \
((__bos0 (dest) != (size_t) -1) \ ((__bos0 (dest) != (size_t) -1) \
? __builtin___mempcpy_chk (dest, src, len, __bos0 (dest)) \ ? __builtin___mempcpy_chk (dest, src, len, __bos0 (dest)) \
@ -75,6 +104,7 @@ __NTH (__mempcpy_ichk (void *__restrict __dest,
return __builtin___mempcpy_chk (__dest, __src, __len, __bos0 (__dest)); return __builtin___mempcpy_chk (__dest, __src, __len, __bos0 (__dest));
} }
# endif # endif
#endif
/* The first two tests here help to catch a somewhat common problem /* The first two tests here help to catch a somewhat common problem
@ -82,8 +112,18 @@ __NTH (__mempcpy_ichk (void *__restrict __dest,
especially problematic if the intended fill value is zero. In this especially problematic if the intended fill value is zero. In this
case no work is done at all. We detect these problems by referring case no work is done at all. We detect these problems by referring
non-existing functions. */ non-existing functions. */
__warndecl (__warn_memset_zero_len, #ifdef __cplusplus
"memset used with constant zero length parameter; this could be due to transposed parameters"); __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) \ # define memset(dest, ch, len) \
(__builtin_constant_p (len) && (len) == 0 \ (__builtin_constant_p (len) && (len) == 0 \
? (__warn_memset_zero_len (), (void) (ch), (void) (len), (void *) (dest)) \ ? (__warn_memset_zero_len (), (void) (ch), (void) (len), (void *) (dest)) \
@ -95,8 +135,22 @@ __NTH (__memset_ichk (void *__dest, int __ch, size_t __len))
{ {
return __builtin___memset_chk (__dest, __ch, __len, __bos0 (__dest)); return __builtin___memset_chk (__dest, __ch, __len, __bos0 (__dest));
} }
#endif
#ifdef __USE_BSD #ifdef __USE_BSD
# 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) \ # define bcopy(src, dest, len) ((void) \
((__bos0 (dest) != (size_t) -1) \ ((__bos0 (dest) != (size_t) -1) \
? __builtin___memmove_chk (dest, src, len, __bos0 (dest)) \ ? __builtin___memmove_chk (dest, src, len, __bos0 (dest)) \
@ -106,8 +160,15 @@ __NTH (__memset_ichk (void *__dest, int __ch, size_t __len))
? __builtin___memset_chk (dest, '\0', len, __bos0 (dest)) \ ? __builtin___memset_chk (dest, '\0', len, __bos0 (dest)) \
: __memset_ichk (dest, '\0', len))) : __memset_ichk (dest, '\0', len)))
# endif # endif
#endif
#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) \ # define strcpy(dest, src) \
((__bos (dest) != (size_t) -1) \ ((__bos (dest) != (size_t) -1) \
? __builtin___strcpy_chk (dest, src, __bos (dest)) \ ? __builtin___strcpy_chk (dest, src, __bos (dest)) \
@ -117,9 +178,16 @@ __NTH (__strcpy_ichk (char *__restrict __dest, __const char *__restrict __src))
{ {
return __builtin___strcpy_chk (__dest, __src, __bos (__dest)); return __builtin___strcpy_chk (__dest, __src, __bos (__dest));
} }
#endif
#ifdef __USE_GNU #ifdef __USE_GNU
# 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) \ # define stpcpy(dest, src) \
((__bos (dest) != (size_t) -1) \ ((__bos (dest) != (size_t) -1) \
? __builtin___stpcpy_chk (dest, src, __bos (dest)) \ ? __builtin___stpcpy_chk (dest, src, __bos (dest)) \
@ -130,8 +198,17 @@ __NTH (__stpcpy_ichk (char *__restrict __dest, __const char *__restrict __src))
return __builtin___stpcpy_chk (__dest, __src, __bos (__dest)); return __builtin___stpcpy_chk (__dest, __src, __bos (__dest));
} }
# endif # endif
#endif
#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) \ # define strncpy(dest, src, len) \
((__bos (dest) != (size_t) -1) \ ((__bos (dest) != (size_t) -1) \
? __builtin___strncpy_chk (dest, src, len, __bos (dest)) \ ? __builtin___strncpy_chk (dest, src, len, __bos (dest)) \
@ -142,7 +219,7 @@ __NTH (__strncpy_ichk (char *__restrict __dest, __const char *__restrict __src,
{ {
return __builtin___strncpy_chk (__dest, __src, __len, __bos (__dest)); return __builtin___strncpy_chk (__dest, __src, __len, __bos (__dest));
} }
#endif
// XXX We have no corresponding builtin yet. // XXX We have no corresponding builtin yet.
extern char *__stpncpy_chk (char *__dest, __const char *__src, size_t __n, extern char *__stpncpy_chk (char *__dest, __const char *__src, size_t __n,
@ -161,6 +238,13 @@ __NTH (stpncpy (char *__dest, __const char *__src, size_t __n))
} }
#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) \ # define strcat(dest, src) \
((__bos (dest) != (size_t) -1) \ ((__bos (dest) != (size_t) -1) \
? __builtin___strcat_chk (dest, src, __bos (dest)) \ ? __builtin___strcat_chk (dest, src, __bos (dest)) \
@ -170,8 +254,17 @@ __NTH (__strcat_ichk (char *__restrict __dest, __const char *__restrict __src))
{ {
return __builtin___strcat_chk (__dest, __src, __bos (__dest)); return __builtin___strcat_chk (__dest, __src, __bos (__dest));
} }
#endif
#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) \ # define strncat(dest, src, len) \
((__bos (dest) != (size_t) -1) \ ((__bos (dest) != (size_t) -1) \
? __builtin___strncat_chk (dest, src, len, __bos (dest)) \ ? __builtin___strncat_chk (dest, src, len, __bos (dest)) \
@ -182,3 +275,4 @@ __NTH (__strncat_ichk (char *__restrict __dest, __const char *__restrict __src,
{ {
return __builtin___strncat_chk (__dest, __src, __len, __bos (__dest)); return __builtin___strncat_chk (__dest, __src, __len, __bos (__dest));
} }
#endif

View File

@ -423,7 +423,7 @@ extern char *basename (__const char *__filename) __THROW __nonnull ((1));
# include <bits/string2.h> # include <bits/string2.h>
# endif # endif
# if __USE_FORTIFY_LEVEL > 0 && !defined __cplusplus # if __USE_FORTIFY_LEVEL > 0 && defined __extern_always_inline
/* Functions with security checks. */ /* Functions with security checks. */
# include <bits/string3.h> # include <bits/string3.h>
# endif # endif

View File

@ -23,7 +23,7 @@
# error "Never use <bits/mathinline.h> directly; include <math.h> instead." # error "Never use <bits/mathinline.h> directly; include <math.h> instead."
#endif #endif
#ifdef __cplusplus #ifndef __extern_inline
# define __MATH_INLINE __inline # define __MATH_INLINE __inline
#else #else
# define __MATH_INLINE __extern_inline # define __MATH_INLINE __extern_inline

View File

@ -23,7 +23,7 @@
# error "Never use <bits/mathinline.h> directly; include <math.h> instead." # error "Never use <bits/mathinline.h> directly; include <math.h> instead."
#endif #endif
#ifdef __cplusplus #ifndef __extern_inline
# define __MATH_INLINE __inline # define __MATH_INLINE __inline
#else #else
# define __MATH_INLINE __extern_inline # define __MATH_INLINE __extern_inline

View File

@ -32,7 +32,7 @@
&& defined __GNUC__ && __GNUC__ >= 2 && !__BOUNDED_POINTERS__ && defined __GNUC__ && __GNUC__ >= 2 && !__BOUNDED_POINTERS__
#ifndef __STRING_INLINE #ifndef __STRING_INLINE
# ifdef __cplusplus # ifndef __extern_inline
# define __STRING_INLINE inline # define __STRING_INLINE inline
# else # else
# define __STRING_INLINE __extern_inline # define __STRING_INLINE __extern_inline

View File

@ -21,7 +21,7 @@
# error "Never use <bits/mathinline.h> directly; include <math.h> instead." # error "Never use <bits/mathinline.h> directly; include <math.h> instead."
#endif #endif
#ifdef __cplusplus #ifndef __extern_inline
# define __MATH_INLINE __inline # define __MATH_INLINE __inline
#else #else
# define __MATH_INLINE __extern_inline # define __MATH_INLINE __extern_inline

View File

@ -22,7 +22,7 @@
# error "Never use <bits/mathinline.h> directly; include <math.h> instead." # error "Never use <bits/mathinline.h> directly; include <math.h> instead."
#endif #endif
#ifdef __cplusplus #ifndef __extern_inline
# define __MATH_INLINE __inline # define __MATH_INLINE __inline
#else #else
# define __MATH_INLINE __extern_inline # define __MATH_INLINE __extern_inline

View File

@ -31,7 +31,7 @@
&& defined __GNUC__ && __GNUC__ >= 2 && defined __GNUC__ && __GNUC__ >= 2
#ifndef __STRING_INLINE #ifndef __STRING_INLINE
# ifdef __cplusplus # ifndef __extern_inline
# define __STRING_INLINE inline # define __STRING_INLINE inline
# else # else
# define __STRING_INLINE __extern_inline # define __STRING_INLINE __extern_inline

View File

@ -21,7 +21,7 @@
# error "Never use <bits/mathinline.h> directly; include <math.h> instead." # error "Never use <bits/mathinline.h> directly; include <math.h> instead."
#endif #endif
#ifdef __cplusplus #ifndef __extern_inline
# define __MATH_INLINE __inline # define __MATH_INLINE __inline
#else #else
# define __MATH_INLINE __extern_inline # define __MATH_INLINE __extern_inline

View File

@ -128,7 +128,7 @@
#if (!defined __NO_MATH_INLINES || defined __LIBC_INTERNAL_MATH_INLINES) && defined __OPTIMIZE__ #if (!defined __NO_MATH_INLINES || defined __LIBC_INTERNAL_MATH_INLINES) && defined __OPTIMIZE__
# ifdef __cplusplus # ifndef __extern_inline
# define __MATH_INLINE __inline # define __MATH_INLINE __inline
# else # else
# define __MATH_INLINE __extern_inline # define __MATH_INLINE __extern_inline

View File

@ -28,17 +28,17 @@
they need. */ they need. */
#ifdef __GLIBC_HAVE_LONG_LONG #ifdef __GLIBC_HAVE_LONG_LONG
__extension__ __extension__
__extern_inline unsigned int gnu_dev_major (unsigned long long int __dev) extern unsigned int gnu_dev_major (unsigned long long int __dev)
__THROW; __THROW;
__extension__ __extension__
__extern_inline unsigned int gnu_dev_minor (unsigned long long int __dev) extern unsigned int gnu_dev_minor (unsigned long long int __dev)
__THROW; __THROW;
__extension__ __extension__
__extern_inline unsigned long long int gnu_dev_makedev (unsigned int __major, extern unsigned long long int gnu_dev_makedev (unsigned int __major,
unsigned int __minor) unsigned int __minor)
__THROW; __THROW;
# if defined __GNUC__ && __GNUC__ >= 2 # if defined __GNUC__ && __GNUC__ >= 2 && defined __USE_EXTERN_INLINES
__extension__ __extern_inline unsigned int __extension__ __extern_inline unsigned int
__NTH (gnu_dev_major (unsigned long long int __dev)) __NTH (gnu_dev_major (unsigned long long int __dev))
{ {

View File

@ -22,7 +22,7 @@
# error "Never use <bits/mathinline.h> directly; include <math.h> instead." # error "Never use <bits/mathinline.h> directly; include <math.h> instead."
#endif #endif
#ifdef __cplusplus #ifndef __extern_inline
# define __MATH_INLINE __inline # define __MATH_INLINE __inline
#else #else
# define __MATH_INLINE __extern_inline # define __MATH_INLINE __extern_inline

View File

@ -48,7 +48,7 @@ __END_NAMESPACE_C99
__LDBL_REDIR1_DECL (wcstold_l, wcstod_l); __LDBL_REDIR1_DECL (wcstold_l, wcstod_l);
#endif #endif
#if __USE_FORTIFY_LEVEL > 0 && !defined __cplusplus #if __USE_FORTIFY_LEVEL > 0 && defined __extern_always_inline
__LDBL_REDIR_DECL (__swprintf_chk) __LDBL_REDIR_DECL (__swprintf_chk)
__LDBL_REDIR_DECL (__vswprintf_chk) __LDBL_REDIR_DECL (__vswprintf_chk)
# if __USE_FORTIFY_LEVEL > 1 # if __USE_FORTIFY_LEVEL > 1

View File

@ -18,7 +18,7 @@
02111-1307 USA. */ 02111-1307 USA. */
#ifndef _WCHAR_H #ifndef _WCHAR_H
# error "Never include <bits/wchar.h> directly; use <wchar.h> instead." # error "Never include <bits/wchar2.h> directly; use <wchar.h> instead."
#endif #endif
@ -198,12 +198,28 @@ extern int __swprintf_chk (wchar_t *__restrict __s, size_t __n,
__const wchar_t *__restrict __format, ...) __const wchar_t *__restrict __format, ...)
__THROW /* __attribute__ ((__format__ (__wprintf__, 5, 6))) */; __THROW /* __attribute__ ((__format__ (__wprintf__, 5, 6))) */;
extern int __REDIRECT_NTH (__swprintf_alias,
(wchar_t *__restrict __s, size_t __n,
__const wchar_t *__restrict __fmt, ...),
swprintf);
#ifdef __va_arg_pack
__extern_always_inline int
__NTH (swprintf (wchar_t *__restrict __s, size_t __n,
__const wchar_t *__restrict __fmt, ...))
{
if (__bos (__s) != (size_t) -1 || __USE_FORTIFY_LEVEL > 1)
return __swprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1, __bos (__s),
__fmt, __va_arg_pack ());
return __swprintf_alias (__s, __n, __fmt, __va_arg_pack ());
}
#elif !defined __cplusplus
/* XXX We might want to have support in gcc for swprintf. */ /* XXX We might want to have support in gcc for swprintf. */
# define swprintf(s, n, ...) \ # define swprintf(s, n, ...) \
(__bos (s) != (size_t) -1 || __USE_FORTIFY_LEVEL > 1 \ (__bos (s) != (size_t) -1 || __USE_FORTIFY_LEVEL > 1 \
? __swprintf_chk (s, n, __USE_FORTIFY_LEVEL - 1, __bos (s), __VA_ARGS__) \ ? __swprintf_chk (s, n, __USE_FORTIFY_LEVEL - 1, __bos (s), __VA_ARGS__) \
: swprintf (s, n, __VA_ARGS__)) : swprintf (s, n, __VA_ARGS__))
#endif
extern int __vswprintf_chk (wchar_t *__restrict __s, size_t __n, extern int __vswprintf_chk (wchar_t *__restrict __s, size_t __n,
int __flag, size_t __s_len, int __flag, size_t __s_len,
@ -211,10 +227,20 @@ extern int __vswprintf_chk (wchar_t *__restrict __s, size_t __n,
__gnuc_va_list __arg) __gnuc_va_list __arg)
__THROW /* __attribute__ ((__format__ (__wprintf__, 5, 0))) */; __THROW /* __attribute__ ((__format__ (__wprintf__, 5, 0))) */;
#define vswprintf(s, n, fmt, ap) \ extern int __REDIRECT_NTH (__vswprintf_alias,
(__bos (s) != (size_t) -1 || __USE_FORTIFY_LEVEL > 1 \ (wchar_t *__restrict __s, size_t __n,
? __vswprintf_chk (s, n, __USE_FORTIFY_LEVEL - 1, __bos (s), fmt, ap) \ __const wchar_t *__restrict __fmt,
: vswprintf (s, n, fmt, ap)) __gnuc_va_list __ap), vswprintf);
__extern_always_inline int
__NTH (vswprintf (wchar_t *__restrict __s, size_t __n,
__const wchar_t *__restrict __fmt, __gnuc_va_list __ap))
{
if (__bos (__s) != (size_t) -1 || __USE_FORTIFY_LEVEL > 1)
return __vswprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1, __bos (__s),
__fmt, __ap);
return __vswprintf_alias (__s, __n, __fmt, __ap);
}
#if __USE_FORTIFY_LEVEL > 1 #if __USE_FORTIFY_LEVEL > 1
@ -229,14 +255,38 @@ extern int __vfwprintf_chk (__FILE *__restrict __stream, int __flag,
extern int __vwprintf_chk (int __flag, __const wchar_t *__restrict __format, extern int __vwprintf_chk (int __flag, __const wchar_t *__restrict __format,
__gnuc_va_list __ap); __gnuc_va_list __ap);
# ifdef __va_arg_pack
__extern_always_inline int
wprintf (__const wchar_t *__restrict __fmt, ...)
{
return __wprintf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __va_arg_pack ());
}
__extern_always_inline int
fwprintf (__FILE *__restrict __stream, __const wchar_t *__restrict __fmt, ...)
{
return __fwprintf_chk (__stream, __USE_FORTIFY_LEVEL - 1, __fmt,
__va_arg_pack ());
}
# elif !defined __cplusplus
# define wprintf(...) \ # define wprintf(...) \
__wprintf_chk (__USE_FORTIFY_LEVEL - 1, __VA_ARGS__) __wprintf_chk (__USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
# define fwprintf(stream, ...) \ # define fwprintf(stream, ...) \
__fwprintf_chk (stream, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__) __fwprintf_chk (stream, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
# define vwprintf(format, ap) \ # endif
__vwprintf_chk (__USE_FORTIFY_LEVEL - 1, format, ap)
# define vfwprintf(stream, format, ap) \ __extern_always_inline int
__vfwprintf_chk (stream, __USE_FORTIFY_LEVEL - 1, format, ap) vwprintf (__const wchar_t *__restrict __fmt, __gnuc_va_list __ap)
{
return __vwprintf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __ap);
}
__extern_always_inline int
vfwprintf (__FILE *__restrict __stream,
__const wchar_t *__restrict __fmt, __gnuc_va_list __ap)
{
return __vfwprintf_chk (__stream, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
}
#endif #endif

View File

@ -327,7 +327,6 @@ __END_NAMESPACE_C99
#ifdef __USE_EXTERN_INLINES #ifdef __USE_EXTERN_INLINES
/* Define inline function as optimization. */ /* Define inline function as optimization. */
# ifndef __cplusplus
/* We can use the BTOWC and WCTOB optimizations since we know that all /* We can use the BTOWC and WCTOB optimizations since we know that all
locales must use ASCII encoding for the values in the ASCII range locales must use ASCII encoding for the values in the ASCII range
and because the wchar_t encoding is always ISO 10646. */ and because the wchar_t encoding is always ISO 10646. */
@ -342,7 +341,6 @@ __extern_inline int
__NTH (wctob (wint_t __wc)) __NTH (wctob (wint_t __wc))
{ return (__builtin_constant_p (__wc) && __wc >= L'\0' && __wc <= L'\x7f' { return (__builtin_constant_p (__wc) && __wc >= L'\0' && __wc <= L'\x7f'
? (int) __wc : __wctob_alias (__wc)); } ? (int) __wc : __wctob_alias (__wc)); }
# endif
__extern_inline size_t __extern_inline size_t
__NTH (mbrlen (__const char *__restrict __s, size_t __n, __NTH (mbrlen (__const char *__restrict __s, size_t __n,
@ -763,7 +761,7 @@ extern size_t wcsftime_l (wchar_t *__restrict __s, size_t __maxsize,
#endif #endif
/* Define some macros helping to catch buffer overflows. */ /* Define some macros helping to catch buffer overflows. */
#if __USE_FORTIFY_LEVEL > 0 && !defined __cplusplus #if __USE_FORTIFY_LEVEL > 0 && defined __extern_always_inline
# include <bits/wchar2.h> # include <bits/wchar2.h>
#endif #endif