[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gdb-cvs
Subject:    [binutils-gdb] Hoist array bounds check in array_operation::evaluate
From:       Tom Tromey via Gdb-cvs <gdb-cvs () sourceware ! org>
Date:       2023-08-29 19:40:10
Message-ID: 20230829194010.0A6023858D28 () sourceware ! org
[Download RAW message or body]

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=9c00ec6fe09c01df6d30fd67c3b12ee99394ee71

commit 9c00ec6fe09c01df6d30fd67c3b12ee99394ee71
Author: Tom Tromey <tromey@adacore.com>
Date:   Mon Aug 28 13:39:33 2023 -0600

    Hoist array bounds check in array_operation::evaluate
    
    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>

Diff:
---
 gdb/eval.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/gdb/eval.c b/gdb/eval.c
index 63c414e546e..6cf72545f62 100644
--- a/gdb/eval.c
+++ b/gdb/eval.c
@@ -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 (),
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic