Summary: | -var-list-children fails with "set print object on" and invalid/NULL value | ||
---|---|---|---|
Product: | gdb | Reporter: | Simon Marchi <simark> |
Component: | gdb | Assignee: | 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) |
Created attachment 7797 [details]
Test case (the .exp)
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 Fixed. What's the target milestone, 7.9? 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. (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. |
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.