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
This commit is contained in:
parent
9434c32ec6
commit
8dd00781e1
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
26
gcc/testsuite/g++.dg/ext/builtin-object-size3.C
Normal file
26
gcc/testsuite/g++.dg/ext/builtin-object-size3.C
Normal file
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user