From: Jakub Jelinek Date: Thu, 4 Aug 2011 07:40:24 +0000 (+0200) Subject: re PR middle-end/49905 (Better sanity checking on sprintf src & dest to produce warni... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8dd00781e17a65c4344681e13f763f8b41880c61;p=gcc.git re PR middle-end/49905 (Better sanity checking on sprintf src & dest to produce warning for dodgy code ?) PR middle-end/49905 * tree.h (init_attributes): New prototype. * attribs.c (init_attributes): No longer static. * decl.c (cxx_init_decl_processing): Add alloc_size (1) attribute for operator new and operator new []. Call init_attributes. * g++.dg/ext/builtin-object-size3.C: New test. From-SVN: r177316 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5449bf33f8d..03975637f43 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-08-04 Jakub Jelinek + + PR middle-end/49905 + * tree.h (init_attributes): New prototype. + * attribs.c (init_attributes): No longer static. + 2011-08-04 Ramana Radhakrishnan * config/arm/arm.c (arm_set_fixed_optab_libfunc): Constify diff --git a/gcc/attribs.c b/gcc/attribs.c index 98a6310294b..9448c0c6beb 100644 --- a/gcc/attribs.c +++ b/gcc/attribs.c @@ -34,8 +34,6 @@ along with GCC; see the file COPYING3. If not see #include "hashtab.h" #include "plugin.h" -static void init_attributes (void); - /* Table of the tables of attributes (common, language, format, machine) searched. */ static const struct attribute_spec *attribute_tables[4]; @@ -107,12 +105,15 @@ eq_attr (const void *p, const void *q) /* Initialize attribute tables, and make some sanity checks if --enable-checking. */ -static void +void init_attributes (void) { size_t i; int k; + if (attributes_initialized) + return; + attribute_tables[0] = lang_hooks.common_attribute_table; attribute_tables[1] = lang_hooks.attribute_table; attribute_tables[2] = lang_hooks.format_attribute_table; diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1c50f0424ee..9e2a01d8acd 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-08-04 Jakub Jelinek + + PR middle-end/49905 + * decl.c (cxx_init_decl_processing): Add alloc_size (1) attribute + for operator new and operator new []. Call init_attributes. + 2011-08-02 Jason Merrill PR c++/43886 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 2000bd4a79d..f0d1a1a3262 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -3629,6 +3629,7 @@ cxx_init_decl_processing (void) current_lang_name = lang_name_cplusplus; { + tree newattrs; tree newtype, deltype; tree ptr_ftype_sizetype; tree new_eh_spec; @@ -3656,7 +3657,13 @@ cxx_init_decl_processing (void) else new_eh_spec = noexcept_false_spec; - newtype = build_exception_variant (ptr_ftype_sizetype, new_eh_spec); + /* Ensure attribs.c is initialized. */ + init_attributes (); + newattrs + = build_tree_list (get_identifier ("alloc_size"), + build_tree_list (NULL_TREE, integer_one_node)); + newtype = cp_build_type_attribute_variant (ptr_ftype_sizetype, newattrs); + newtype = build_exception_variant (newtype, new_eh_spec); deltype = build_exception_variant (void_ftype_ptr, empty_except_spec); push_cp_library_fn (NEW_EXPR, newtype); push_cp_library_fn (VEC_NEW_EXPR, newtype); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 92b1b8d5c45..9565b3e4cfc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-08-04 Jakub Jelinek + + PR middle-end/49905 + * g++.dg/ext/builtin-object-size3.C: New test. + 2011-08-03 Jakub Jelinek PR tree-optimization/49948 diff --git a/gcc/testsuite/g++.dg/ext/builtin-object-size3.C b/gcc/testsuite/g++.dg/ext/builtin-object-size3.C new file mode 100644 index 00000000000..09263e58719 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/builtin-object-size3.C @@ -0,0 +1,26 @@ +// { dg-do compile } +// { dg-options "-O2" } + +void baz (int *, int *); + +#define MEMCPY(d,s,l) __builtin___memcpy_chk (d, s, l, __builtin_object_size (d, 0)) + +int +foo () +{ + int *p = new int; + int *q = new int[4]; + MEMCPY (p, "abcdefghijklmnopqrstuvwxyz", sizeof (int)); + MEMCPY (q, "abcdefghijklmnopqrstuvwxyz", 4 * sizeof (int)); + baz (p, q); +} + +int +bar () +{ + int *p = new int; + int *q = new int[4]; + MEMCPY (p, "abcdefghijklmnopqrstuvwxyz", sizeof (int) + 1); // { dg-warning "will always overflow destination buffer" } + MEMCPY (q, "abcdefghijklmnopqrstuvwxyz", 4 * sizeof (int) + 1); // { dg-warning "will always overflow destination buffer" } + baz (p, q); +} diff --git a/gcc/tree.h b/gcc/tree.h index 6b13a2a5c51..367c7b92106 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -5547,6 +5547,8 @@ extern bool must_pass_in_stack_var_size_or_pad (enum machine_mode, const_tree); extern const struct attribute_spec *lookup_attribute_spec (const_tree); +extern void init_attributes (void); + /* Process the attributes listed in ATTRIBUTES and install them in *NODE, which is either a DECL (including a TYPE_DECL) or a TYPE. If a DECL, it should be modified in place; if a TYPE, a copy should be created