From 88d0c3f0a1448e71dcf49c2f34909ec8d7ce348f Mon Sep 17 00:00:00 2001 From: Martin Sebor Date: Wed, 21 Sep 2016 01:39:27 +0000 Subject: PR middle-end/49905 - Better sanity checking on sprintf src & dest to gcc/ChangeLog: PR middle-end/49905 * Makefile.in (OBJS): Add gimple-ssa-sprintf.o. * config/linux.h (TARGET_PRINTF_POINTER_FORMAT): Redefine. * config/linux.c (gnu_libc_printf_pointer_format): New function. * config/sol2.h (TARGET_PRINTF_POINTER_FORMAT): Same. * config/sol2.c (solaris_printf_pointer_format): New function. * doc/invoke.texi (-Wformat-length, -fprintf-return-value): New options. * doc/tm.texi.in (TARGET_PRINTF_POINTER_FORMAT): Document. * doc/tm.texi: Regenerate. * gimple-fold.h (get_range_strlen): New function. (get_maxval_strlen): Declare existing function. * gimple-fold.c (get_range_strlen): Add arguments and compute both maximum and minimum. (get_range_strlen): Define overload. (get_maxval_strlen): Adjust. * gimple-ssa-sprintf.c: New file and pass. * passes.def (pass_sprintf_length): Add new pass. * targhooks.h (default_printf_pointer_format): Declare new function. (gnu_libc_printf_pointer_format): Same. (solaris_libc_printf_pointer_format): Same. * targhooks.c (default_printf_pointer_format): Define new function. * tree-pass.h (make_pass_sprintf_length): Declare new function. * print-tree.c: Increase buffer size. gcc/c-family/ChangeLog: PR middle-end/49905 * c.opt: Add -Wformat-length and -fprintf-return-value. gcc/testsuite/ChangeLog: PR middle-end/49905 * gcc.dg/builtin-stringop-chk-1.c: Adjust. * gcc.dg/tree-ssa/builtin-sprintf-warn-1.c: New test. * gcc.dg/tree-ssa/builtin-sprintf-warn-2.c: New test. * gcc.dg/tree-ssa/builtin-sprintf-warn-3.c: New test. * gcc.dg/tree-ssa/builtin-sprintf-warn-4.c: New test. * gcc.dg/tree-ssa/builtin-sprintf.c: New test. * gcc.dg/tree-ssa/builtin-sprintf-2.c: New test. From-SVN: r240298 --- gcc/config/linux.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'gcc/config/linux.c') diff --git a/gcc/config/linux.c b/gcc/config/linux.c index 16c3768..9aac38b 100644 --- a/gcc/config/linux.c +++ b/gcc/config/linux.c @@ -21,8 +21,12 @@ along with GCC; see the file COPYING3. If not see #include "system.h" #include "coretypes.h" #include "tm.h" +#include "tree.h" #include "linux-protos.h" +#undef TARGET_PRINTF_POINTER_FORMAT +#define TARGET_PRINTF_POINTER_FORMAT gnu_libc_printf_pointer_format + bool linux_libc_has_function (enum function_class fn_class) { @@ -36,3 +40,16 @@ linux_libc_has_function (enum function_class fn_class) return false; } + +/* Glibc formats pointers as if by "%zx" except for the null pointer + which outputs "(nil)". It ignores the pound ('#') format flag but + interprets the space and plus flags the same as in the integer + directive. */ + +const char* +gnu_libc_printf_pointer_format (tree arg, const char **flags) +{ + *flags = " +"; + + return arg && integer_zerop (arg) ? "(nil)" : "%#zx"; +} -- cgit v1.1