[PATCH v2] Fix segfault when invoking -var-info-path-expression on a dynamic varobj

Simon Marchi simark@simark.ca
Thu Jun 28 12:17:00 GMT 2018


On 2018-06-28 05:31, Jan Vrany wrote:
>> diff --git a/gdb/varobj.c b/gdb/varobj.c
>> index f2c10ddc57ff..e601cf0b9780 100644
>> --- a/gdb/varobj.c
>> +++ b/gdb/varobj.c
>> @@ -948,6 +948,9 @@ varobj_get_path_expr_parent (const struct varobj
>> *var)
>>    while (!is_root_p (parent) && !is_path_expr_parent (parent))
>>      parent = parent->parent;
>> 
>> +  if (varobj_is_dynamic_p (parent))
>> +    error (_("Invalid variable object (child of a dynamic
>> varobj)"));
>> +
>>    return parent;
>>  }
>> 
> 
> No, I have not considered this - still learning internals. Generally
> I prefer to validate input as soon as possible rather than go on and
> fail later but I agree it's a matter of taste.

The counter argument would be to avoid spreading the "knowledge" of the 
varobj internals in the MI/frontend code.  Also, if other parts of GDB 
want to find out the path expression parent of a varobj, the same case 
will be properly handled.

> However, varobj_get_path_expr_parent() is indeed much better place for
> the assert (the one that failed to compile :), something like:
> 
> diff --git a/gdb/varobj.c b/gdb/varobj.c
> index 02441410e8..050c240bef 100644
> --- a/gdb/varobj.c
> +++ b/gdb/varobj.c
> @@ -948,6 +948,10 @@ varobj_get_path_expr_parent (const struct varobj
> *var)
>    while (!is_root_p (parent) && !is_path_expr_parent (parent))
>      parent = parent->parent;
> 
> +  /* Computation of full rooted expression for children of dynamic
> +     varobjs is not supported.  */
> +  gdb_assert (!varobj_is_dynamic_p (parent));
> +
>    return parent;
>  }
> 
> What do you think? I'll send a new version once we decide.

Personally, I'd prefer the check in varobj_get_path_expr_parent.

Thanks,

Simon



More information about the Gdb-patches mailing list