Do UBSAN sanitization just when current_function_decl != NULL_TREE (PR sanitize/81530).

2017-07-31  Martin Liska  <mliska@suse.cz>

	PR sanitize/81530
	* cp-gimplify.c (cp_genericize): Guard condition with flag_sanitize_p
	also with current_function_decl non-null equality.
	* cp-ubsan.c (cp_ubsan_instrument_vptr_p): Likewise.
	* decl.c (compute_array_index_type): Likewise.
	* init.c (finish_length_check): Likewise.
	* typeck.c (cp_build_binary_op): Likewise.
2017-07-31  Martin Liska  <mliska@suse.cz>

	PR sanitize/81530
	* c-convert.c (convert): Guard condition with flag_sanitize_p
	also with current_function_decl non-null equality.
	* c-decl.c (grokdeclarator): Likewise.
	* c-typeck.c (build_binary_op): Likewise.
2017-07-31  Martin Liska  <mliska@suse.cz>

	PR sanitize/81530
	* convert.c (convert_to_integer_1): Guard condition with flag_sanitize_p
	also with current_function_decl non-null equality.
2017-07-31  Martin Liska  <mliska@suse.cz>

	PR sanitize/81530
	* c-ubsan.c (ubsan_maybe_instrument_array_ref):
	Guard condition with flag_sanitize_p also with current_function_decl
	non-null equality.
	(ubsan_maybe_instrument_reference_or_call): Likewise.
2017-07-31  Martin Liska  <mliska@suse.cz>

	PR sanitize/81530
	* g++.dg/ubsan/pr81530.C: New test.

From-SVN: r250730
This commit is contained in:
Martin Liska 2017-07-31 10:53:00 +02:00 committed by Martin Liska
parent 066bbc5721
commit f34ebeb25e
16 changed files with 62 additions and 6 deletions

View file

@ -1,3 +1,9 @@
2017-07-31 Martin Liska <mliska@suse.cz>
PR sanitize/81530
* convert.c (convert_to_integer_1): Guard condition with flag_sanitize_p
also with current_function_decl non-null equality.
2017-07-31 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/81604

View file

@ -1,3 +1,11 @@
2017-07-31 Martin Liska <mliska@suse.cz>
PR sanitize/81530
* c-ubsan.c (ubsan_maybe_instrument_array_ref):
Guard condition with flag_sanitize_p also with current_function_decl
non-null equality.
(ubsan_maybe_instrument_reference_or_call): Likewise.
2017-07-30 Uros Bizjak <ubizjak@gmail.com>
* c-format.c (asm_fprintf_char_table): Add 'z' to format_chars.

View file

@ -373,7 +373,8 @@ void
ubsan_maybe_instrument_array_ref (tree *expr_p, bool ignore_off_by_one)
{
if (!ubsan_array_ref_instrumented_p (*expr_p)
&& sanitize_flags_p (SANITIZE_BOUNDS | SANITIZE_BOUNDS_STRICT))
&& sanitize_flags_p (SANITIZE_BOUNDS | SANITIZE_BOUNDS_STRICT)
&& current_function_decl != NULL_TREE)
{
tree op0 = TREE_OPERAND (*expr_p, 0);
tree op1 = TREE_OPERAND (*expr_p, 1);
@ -393,7 +394,8 @@ static tree
ubsan_maybe_instrument_reference_or_call (location_t loc, tree op, tree ptype,
enum ubsan_null_ckind ckind)
{
if (!sanitize_flags_p (SANITIZE_ALIGNMENT | SANITIZE_NULL))
if (!sanitize_flags_p (SANITIZE_ALIGNMENT | SANITIZE_NULL)
|| current_function_decl == NULL_TREE)
return NULL_TREE;
tree type = TREE_TYPE (ptype);

View file

@ -1,3 +1,11 @@
2017-07-31 Martin Liska <mliska@suse.cz>
PR sanitize/81530
* c-convert.c (convert): Guard condition with flag_sanitize_p
also with current_function_decl non-null equality.
* c-decl.c (grokdeclarator): Likewise.
* c-typeck.c (build_binary_op): Likewise.
2017-07-25 Marek Polacek <polacek@redhat.com>
* c-decl.c (grokfield): Remove local variable.

View file

@ -108,6 +108,7 @@ convert (tree type, tree expr)
case INTEGER_TYPE:
case ENUMERAL_TYPE:
if (sanitize_flags_p (SANITIZE_FLOAT_CAST)
&& current_function_decl != NULL_TREE
&& TREE_CODE (TREE_TYPE (expr)) == REAL_TYPE
&& COMPLETE_TYPE_P (type))
{

View file

@ -6052,6 +6052,7 @@ grokdeclarator (const struct c_declarator *declarator,
this_size_varies = size_varies = true;
warn_variable_length_array (name, size);
if (sanitize_flags_p (SANITIZE_VLA)
&& current_function_decl != NULL_TREE
&& decl_context == NORMAL)
{
/* Evaluate the array size only once. */

View file

@ -11838,6 +11838,7 @@ build_binary_op (location_t location, enum tree_code code,
if (sanitize_flags_p ((SANITIZE_SHIFT
| SANITIZE_DIVIDE | SANITIZE_FLOAT_DIVIDE))
&& current_function_decl != NULL_TREE
&& (doing_div_or_mod || doing_shift)
&& !require_constant_value)
{

View file

@ -938,7 +938,8 @@ convert_to_integer_1 (tree type, tree expr, bool dofold)
return build1 (CONVERT_EXPR, type, expr);
case REAL_TYPE:
if (sanitize_flags_p (SANITIZE_FLOAT_CAST))
if (sanitize_flags_p (SANITIZE_FLOAT_CAST)
&& current_function_decl != NULL_TREE)
{
expr = save_expr (expr);
tree check = ubsan_instrument_float_cast (loc, type, expr);

View file

@ -1,3 +1,13 @@
2017-07-31 Martin Liska <mliska@suse.cz>
PR sanitize/81530
* cp-gimplify.c (cp_genericize): Guard condition with flag_sanitize_p
also with current_function_decl non-null equality.
* cp-ubsan.c (cp_ubsan_instrument_vptr_p): Likewise.
* decl.c (compute_array_index_type): Likewise.
* init.c (finish_length_check): Likewise.
* typeck.c (cp_build_binary_op): Likewise.
2017-07-29 Jakub Jelinek <jakub@redhat.com>
* cp-objcp-common.c (cp_decl_dwarf_attribute): Handle

View file

@ -1668,7 +1668,8 @@ cp_genericize (tree fndecl)
walk_tree's hash functionality. */
cp_genericize_tree (&DECL_SAVED_TREE (fndecl), true);
if (sanitize_flags_p (SANITIZE_RETURN))
if (sanitize_flags_p (SANITIZE_RETURN)
&& current_function_decl != NULL_TREE)
cp_ubsan_maybe_instrument_return (fndecl);
/* Do everything else. */

View file

@ -36,6 +36,9 @@ cp_ubsan_instrument_vptr_p (tree type)
if (!sanitize_flags_p (SANITIZE_VPTR))
return false;
if (current_function_decl == NULL_TREE)
return false;
if (type)
{
type = TYPE_MAIN_VARIANT (type);

View file

@ -9482,7 +9482,8 @@ compute_array_index_type (tree name, tree size, tsubst_flags_t complain)
stabilize_vla_size (itype);
if (sanitize_flags_p (SANITIZE_VLA))
if (sanitize_flags_p (SANITIZE_VLA)
&& current_function_decl != NULL_TREE)
{
/* We have to add 1 -- in the ubsan routine we generate
LE_EXPR rather than LT_EXPR. */

View file

@ -3910,7 +3910,8 @@ finish_length_check (tree atype, tree iterator, tree obase, unsigned n)
}
/* Don't check an array new when -fno-exceptions. */
}
else if (sanitize_flags_p (SANITIZE_BOUNDS))
else if (sanitize_flags_p (SANITIZE_BOUNDS)
&& current_function_decl != NULL_TREE)
{
/* Make sure the last element of the initializer is in bounds. */
finish_expr_stmt

View file

@ -5256,6 +5256,7 @@ cp_build_binary_op (location_t location,
if (sanitize_flags_p ((SANITIZE_SHIFT
| SANITIZE_DIVIDE | SANITIZE_FLOAT_DIVIDE))
&& current_function_decl != NULL_TREE
&& !processing_template_decl
&& (doing_div_or_mod || doing_shift))
{

View file

@ -1,3 +1,8 @@
2017-07-31 Martin Liska <mliska@suse.cz>
PR sanitize/81530
* g++.dg/ubsan/pr81530.C: New test.
2017-07-31 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/81604

View file

@ -0,0 +1,6 @@
/* PR sanitizer/81530 */
/* { dg-do compile } */
/* { dg-options "-fsanitize=undefined" } */
int a[(long) 4e20]; /* { dg-error "overflow in constant expression" } */
/* { dg-error "size of array .a. is too large" "" { target *-*-* } .-1 } */