diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-10-02 17:48:55 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-10-02 17:48:55 +0200 |
commit | 476dec785da43401e5a34d80d2ed5ec61d3a9dd6 (patch) | |
tree | 995b3cb6383cb8b0d1a150842b336341e23b11bc /gcc/tree-dfa.c | |
parent | f240a230758a89d52799dc52606ec58963e248f2 (diff) | |
download | gcc-476dec785da43401e5a34d80d2ed5ec61d3a9dd6.zip gcc-476dec785da43401e5a34d80d2ed5ec61d3a9dd6.tar.gz gcc-476dec785da43401e5a34d80d2ed5ec61d3a9dd6.tar.bz2 |
tree-dfa.c (get_ref_base_and_extent): Set *pmax_size to -1 if *poffset + *pmax_size overflows in HOST_WIDE_INT.
* tree-dfa.c (get_ref_base_and_extent): Set *pmax_size to -1
if *poffset + *pmax_size overflows in HOST_WIDE_INT.
Set *poffset to 0 and *psize and *pmax_size to -1 if
*poffset + *psize overflows in HOST_WIDE_INT.
* gcc.dg/pr82389.c: New test.
From-SVN: r253357
Diffstat (limited to 'gcc/tree-dfa.c')
-rw-r--r-- | gcc/tree-dfa.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c index 2e65a44..db69bda 100644 --- a/gcc/tree-dfa.c +++ b/gcc/tree-dfa.c @@ -654,7 +654,22 @@ get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset, if (!wi::fits_shwi_p (maxsize) || wi::neg_p (maxsize)) *pmax_size = -1; else - *pmax_size = maxsize.to_shwi (); + { + *pmax_size = maxsize.to_shwi (); + if (*poffset > HOST_WIDE_INT_MAX - *pmax_size) + *pmax_size = -1; + } + + /* Punt if *POFFSET + *PSIZE overflows in HOST_WIDE_INT, the callers don't + check for such overflows individually and assume it works. */ + if (*psize != -1 && *poffset > HOST_WIDE_INT_MAX - *psize) + { + *poffset = 0; + *psize = -1; + *pmax_size = -1; + + return exp; + } return exp; } |