Hoist array bounds check in array_operation::evaluate
authorTom Tromey <tromey@adacore.com>
Mon, 28 Aug 2023 19:39:33 +0000 (13:39 -0600)
committerTom Tromey <tromey@adacore.com>
Tue, 29 Aug 2023 19:36:55 +0000 (13:36 -0600)
This hoists the array bounds check in array_operation::evaluate to
before the loop.

Reviewed-by: John Baldwin <jhb@FreeBSD.org>
Approved-By: Simon Marchi <simon.marchi@efficios.com>
gdb/eval.c

index 63c414e546ed8d673999baea26b00de528626780..6cf72545f627091a43197f86ccd0fb815afb60ca 100644 (file)
@@ -2426,6 +2426,8 @@ array_operation::evaluate (struct type *expect_type,
          low_bound = 0;
          high_bound = (type->length () / element_size) - 1;
        }
+      if (low_bound + nargs - 1 > high_bound)
+       error (_("Too many array elements"));
       index = low_bound;
       memset (array->contents_raw ().data (), 0, expect_type->length ());
       for (int tem = 0; tem < nargs; ++tem)
@@ -2436,9 +2438,6 @@ array_operation::evaluate (struct type *expect_type,
                                                          exp, noside);
          if (element->type () != element_type)
            element = value_cast (element_type, element);
-         if (index > high_bound)
-           /* To avoid memory corruption.  */
-           error (_("Too many array elements"));
          memcpy (array->contents_raw ().data ()
                  + (index - low_bound) * element_size,
                  element->contents ().data (),