gdb: Fix sizeof for dynamic types other than arrays

Message ID 20180729224137.27121-1-andrew.burgess@embecosm.com
State New, archived
Headers

Commit Message

Andrew Burgess July 29, 2018, 10:41 p.m. UTC
  In commit:

   commit 37cc0caeca4c9a8552370040f4cfeaeceaa03369
   Date:   Wed Jul 18 13:38:35 2018 +0200
   [gdb/exp] Interpret size of vla with unknown size as <optimized out>

All dynamic types are treated as arrays in the 'sizeof' code path,
which means that structures can incorrectly be treated as arrays.
This can cause a failure in the gdb.base/vla-datatypes.exp test
script.

This commit adds a check that we do have an array before checking the
array bounds, and I also check that the array index type is dynamic
too.  This second check probably isn't strictly necessary, but
shouldn't hurt, a non-dynamic index type shouldn't have undefined high
bound.

gdb/ChangeLog:

	* eval.c (evaluate_subexp_for_sizeof): Check for array type before
	checking array bounds are defined.
---
 gdb/ChangeLog | 5 +++++
 gdb/eval.c    | 4 +++-
 2 files changed, 8 insertions(+), 1 deletion(-)
  

Comments

Tom Tromey July 30, 2018, 1:39 p.m. UTC | #1
>>>>> "Andrew" == Andrew Burgess <andrew.burgess@embecosm.com> writes:

Andrew> All dynamic types are treated as arrays in the 'sizeof' code path,
Andrew> which means that structures can incorrectly be treated as arrays.
Andrew> This can cause a failure in the gdb.base/vla-datatypes.exp test
Andrew> script.

I noticed this with -fsanitize=address just yesterday as well.

Andrew> 	* eval.c (evaluate_subexp_for_sizeof): Check for array type before
Andrew> 	checking array bounds are defined.

This is ok.  Thank you.

Tom
  

Patch

diff --git a/gdb/eval.c b/gdb/eval.c
index 0495a11bfd7..2e08e9355f5 100644
--- a/gdb/eval.c
+++ b/gdb/eval.c
@@ -3145,7 +3145,9 @@  evaluate_subexp_for_sizeof (struct expression *exp, int *pos,
 	{
 	  val = evaluate_subexp (NULL_TYPE, exp, pos, EVAL_NORMAL);
 	  type = value_type (val);
-	  if (TYPE_HIGH_BOUND_UNDEFINED (TYPE_INDEX_TYPE (type)))
+	  if (TYPE_CODE (type) == TYPE_CODE_ARRAY
+              && is_dynamic_type (TYPE_INDEX_TYPE (type))
+              && TYPE_HIGH_BOUND_UNDEFINED (TYPE_INDEX_TYPE (type)))
 	    return allocate_optimized_out_value (size_type);
 	}
       else