diff options
author | Markus Trippelsdorf <markus@trippelsdorf.de> | 2017-11-27 05:20:43 +0000 |
---|---|---|
committer | Markus Trippelsdorf <trippels@gcc.gnu.org> | 2017-11-27 05:20:43 +0000 |
commit | 99282f81a6bcb5873c2a3c4755f625b5a44a915d (patch) | |
tree | c003d29fccbed0d3197d3f058e86ffa7b1f173ab | |
parent | 62e8530cd54126ab5be8a7815df47dab5c8e6905 (diff) | |
download | gcc-99282f81a6bcb5873c2a3c4755f625b5a44a915d.zip gcc-99282f81a6bcb5873c2a3c4755f625b5a44a915d.tar.gz gcc-99282f81a6bcb5873c2a3c4755f625b5a44a915d.tar.bz2 |
Fix PR82488 - signed integer overflow in expr.c
bootstrap-ubsan shows:
gcc/expr.c:4103:17: runtime error: signed integer overflow: 0 - -9223372036854775808 cannot be represented in type 'long int'
Fix by handling the saw_unknown case earlier.
PR rtl-optimization/82488
* expr.c (fixup_args_size_notes): Avoid signed integer overflow.
diff --git a/gcc/expr.c b/gcc/expr.c
index ee07de5aaa44..e9d8555c9452 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -4100,10 +4100,13 @@ fixup_args_size_notes (rtx_insn *prev, rtx_insn *last, int end_args_size)
if (STACK_GROWS_DOWNWARD)
this_delta = -(unsigned HOST_WIDE_INT) this_delta;
- args_size -= this_delta;
+ if (saw_unknown)
+ args_size = INT_MIN;
+ else
+ args_size -= this_delta;
}
- return saw_unknown ? INT_MIN : args_size;
+ return args_size;
}
#ifdef PUSH_ROUNDING
--
Markus
From-SVN: r255159
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/expr.c | 7 |
2 files changed, 10 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 20c4ab6..dc980a9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2017-11-27 Markus Trippelsdorf <markus@trippelsdorf.de> + + PR rtl-optimization/82488 + * expr.c (fixup_args_size_notes): Avoid signed integer overflow. + 2017-11-26 Julia Koval <julia.koval@intel.com> * config/i386/i386.c (processor_target_table): Add skylake_cost for @@ -4100,10 +4100,13 @@ fixup_args_size_notes (rtx_insn *prev, rtx_insn *last, int end_args_size) if (STACK_GROWS_DOWNWARD) this_delta = -(unsigned HOST_WIDE_INT) this_delta; - args_size -= this_delta; + if (saw_unknown) + args_size = INT_MIN; + else + args_size -= this_delta; } - return saw_unknown ? INT_MIN : args_size; + return args_size; } #ifdef PUSH_ROUNDING |