Commit f5481fc4 by Jason Merrill Committed by Jason Merrill

ubsan.c (do_ubsan_in_current_function): New.

gcc/
	* ubsan.c (do_ubsan_in_current_function): New.
	(pass_ubsan::gate): Use it.
	* ubsan.h: Declare it.
	* convert.c (convert_to_integer): Use it.
gcc/c-family/
	* c-ubsan.c (ubsan_maybe_instrument_array_ref): Use
	do_ubsan_in_current_function.
	(ubsan_maybe_instrument_reference_or_call): Likewise.
	* c-ubsan.h: Declare it.
gcc/cp/
	* cp-gimplify.c (cp_genericize): Use do_ubsan_in_current_function.
	* decl.c (compute_array_index_type): Likewise.
	* init.c (build_vec_init): Likewise.
	* typeck.c (cp_build_binary_op): Likewise.

From-SVN: r219360
parent 46621807
2015-01-08 Jason Merrill <jason@redhat.com>
* ubsan.c (do_ubsan_in_current_function): New.
(pass_ubsan::gate): Use it.
* ubsan.h: Declare it.
* convert.c (convert_to_integer): Use it.
2015-01-08 Jakub Jelinek <jakub@redhat.com> 2015-01-08 Jakub Jelinek <jakub@redhat.com>
PR target/64338 PR target/64338
......
2015-01-08 Jason Merrill <jason@redhat.com>
* c-ubsan.c (ubsan_maybe_instrument_array_ref): Use
do_ubsan_in_current_function.
(ubsan_maybe_instrument_reference_or_call): Likewise.
* c-ubsan.h: Declare it.
2015-01-08 Mike Stump <mikestump@comcast.net> 2015-01-08 Mike Stump <mikestump@comcast.net>
* c-common.c (c_common_attribute_table): Add no_sanitize_thread. * c-common.c (c_common_attribute_table): Add no_sanitize_thread.
......
...@@ -364,9 +364,7 @@ void ...@@ -364,9 +364,7 @@ void
ubsan_maybe_instrument_array_ref (tree *expr_p, bool ignore_off_by_one) ubsan_maybe_instrument_array_ref (tree *expr_p, bool ignore_off_by_one)
{ {
if (!ubsan_array_ref_instrumented_p (*expr_p) if (!ubsan_array_ref_instrumented_p (*expr_p)
&& current_function_decl != NULL_TREE && do_ubsan_in_current_function ())
&& !lookup_attribute ("no_sanitize_undefined",
DECL_ATTRIBUTES (current_function_decl)))
{ {
tree op0 = TREE_OPERAND (*expr_p, 0); tree op0 = TREE_OPERAND (*expr_p, 0);
tree op1 = TREE_OPERAND (*expr_p, 1); tree op1 = TREE_OPERAND (*expr_p, 1);
...@@ -386,9 +384,7 @@ static tree ...@@ -386,9 +384,7 @@ static tree
ubsan_maybe_instrument_reference_or_call (location_t loc, tree op, tree ptype, ubsan_maybe_instrument_reference_or_call (location_t loc, tree op, tree ptype,
enum ubsan_null_ckind ckind) enum ubsan_null_ckind ckind)
{ {
if (current_function_decl == NULL_TREE if (!do_ubsan_in_current_function ())
|| lookup_attribute ("no_sanitize_undefined",
DECL_ATTRIBUTES (current_function_decl)))
return NULL_TREE; return NULL_TREE;
tree type = TREE_TYPE (ptype); tree type = TREE_TYPE (ptype);
......
...@@ -31,4 +31,7 @@ extern void ubsan_maybe_instrument_array_ref (tree *, bool); ...@@ -31,4 +31,7 @@ extern void ubsan_maybe_instrument_array_ref (tree *, bool);
extern void ubsan_maybe_instrument_reference (tree); extern void ubsan_maybe_instrument_reference (tree);
extern void ubsan_maybe_instrument_member_call (tree, bool); extern void ubsan_maybe_instrument_member_call (tree, bool);
/* Declare this here as well as in ubsan.h. */
extern bool do_ubsan_in_current_function (void);
#endif /* GCC_C_UBSAN_H */ #endif /* GCC_C_UBSAN_H */
...@@ -885,9 +885,7 @@ convert_to_integer (tree type, tree expr) ...@@ -885,9 +885,7 @@ convert_to_integer (tree type, tree expr)
case REAL_TYPE: case REAL_TYPE:
if (flag_sanitize & SANITIZE_FLOAT_CAST if (flag_sanitize & SANITIZE_FLOAT_CAST
&& current_function_decl != NULL_TREE && do_ubsan_in_current_function ())
&& !lookup_attribute ("no_sanitize_undefined",
DECL_ATTRIBUTES (current_function_decl)))
{ {
expr = save_expr (expr); expr = save_expr (expr);
tree check = ubsan_instrument_float_cast (loc, type, expr, expr); tree check = ubsan_instrument_float_cast (loc, type, expr, expr);
......
2015-01-08 Jason Merrill <jason@redhat.com> 2015-01-08 Jason Merrill <jason@redhat.com>
* cp-gimplify.c (cp_genericize): Use do_ubsan_in_current_function.
* decl.c (compute_array_index_type): Likewise.
* init.c (build_vec_init): Likewise.
* typeck.c (cp_build_binary_op): Likewise.
2015-01-08 Jason Merrill <jason@redhat.com>
* init.c (build_vec_init): Call ubsan_instrument_bounds to check * init.c (build_vec_init): Call ubsan_instrument_bounds to check
whether an initializer-list is too big for a VLA. whether an initializer-list is too big for a VLA.
(throw_bad_array_length): Remove. (throw_bad_array_length): Remove.
......
...@@ -1350,9 +1350,7 @@ cp_genericize (tree fndecl) ...@@ -1350,9 +1350,7 @@ cp_genericize (tree fndecl)
cp_genericize_tree (&DECL_SAVED_TREE (fndecl)); cp_genericize_tree (&DECL_SAVED_TREE (fndecl));
if (flag_sanitize & SANITIZE_RETURN if (flag_sanitize & SANITIZE_RETURN
&& current_function_decl != NULL_TREE && do_ubsan_in_current_function ())
&& !lookup_attribute ("no_sanitize_undefined",
DECL_ATTRIBUTES (current_function_decl)))
cp_ubsan_maybe_instrument_return (fndecl); cp_ubsan_maybe_instrument_return (fndecl);
/* Do everything else. */ /* Do everything else. */
......
...@@ -8595,10 +8595,7 @@ compute_array_index_type (tree name, tree size, tsubst_flags_t complain) ...@@ -8595,10 +8595,7 @@ compute_array_index_type (tree name, tree size, tsubst_flags_t complain)
stabilize_vla_size (itype); stabilize_vla_size (itype);
if (flag_sanitize & SANITIZE_VLA if (flag_sanitize & SANITIZE_VLA
&& current_function_decl != NULL_TREE && do_ubsan_in_current_function ())
&& !lookup_attribute ("no_sanitize_undefined",
DECL_ATTRIBUTES
(current_function_decl)))
{ {
/* We have to add 1 -- in the ubsan routine we generate /* We have to add 1 -- in the ubsan routine we generate
LE_EXPR rather than LT_EXPR. */ LE_EXPR rather than LT_EXPR. */
......
...@@ -3575,10 +3575,7 @@ build_vec_init (tree base, tree maxindex, tree init, ...@@ -3575,10 +3575,7 @@ build_vec_init (tree base, tree maxindex, tree init,
/* Don't check an array new when -fno-exceptions. */ /* Don't check an array new when -fno-exceptions. */
} }
else if (flag_sanitize & SANITIZE_BOUNDS else if (flag_sanitize & SANITIZE_BOUNDS
&& current_function_decl && do_ubsan_in_current_function ())
&& !lookup_attribute ("no_sanitize_undefined",
DECL_ATTRIBUTES
(current_function_decl)))
{ {
/* Make sure the last element of the initializer is in bounds. */ /* Make sure the last element of the initializer is in bounds. */
finish_expr_stmt finish_expr_stmt
......
...@@ -4973,9 +4973,7 @@ cp_build_binary_op (location_t location, ...@@ -4973,9 +4973,7 @@ cp_build_binary_op (location_t location,
if ((flag_sanitize & (SANITIZE_SHIFT | SANITIZE_DIVIDE if ((flag_sanitize & (SANITIZE_SHIFT | SANITIZE_DIVIDE
| SANITIZE_FLOAT_DIVIDE)) | SANITIZE_FLOAT_DIVIDE))
&& !processing_template_decl && !processing_template_decl
&& current_function_decl != 0 && do_ubsan_in_current_function ()
&& !lookup_attribute ("no_sanitize_undefined",
DECL_ATTRIBUTES (current_function_decl))
&& (doing_div_or_mod || doing_shift)) && (doing_div_or_mod || doing_shift))
{ {
/* OP0 and/or OP1 might have side-effects. */ /* OP0 and/or OP1 might have side-effects. */
......
...@@ -1648,6 +1648,16 @@ instrument_object_size (gimple_stmt_iterator *gsi, bool is_lhs) ...@@ -1648,6 +1648,16 @@ instrument_object_size (gimple_stmt_iterator *gsi, bool is_lhs)
gsi_insert_before (gsi, g, GSI_SAME_STMT); gsi_insert_before (gsi, g, GSI_SAME_STMT);
} }
/* True if we want to play UBSan games in the current function. */
bool
do_ubsan_in_current_function ()
{
return (current_function_decl != NULL_TREE
&& !lookup_attribute ("no_sanitize_undefined",
DECL_ATTRIBUTES (current_function_decl)));
}
namespace { namespace {
const pass_data pass_data_ubsan = const pass_data pass_data_ubsan =
...@@ -1679,9 +1689,7 @@ public: ...@@ -1679,9 +1689,7 @@ public:
| SANITIZE_NONNULL_ATTRIBUTE | SANITIZE_NONNULL_ATTRIBUTE
| SANITIZE_RETURNS_NONNULL_ATTRIBUTE | SANITIZE_RETURNS_NONNULL_ATTRIBUTE
| SANITIZE_OBJECT_SIZE) | SANITIZE_OBJECT_SIZE)
&& current_function_decl != NULL_TREE && do_ubsan_in_current_function ();
&& !lookup_attribute ("no_sanitize_undefined",
DECL_ATTRIBUTES (current_function_decl));
} }
virtual unsigned int execute (function *); virtual unsigned int execute (function *);
......
...@@ -38,6 +38,7 @@ enum ubsan_print_style { ...@@ -38,6 +38,7 @@ enum ubsan_print_style {
UBSAN_PRINT_ARRAY UBSAN_PRINT_ARRAY
}; };
extern bool do_ubsan_in_current_function (void);
extern bool ubsan_expand_bounds_ifn (gimple_stmt_iterator *); extern bool ubsan_expand_bounds_ifn (gimple_stmt_iterator *);
extern bool ubsan_expand_null_ifn (gimple_stmt_iterator *); extern bool ubsan_expand_null_ifn (gimple_stmt_iterator *);
extern bool ubsan_expand_objsize_ifn (gimple_stmt_iterator *); extern bool ubsan_expand_objsize_ifn (gimple_stmt_iterator *);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment