Bug 17416

Summary: -var-list-children fails with "set print object on" and invalid/NULL value
Product: gdb Reporter: Simon Marchi <simark>
Component: gdbAssignee: Not yet assigned to anyone <unassigned>
Status: RESOLVED FIXED    
Severity: normal CC: malaperle, simon.marchi
Priority: P2    
Version: HEAD   
Target Milestone: ---   
Host: Target:
Build: Last reconfirmed:
Attachments: Test program
Test case (the .exp)

Description Simon Marchi 2014-09-19 21:24:43 UTC
Created attachment 7796 [details]
Test program

When

- "set print object" is on
- The variable object is a pointer to a struct, and it contains an invalid value (e.g. NULL, or random uninitialized value)
- The variable object (struct) has a child which is also a pointer to a struct.

-var-list-children returns an error. GDB tries to dereference the top-level pointer to get the value of the child one, in order to go determine the real type of the pointed object using RTTI. In the process, value_ind in value_rtti_indirect_type throws an error that is never caught.

What happens then is that the variable object for the child is half-created. If the top-level pointer is set to a sensible value and we try to do -var-list-children again, we get a "Duplicate variable object name" error.

The attached test case shows the problem.
Comment 1 Simon Marchi 2014-09-19 21:25:10 UTC
Created attachment 7797 [details]
Test case (the .exp)
Comment 2 Sourceware Commits 2015-01-23 18:00:49 UTC
The master branch has been updated by Simon Marchi <simark@sourceware.org>:

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

commit f7e5394d614db4456fc0d9598bbfa936cc7941af
Author: Simon Marchi <simon.marchi@ericsson.com>
Date:   Fri Jan 23 12:59:24 2015 -0500

    Catch exception in value_rtti_indirect_type
    
    In the situation described in bug 17416 [1]:
    
      * "set print object" is on;
      * The variable object is a pointer to a struct, and it contains an
        invalid value (e.g. NULL, or random uninitialized value);
      * The variable object (struct) has a child which is also a pointer to a
        struct;
      * We try to use "-var-list-children".
    
    ... an exception thrown in value_ind can propagate too far and leave an
    half-built variable object, leading to a wrong state. This patch adds a
    TRY_CATCH to catch it and makes value_rtti_indirect_type return NULL in
    that case, meaning that the type of the pointed object could not be
    found.
    
    A test for the fix is also added.
    
    New in v2:
    
      * Added test.
      * Restructured "catch" code.
      * Added details about the bug in commit log.
    
    gdb/Changelog:
    
    	* valops.c (value_rtti_indirect_type): Catch exception thrown by
    	value_ind.
    
    gdb/testsuite/ChangeLog
    
    	* gdb.mi/mi-var-list-children-invalid-grandchild.c: New file.
    	* gdb.mi/mi-var-list-children-invalid-grandchild.exp: New file.
    
    [1] https://sourceware.org/bugzilla/show_bug.cgi?id=17416
Comment 3 Simon Marchi 2015-01-23 18:07:57 UTC
Fixed.
Comment 4 Marc-Andre Laperle 2015-05-02 13:32:32 UTC
What's the target milestone, 7.9?
Comment 5 Simon Marchi 2015-05-03 03:18:37 UTC
This was not included in the 7.9 branch, so no it's not in gdb 7.9. If you want, we could request to include it in 7.9.1 which should be out soon.
Comment 6 Marc-Andre Laperle 2015-05-03 14:44:54 UTC
(In reply to Simon Marchi from comment #5)
> This was not included in the 7.9 branch, so no it's not in gdb 7.9. If you
> want, we could request to include it in 7.9.1 which should be out soon.

No it's OK. I thought it was maybe in 7.9 and the field wasn't updated.