diff options
author | Jakub Jelinek <jakub@redhat.com> | 2011-08-04 09:40:24 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2011-08-04 09:40:24 +0200 |
commit | 8dd00781e17a65c4344681e13f763f8b41880c61 (patch) | |
tree | 7fb650606fc204d2c6c911f55570dd8f43df158c /gcc | |
parent | 9434c32ec698e22420295be3bccf9d2c91967859 (diff) | |
download | gcc-8dd00781e17a65c4344681e13f763f8b41880c61.zip gcc-8dd00781e17a65c4344681e13f763f8b41880c61.tar.gz gcc-8dd00781e17a65c4344681e13f763f8b41880c61.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/attribs.c | 7 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/builtin-object-size3.C | 26 | ||||
-rw-r--r-- | gcc/tree.h | 2 |
7 files changed, 57 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5449bf3..0397563 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-08-04 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/49905 + * tree.h (init_attributes): New prototype. + * attribs.c (init_attributes): No longer static. + 2011-08-04 Ramana Radhakrishnan <ramana.radhakrishnan@linaro.org> * config/arm/arm.c (arm_set_fixed_optab_libfunc): Constify diff --git a/gcc/attribs.c b/gcc/attribs.c index 98a6310..9448c0c 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 1c50f04..9e2a01d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-08-04 Jakub Jelinek <jakub@redhat.com> + + 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 <jason@redhat.com> PR c++/43886 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 2000bd4..f0d1a1a 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 92b1b8d..9565b3e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-08-04 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/49905 + * g++.dg/ext/builtin-object-size3.C: New test. + 2011-08-03 Jakub Jelinek <jakub@redhat.com> 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 0000000..09263e5 --- /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); +} @@ -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 |