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
This commit is contained in:
parent
4088b790cc
commit
c7274165bd
@ -1,3 +1,9 @@
|
||||
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
|
||||
|
@ -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))
|
||||
|
@ -1,3 +1,7 @@
|
||||
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
|
||||
|
21
gcc/testsuite/c-c++-common/ubsan/overflow-negate-3.c
Normal file
21
gcc/testsuite/c-c++-common/ubsan/overflow-negate-3.c
Normal file
@ -0,0 +1,21 @@
|
||||
/* { 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)" } */
|
Loading…
Reference in New Issue
Block a user