Issue in dwarf2/expr.c

Andreas Arnez arnez@linux.ibm.com
Thu Apr 14 13:51:59 GMT 2022


On Wed, Apr 13 2022, Rohr, Stephan via Gdb wrote:

> Hi all,
>
> I came across a bug in dwarf2/expr.c:177 in function  rw_pieced_value. when reading a pieced value described by DW_OP_piece or DW_OP_bit_piece.
>
>       if (value_type (v) != value_enclosing_type (v))
>                 internal_error (__FILE__, __LINE__,
>                                                 _("Should not be able to create a lazy value with "
>                                                   "an enclosing type"));

Since I did some work on this function in the past, I just looked where
this check comes from, and it turns out that it was introduced in 2010
by Tom Tromey with commit afd74c5ff76010405caddd2834be4a0178fa93dd --

gdb
	* dwarf2loc.c (read_pieced_value): Work properly when 'v' has an
	offset.
	(write_pieced_value): Likewise.

Perhaps Tom still remembers the rationale?

>
> This check can easily be triggered when casting a variable with location described by DW_OP_piece or DW_OP_bit_piece.
>
> A minimal reproducer can be found in gdb/testsuite/gdb.dwarf2/shortpiece.exp, e.g. casting s1 to an array type triggers the error
>
> p (short []) s1
>
> I currently struggle to understand the reasoning for this check. I could think of changing this to
>
> if (TYPE_LENGTH(value_type (v)) > TYPE_LENGTH( value_enclosing_type (v)))
> to support the cast operation.
>
> But in general, I'm not sure why this check is needed at all.
>
> I appreciate your feedback.
>
>
> Best
> stephan

--
Andreas


More information about the Gdb mailing list