aboutsummaryrefslogtreecommitdiff
path: root/gcc/builtins.c
diff options
context:
space:
mode:
authorMartin Sebor <msebor@redhat.com>2020-10-30 13:04:29 -0600
committerMartin Sebor <msebor@redhat.com>2020-10-30 13:04:29 -0600
commitbdf6524bc0bfa0908a7a7c52e799dbecbebaefe8 (patch)
treea883b883004bad88f357df734efbdb5f02eee562 /gcc/builtins.c
parentf3ced6772e2257bdef4e6f4dbdd0bdcf34b5bb3f (diff)
downloadgcc-bdf6524bc0bfa0908a7a7c52e799dbecbebaefe8.zip
gcc-bdf6524bc0bfa0908a7a7c52e799dbecbebaefe8.tar.gz
gcc-bdf6524bc0bfa0908a7a7c52e799dbecbebaefe8.tar.bz2
PR middle-end/97556 - ICE on excessively large index into a multidimensional array
gcc/ChangeLog: PR middle-end/97556 * builtins.c (access_ref::add_offset): Cap offset lower bound to at most the the upper bound. gcc/testsuite/ChangeLog: PR middle-end/97556 * gcc.dg/Warray-bounds-70.c: New test.
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r--gcc/builtins.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 3a3eb55..da25343 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -321,7 +321,13 @@ void access_ref::add_offset (const offset_int &min, const offset_int &max)
offrng[1] = maxoff;
offset_int absmax = wi::abs (max);
if (offrng[0] < absmax)
- offrng[0] += min;
+ {
+ offrng[0] += min;
+ /* Cap the lower bound at the upper (set to MAXOFF above)
+ to avoid inadvertently recreating an inverted range. */
+ if (offrng[1] < offrng[0])
+ offrng[0] = offrng[1];
+ }
else
offrng[0] = 0;
}