Commit c7274165 by Marek Polacek Committed by Marek Polacek

fold-const.c (fold_negate_expr): Don't fold INTEGER_CST if that overflows when…

fold-const.c (fold_negate_expr): Don't fold INTEGER_CST if that overflows when SANITIZE_SI_OVERFLOW is on.

	* fold-const.c (fold_negate_expr): Don't fold INTEGER_CST if
	that overflows when SANITIZE_SI_OVERFLOW is on.  Guard -(-A)
	folding with TYPE_OVERFLOW_SANITIZED.

	* c-c++-common/ubsan/overflow-negate-3.c: New test.

From-SVN: r217556
parent 4088b790
2014-11-14 Marek Polacek <polacek@redhat.com>
* fold-const.c (fold_negate_expr): Don't fold INTEGER_CST if
that overflows when SANITIZE_SI_OVERFLOW is on. Guard -(-A)
folding with TYPE_OVERFLOW_SANITIZED.
2014-11-14 Marek Polacek <polacek@redhat.com>
PR sanitizer/63839
* asan.c (ATTR_CONST_NORETURN_NOTHROW_LEAF_LIST,
ATTR_COLD_CONST_NORETURN_NOTHROW_LEAF_LIST): Define.
......@@ -554,7 +554,8 @@ fold_negate_expr (location_t loc, tree t)
case INTEGER_CST:
tem = fold_negate_const (t, type);
if (TREE_OVERFLOW (tem) == TREE_OVERFLOW (t)
|| !TYPE_OVERFLOW_TRAPS (type))
|| (!TYPE_OVERFLOW_TRAPS (type)
&& (flag_sanitize & SANITIZE_SI_OVERFLOW) == 0))
return tem;
break;
......@@ -611,7 +612,9 @@ fold_negate_expr (location_t loc, tree t)
break;
case NEGATE_EXPR:
return TREE_OPERAND (t, 0);
if (!TYPE_OVERFLOW_SANITIZED (type))
return TREE_OPERAND (t, 0);
break;
case PLUS_EXPR:
if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
......
2014-11-14 Marek Polacek <polacek@redhat.com>
* c-c++-common/ubsan/overflow-negate-3.c: New test.
2014-11-14 Marek Polacek <polacek@redhat.com>
PR sanitizer/63839
* c-c++-common/ubsan/pr63839.c: New test.
* c-c++-common/ubsan/unreachable-2.c: New test.
......
/* { dg-do run } */
/* { dg-options "-fsanitize=signed-integer-overflow" } */
#define INT_MIN (-__INT_MAX__ - 1)
int
main ()
{
int x = INT_MIN;
int y;
asm ("" : "+g" (x));
y = -(-x);
asm ("" : "+g" (y));
y = -(-INT_MIN);
asm ("" : "+g" (y));
}
/* { dg-output "negation of -2147483648 cannot be represented in type 'int'\[^\n\r]*; cast to an unsigned type to negate this value to itself\[^\n\r]*(\n|\r\n|\r)" } */
/* { dg-output "\[^\n\r]*negation of -2147483648 cannot be represented in type 'int'\[^\n\r]*; cast to an unsigned type to negate this value to itself\[^\n\r]*(\n|\r\n|\r)" } */
/* { dg-output "\[^\n\r]*negation of -2147483648 cannot be represented in type 'int'\[^\n\r]*; cast to an unsigned type to negate this value to itself\[^\n\r]*(\n|\r\n|\r)" } */
/* { dg-output "\[^\n\r]*negation of -2147483648 cannot be represented in type 'int'\[^\n\r]*; cast to an unsigned type to negate this value to itself\[^\n\r]*(\n|\r\n|\r)" } */
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