* [PATCH] Catch exception in value_rtti_indirect_type @ 2014-09-20 1:02 Simon Marchi 2014-10-20 17:50 ` Simon Marchi 2014-12-04 17:47 ` Pedro Alves 0 siblings, 2 replies; 10+ messages in thread From: Simon Marchi @ 2014-09-20 1:02 UTC (permalink / raw) To: gdb-patches; +Cc: simon.marchi, Simon Marchi In the situation described in bug 17416 [1], 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. If you want, I can also integrate the test case provided in the bug description. I just don't know how to name it without giving it a ridiculously long name such as mi-var-list-children-with-print-object-on-and-a-null-pointer-to-a-structure-that-contains-a-pointer-to-a-structure.exp. I tested the change on my machine, Ubuntu 14.10 x86-64. gdb/Changelog: * valops.c (value_rtti_indirect_type): Catch exception thrown by value_ind. [1] https://sourceware.org/bugzilla/show_bug.cgi?id=17416 --- gdb/valops.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/gdb/valops.c b/gdb/valops.c index e1decf0..c1a0c86 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -3609,7 +3609,18 @@ value_rtti_indirect_type (struct value *v, int *full, if (TYPE_CODE (type) == TYPE_CODE_REF) target = coerce_ref (v); else if (TYPE_CODE (type) == TYPE_CODE_PTR) - target = value_ind (v); + { + volatile struct gdb_exception except; + + TRY_CATCH (except, RETURN_MASK_ERROR) + { + target = value_ind (v); + } + if (except.error == MEMORY_ERROR) + return NULL; + else if (except.error != GDB_NO_ERROR) + throw_exception (except); + } else return NULL; -- 2.1.0 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] Catch exception in value_rtti_indirect_type 2014-09-20 1:02 [PATCH] Catch exception in value_rtti_indirect_type Simon Marchi @ 2014-10-20 17:50 ` Simon Marchi 2014-12-01 13:35 ` Simon Marchi 2014-12-04 17:47 ` Pedro Alves 1 sibling, 1 reply; 10+ messages in thread From: Simon Marchi @ 2014-10-20 17:50 UTC (permalink / raw) To: gdb-patches; +Cc: simon.marchi On 2014-09-19 09:02 PM, Simon Marchi wrote: > In the situation described in bug 17416 [1], 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. > > If you want, I can also integrate the test case provided in the bug > description. I just don't know how to name it without giving it a > ridiculously long name such as > mi-var-list-children-with-print-object-on-and-a-null-pointer-to-a-structure-that-contains-a-pointer-to-a-structure.exp. > > I tested the change on my machine, Ubuntu 14.10 x86-64. > > gdb/Changelog: > > * valops.c (value_rtti_indirect_type): Catch exception thrown by > value_ind. > > [1] https://sourceware.org/bugzilla/show_bug.cgi?id=17416 > --- > gdb/valops.c | 13 ++++++++++++- > 1 file changed, 12 insertions(+), 1 deletion(-) > > diff --git a/gdb/valops.c b/gdb/valops.c > index e1decf0..c1a0c86 100644 > --- a/gdb/valops.c > +++ b/gdb/valops.c > @@ -3609,7 +3609,18 @@ value_rtti_indirect_type (struct value *v, int *full, > if (TYPE_CODE (type) == TYPE_CODE_REF) > target = coerce_ref (v); > else if (TYPE_CODE (type) == TYPE_CODE_PTR) > - target = value_ind (v); > + { > + volatile struct gdb_exception except; > + > + TRY_CATCH (except, RETURN_MASK_ERROR) > + { > + target = value_ind (v); > + } > + if (except.error == MEMORY_ERROR) > + return NULL; > + else if (except.error != GDB_NO_ERROR) > + throw_exception (except); > + } > else > return NULL; Ping ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] Catch exception in value_rtti_indirect_type 2014-10-20 17:50 ` Simon Marchi @ 2014-12-01 13:35 ` Simon Marchi 0 siblings, 0 replies; 10+ messages in thread From: Simon Marchi @ 2014-12-01 13:35 UTC (permalink / raw) To: gdb-patches; +Cc: simon.marchi On 2014-10-20 01:50 PM, Simon Marchi wrote: > On 2014-09-19 09:02 PM, Simon Marchi wrote: >> In the situation described in bug 17416 [1], 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. >> >> If you want, I can also integrate the test case provided in the bug >> description. I just don't know how to name it without giving it a >> ridiculously long name such as >> mi-var-list-children-with-print-object-on-and-a-null-pointer-to-a-structure-that-contains-a-pointer-to-a-structure.exp. >> >> I tested the change on my machine, Ubuntu 14.10 x86-64. >> >> gdb/Changelog: >> >> * valops.c (value_rtti_indirect_type): Catch exception thrown by >> value_ind. >> >> [1] https://sourceware.org/bugzilla/show_bug.cgi?id=17416 >> --- >> gdb/valops.c | 13 ++++++++++++- >> 1 file changed, 12 insertions(+), 1 deletion(-) >> >> diff --git a/gdb/valops.c b/gdb/valops.c >> index e1decf0..c1a0c86 100644 >> --- a/gdb/valops.c >> +++ b/gdb/valops.c >> @@ -3609,7 +3609,18 @@ value_rtti_indirect_type (struct value *v, int *full, >> if (TYPE_CODE (type) == TYPE_CODE_REF) >> target = coerce_ref (v); >> else if (TYPE_CODE (type) == TYPE_CODE_PTR) >> - target = value_ind (v); >> + { >> + volatile struct gdb_exception except; >> + >> + TRY_CATCH (except, RETURN_MASK_ERROR) >> + { >> + target = value_ind (v); >> + } >> + if (except.error == MEMORY_ERROR) >> + return NULL; >> + else if (except.error != GDB_NO_ERROR) >> + throw_exception (except); >> + } >> else >> return NULL; > > Ping > Ping. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] Catch exception in value_rtti_indirect_type 2014-09-20 1:02 [PATCH] Catch exception in value_rtti_indirect_type Simon Marchi 2014-10-20 17:50 ` Simon Marchi @ 2014-12-04 17:47 ` Pedro Alves 2014-12-05 20:32 ` [PATCH v2] " Simon Marchi 1 sibling, 1 reply; 10+ messages in thread From: Pedro Alves @ 2014-12-04 17:47 UTC (permalink / raw) To: Simon Marchi, gdb-patches; +Cc: simon.marchi On 09/20/2014 02:02 AM, Simon Marchi wrote: > In the situation described in bug 17416 [1], Could you paste that in the commit log please? > 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. > > If you want, I can also integrate the test case provided in the bug Yes please. > description. I just don't know how to name it without giving it a > ridiculously long name such as > mi-var-list-children-with-print-object-on-and-a-null-pointer-to-a-structure-that-contains-a-pointer-to-a-structure.exp. Perhaps mi-var-list-children-invalid-grandchild.exp. > > I tested the change on my machine, Ubuntu 14.10 x86-64. > > gdb/Changelog: > > * valops.c (value_rtti_indirect_type): Catch exception thrown by > value_ind. > > [1] https://sourceware.org/bugzilla/show_bug.cgi?id=17416 > --- > gdb/valops.c | 13 ++++++++++++- > 1 file changed, 12 insertions(+), 1 deletion(-) > > diff --git a/gdb/valops.c b/gdb/valops.c > index e1decf0..c1a0c86 100644 > --- a/gdb/valops.c > +++ b/gdb/valops.c > @@ -3609,7 +3609,18 @@ value_rtti_indirect_type (struct value *v, int *full, > if (TYPE_CODE (type) == TYPE_CODE_REF) > target = coerce_ref (v); > else if (TYPE_CODE (type) == TYPE_CODE_PTR) > - target = value_ind (v); > + { > + volatile struct gdb_exception except; > + > + TRY_CATCH (except, RETURN_MASK_ERROR) > + { > + target = value_ind (v); > + } > + if (except.error == MEMORY_ERROR) > + return NULL; > + else if (except.error != GDB_NO_ERROR) > + throw_exception (except); Indentation looks odd. But, could you write it like this instead ? volatile struct gdb_exception except; TRY_CATCH (except, RETURN_MASK_ERROR) { target = value_ind (v); } if (except.reason < 0) { if (except.error == MEMORY_ERROR) { /* Add comment here. */ return NULL; } throw_exception (except); } Thanks, Pedro Alves ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2] Catch exception in value_rtti_indirect_type 2014-12-04 17:47 ` Pedro Alves @ 2014-12-05 20:32 ` Simon Marchi 2015-01-23 0:13 ` Simon Marchi 2015-01-23 14:35 ` Pedro Alves 0 siblings, 2 replies; 10+ messages in thread From: Simon Marchi @ 2014-12-05 20:32 UTC (permalink / raw) To: Pedro Alves, gdb-patches; +Cc: simon.marchi On 2014-12-04 12:47 PM, Pedro Alves wrote: > On 09/20/2014 02:02 AM, Simon Marchi wrote: >> In the situation described in bug 17416 [1], > > Could you paste that in the commit log please? Done. >> 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. >> >> If you want, I can also integrate the test case provided in the bug > > Yes please. Done. >> description. I just don't know how to name it without giving it a >> ridiculously long name such as >> mi-var-list-children-with-print-object-on-and-a-null-pointer-to-a-structure-that-contains-a-pointer-to-a-structure.exp. > > Perhaps mi-var-list-children-invalid-grandchild.exp. Perfect, thanks. >> >> I tested the change on my machine, Ubuntu 14.10 x86-64. >> >> gdb/Changelog: >> >> * valops.c (value_rtti_indirect_type): Catch exception thrown by >> value_ind. >> >> [1] https://sourceware.org/bugzilla/show_bug.cgi?id=17416 >> --- >> gdb/valops.c | 13 ++++++++++++- >> 1 file changed, 12 insertions(+), 1 deletion(-) >> >> diff --git a/gdb/valops.c b/gdb/valops.c >> index e1decf0..c1a0c86 100644 >> --- a/gdb/valops.c >> +++ b/gdb/valops.c >> @@ -3609,7 +3609,18 @@ value_rtti_indirect_type (struct value *v, int *full, >> if (TYPE_CODE (type) == TYPE_CODE_REF) >> target = coerce_ref (v); >> else if (TYPE_CODE (type) == TYPE_CODE_PTR) >> - target = value_ind (v); >> + { >> + volatile struct gdb_exception except; >> + >> + TRY_CATCH (except, RETURN_MASK_ERROR) >> + { >> + target = value_ind (v); >> + } >> + if (except.error == MEMORY_ERROR) >> + return NULL; >> + else if (except.error != GDB_NO_ERROR) >> + throw_exception (except); > > Indentation looks odd. But, could you write it like this instead ? > > volatile struct gdb_exception except; > > TRY_CATCH (except, RETURN_MASK_ERROR) > { > target = value_ind (v); > } > if (except.reason < 0) > { > if (except.error == MEMORY_ERROR) > { > /* Add comment here. */ > return NULL; > } > throw_exception (except); > } Indeed it was odd. I took your suggestion. Here is the updated v2: From 4f3924e505d6343c430292e2261d146e66d8799a Mon Sep 17 00:00:00 2001 From: Simon Marchi <simon.marchi@ericsson.com> Date: Fri, 19 Sep 2014 21:02:33 -0400 Subject: [PATCH v2] 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 --- .../mi-var-list-children-invalid-grandchild.c | 46 ++++++++++++++++ .../mi-var-list-children-invalid-grandchild.exp | 63 ++++++++++++++++++++++ gdb/valops.c | 20 ++++++- 3 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 gdb/testsuite/gdb.mi/mi-var-list-children-invalid-grandchild.c create mode 100644 gdb/testsuite/gdb.mi/mi-var-list-children-invalid-grandchild.exp diff --git a/gdb/testsuite/gdb.mi/mi-var-list-children-invalid-grandchild.c b/gdb/testsuite/gdb.mi/mi-var-list-children-invalid-grandchild.c new file mode 100644 index 0000000..b67d875 --- /dev/null +++ b/gdb/testsuite/gdb.mi/mi-var-list-children-invalid-grandchild.c @@ -0,0 +1,46 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2014 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +struct inner +{ + int a; +}; + +struct outer +{ + struct inner *inner; +}; + +int main (void) +{ + struct inner inner; + struct outer outer; + struct outer *p_outer; + + inner.a = 42; + outer.inner = &inner; + + /* We force p_outer to an invalid value, but this also happens naturally + * when a variable has not been initialized. */ + + p_outer = 0; + /* p_outer set to invalid value */ + p_outer = &outer; + /* p_outer set to valid value */ + + return 0; +} diff --git a/gdb/testsuite/gdb.mi/mi-var-list-children-invalid-grandchild.exp b/gdb/testsuite/gdb.mi/mi-var-list-children-invalid-grandchild.exp new file mode 100644 index 0000000..ed8460d --- /dev/null +++ b/gdb/testsuite/gdb.mi/mi-var-list-children-invalid-grandchild.exp @@ -0,0 +1,63 @@ +# Copyright 2014 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# This is a regression test for bug 17416 +# https://sourceware.org/bugzilla/show_bug.cgi?id=17416 + +load_lib mi-support.exp +set MIFLAGS "-i=mi" + +gdb_exit +if [mi_gdb_start] { + continue +} + +standard_testfile + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + untested mi-var-list-children-invalid-grandchild.exp + return -1 +} + +mi_delete_breakpoints +mi_gdb_reinitialize_dir $srcdir/$subdir +mi_gdb_load ${binfile} + +set line_invalid_pointer_value [gdb_get_line_number "p_outer set to invalid value"] +set line_valid_pointer_value [gdb_get_line_number "p_outer set to valid value"] + +# set print object on +mi_gdb_test "-interpreter-exec console \"set print object on\"" \ + "(.*=cmd-param-changed,param=\"print object\",value=\"on\".*|)\\^done" \ + "set print object on" + +mi_runto main + +mi_continue_to_line $line_invalid_pointer_value "continue to invalid pointer value" + +# Create variable object +mi_gdb_test "-var-create var1 * p_outer" "\\^done,name=\"var1\",numchild=\"1\",value=\"0x0\",type=\"struct outer \\*\",thread-id=\"1\",has_more=\"0\"" "create variable object" + +# List children while the pointer is uninitialized. +# Note: if you remove this -var-list-children, the second one will work. +mi_gdb_test "-var-list-children var1" "\\^done,numchild=\"1\",children=\\\[child={name=\"var1.inner\",exp=\"inner\",numchild=\"1\",type=\"struct inner \\*\",thread-id=\"1\"}\\\],has_more=\"0\"" "list children #1" + +mi_continue_to_line $line_valid_pointer_value "continue to valid pointer value" + +# Update and list children again +mi_gdb_test "-var-update var1" "\\^done,changelist=\\\[{name=\"var1\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"},{name=\"var1.inner\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"}\\\]" "update variable object" + +mi_gdb_test "-var-list-children var1" "\\^done,numchild=\"1\",children=\\\[child={name=\"var1.inner\",exp=\"inner\",numchild=\"1\",type=\"struct inner \\*\",thread-id=\"1\"}\\\],has_more=\"0\"" "list children #2" + diff --git a/gdb/valops.c b/gdb/valops.c index 4125fc0..d806f27 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -3609,7 +3609,25 @@ value_rtti_indirect_type (struct value *v, int *full, if (TYPE_CODE (type) == TYPE_CODE_REF) target = coerce_ref (v); else if (TYPE_CODE (type) == TYPE_CODE_PTR) - target = value_ind (v); + { + volatile struct gdb_exception except; + + TRY_CATCH (except, RETURN_MASK_ERROR) + { + target = value_ind (v); + } + if (except.reason < 0) + { + if (except.error == MEMORY_ERROR) + { + /* value_ind threw a memory error. The pointer is NULL or + contains an uninitialized value: we can't determine any + type. */ + return NULL; + } + throw_exception (except); + } + } else return NULL; -- 2.1.3 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2] Catch exception in value_rtti_indirect_type 2014-12-05 20:32 ` [PATCH v2] " Simon Marchi @ 2015-01-23 0:13 ` Simon Marchi 2015-01-23 14:35 ` Pedro Alves 1 sibling, 0 replies; 10+ messages in thread From: Simon Marchi @ 2015-01-23 0:13 UTC (permalink / raw) To: Pedro Alves, gdb-patches; +Cc: simon.marchi On 14-12-05 03:32 PM, Simon Marchi wrote: > On 2014-12-04 12:47 PM, Pedro Alves wrote: >> On 09/20/2014 02:02 AM, Simon Marchi wrote: >>> In the situation described in bug 17416 [1], >> >> Could you paste that in the commit log please? > > Done. > >>> 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. >>> >>> If you want, I can also integrate the test case provided in the bug >> >> Yes please. > > Done. > >>> description. I just don't know how to name it without giving it a >>> ridiculously long name such as >>> mi-var-list-children-with-print-object-on-and-a-null-pointer-to-a-structure-that-contains-a-pointer-to-a-structure.exp. >> >> Perhaps mi-var-list-children-invalid-grandchild.exp. > > Perfect, thanks. > >>> >>> I tested the change on my machine, Ubuntu 14.10 x86-64. >>> >>> gdb/Changelog: >>> >>> * valops.c (value_rtti_indirect_type): Catch exception thrown by >>> value_ind. >>> >>> [1] https://sourceware.org/bugzilla/show_bug.cgi?id=17416 >>> --- >>> gdb/valops.c | 13 ++++++++++++- >>> 1 file changed, 12 insertions(+), 1 deletion(-) >>> >>> diff --git a/gdb/valops.c b/gdb/valops.c >>> index e1decf0..c1a0c86 100644 >>> --- a/gdb/valops.c >>> +++ b/gdb/valops.c >>> @@ -3609,7 +3609,18 @@ value_rtti_indirect_type (struct value *v, int *full, >>> if (TYPE_CODE (type) == TYPE_CODE_REF) >>> target = coerce_ref (v); >>> else if (TYPE_CODE (type) == TYPE_CODE_PTR) >>> - target = value_ind (v); >>> + { >>> + volatile struct gdb_exception except; >>> + >>> + TRY_CATCH (except, RETURN_MASK_ERROR) >>> + { >>> + target = value_ind (v); >>> + } >>> + if (except.error == MEMORY_ERROR) >>> + return NULL; >>> + else if (except.error != GDB_NO_ERROR) >>> + throw_exception (except); >> >> Indentation looks odd. But, could you write it like this instead ? >> >> volatile struct gdb_exception except; >> >> TRY_CATCH (except, RETURN_MASK_ERROR) >> { >> target = value_ind (v); >> } >> if (except.reason < 0) >> { >> if (except.error == MEMORY_ERROR) >> { >> /* Add comment here. */ >> return NULL; >> } >> throw_exception (except); >> } > > Indeed it was odd. I took your suggestion. Here is the updated v2: > > From 4f3924e505d6343c430292e2261d146e66d8799a Mon Sep 17 00:00:00 2001 > From: Simon Marchi <simon.marchi@ericsson.com> > Date: Fri, 19 Sep 2014 21:02:33 -0400 > Subject: [PATCH v2] 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 > --- > .../mi-var-list-children-invalid-grandchild.c | 46 ++++++++++++++++ > .../mi-var-list-children-invalid-grandchild.exp | 63 ++++++++++++++++++++++ > gdb/valops.c | 20 ++++++- > 3 files changed, 128 insertions(+), 1 deletion(-) > create mode 100644 gdb/testsuite/gdb.mi/mi-var-list-children-invalid-grandchild.c > create mode 100644 gdb/testsuite/gdb.mi/mi-var-list-children-invalid-grandchild.exp > > diff --git a/gdb/testsuite/gdb.mi/mi-var-list-children-invalid-grandchild.c b/gdb/testsuite/gdb.mi/mi-var-list-children-invalid-grandchild.c > new file mode 100644 > index 0000000..b67d875 > --- /dev/null > +++ b/gdb/testsuite/gdb.mi/mi-var-list-children-invalid-grandchild.c > @@ -0,0 +1,46 @@ > +/* This testcase is part of GDB, the GNU debugger. > + > + Copyright 2014 Free Software Foundation, Inc. > + > + This program is free software; you can redistribute it and/or modify > + it under the terms of the GNU General Public License as published by > + the Free Software Foundation; either version 3 of the License, or > + (at your option) any later version. > + > + This program is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + GNU General Public License for more details. > + > + You should have received a copy of the GNU General Public License > + along with this program. If not, see <http://www.gnu.org/licenses/>. */ > + > +struct inner > +{ > + int a; > +}; > + > +struct outer > +{ > + struct inner *inner; > +}; > + > +int main (void) > +{ > + struct inner inner; > + struct outer outer; > + struct outer *p_outer; > + > + inner.a = 42; > + outer.inner = &inner; > + > + /* We force p_outer to an invalid value, but this also happens naturally > + * when a variable has not been initialized. */ > + > + p_outer = 0; > + /* p_outer set to invalid value */ > + p_outer = &outer; > + /* p_outer set to valid value */ > + > + return 0; > +} > diff --git a/gdb/testsuite/gdb.mi/mi-var-list-children-invalid-grandchild.exp b/gdb/testsuite/gdb.mi/mi-var-list-children-invalid-grandchild.exp > new file mode 100644 > index 0000000..ed8460d > --- /dev/null > +++ b/gdb/testsuite/gdb.mi/mi-var-list-children-invalid-grandchild.exp > @@ -0,0 +1,63 @@ > +# Copyright 2014 Free Software Foundation, Inc. > + > +# This program is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; either version 3 of the License, or > +# (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program. If not, see <http://www.gnu.org/licenses/>. > + > +# This is a regression test for bug 17416 > +# https://sourceware.org/bugzilla/show_bug.cgi?id=17416 > + > +load_lib mi-support.exp > +set MIFLAGS "-i=mi" > + > +gdb_exit > +if [mi_gdb_start] { > + continue > +} > + > +standard_testfile > + > +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { > + untested mi-var-list-children-invalid-grandchild.exp > + return -1 > +} > + > +mi_delete_breakpoints > +mi_gdb_reinitialize_dir $srcdir/$subdir > +mi_gdb_load ${binfile} > + > +set line_invalid_pointer_value [gdb_get_line_number "p_outer set to invalid value"] > +set line_valid_pointer_value [gdb_get_line_number "p_outer set to valid value"] > + > +# set print object on > +mi_gdb_test "-interpreter-exec console \"set print object on\"" \ > + "(.*=cmd-param-changed,param=\"print object\",value=\"on\".*|)\\^done" \ > + "set print object on" > + > +mi_runto main > + > +mi_continue_to_line $line_invalid_pointer_value "continue to invalid pointer value" > + > +# Create variable object > +mi_gdb_test "-var-create var1 * p_outer" "\\^done,name=\"var1\",numchild=\"1\",value=\"0x0\",type=\"struct outer \\*\",thread-id=\"1\",has_more=\"0\"" "create variable object" > + > +# List children while the pointer is uninitialized. > +# Note: if you remove this -var-list-children, the second one will work. > +mi_gdb_test "-var-list-children var1" "\\^done,numchild=\"1\",children=\\\[child={name=\"var1.inner\",exp=\"inner\",numchild=\"1\",type=\"struct inner \\*\",thread-id=\"1\"}\\\],has_more=\"0\"" "list children #1" > + > +mi_continue_to_line $line_valid_pointer_value "continue to valid pointer value" > + > +# Update and list children again > +mi_gdb_test "-var-update var1" "\\^done,changelist=\\\[{name=\"var1\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"},{name=\"var1.inner\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"}\\\]" "update variable object" > + > +mi_gdb_test "-var-list-children var1" "\\^done,numchild=\"1\",children=\\\[child={name=\"var1.inner\",exp=\"inner\",numchild=\"1\",type=\"struct inner \\*\",thread-id=\"1\"}\\\],has_more=\"0\"" "list children #2" > + > diff --git a/gdb/valops.c b/gdb/valops.c > index 4125fc0..d806f27 100644 > --- a/gdb/valops.c > +++ b/gdb/valops.c > @@ -3609,7 +3609,25 @@ value_rtti_indirect_type (struct value *v, int *full, > if (TYPE_CODE (type) == TYPE_CODE_REF) > target = coerce_ref (v); > else if (TYPE_CODE (type) == TYPE_CODE_PTR) > - target = value_ind (v); > + { > + volatile struct gdb_exception except; > + > + TRY_CATCH (except, RETURN_MASK_ERROR) > + { > + target = value_ind (v); > + } > + if (except.reason < 0) > + { > + if (except.error == MEMORY_ERROR) > + { > + /* value_ind threw a memory error. The pointer is NULL or > + contains an uninitialized value: we can't determine any > + type. */ > + return NULL; > + } > + throw_exception (except); > + } > + } > else > return NULL; Ping. (I realized I had forgotten about this patch while reviewing my opened bugs) ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2] Catch exception in value_rtti_indirect_type 2014-12-05 20:32 ` [PATCH v2] " Simon Marchi 2015-01-23 0:13 ` Simon Marchi @ 2015-01-23 14:35 ` Pedro Alves 2015-01-23 16:35 ` Simon Marchi 1 sibling, 1 reply; 10+ messages in thread From: Pedro Alves @ 2015-01-23 14:35 UTC (permalink / raw) To: Simon Marchi, gdb-patches; +Cc: simon.marchi On 12/05/2014 08:32 PM, Simon Marchi wrote: > 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. This is OK, thanks. > +/* This testcase is part of GDB, the GNU debugger. > + > + Copyright 2014 Free Software Foundation, Inc. Recall to update this to "2014-2015" before pushing. > +++ b/gdb/testsuite/gdb.mi/mi-var-list-children-invalid-grandchild.exp > @@ -0,0 +1,63 @@ > +# Copyright 2014 Free Software Foundation, Inc. > + Please update these to "2014-2015" before pushing. Thanks, Pedro Alves ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2] Catch exception in value_rtti_indirect_type 2015-01-23 14:35 ` Pedro Alves @ 2015-01-23 16:35 ` Simon Marchi 2015-01-23 18:00 ` Pedro Alves 0 siblings, 1 reply; 10+ messages in thread From: Simon Marchi @ 2015-01-23 16:35 UTC (permalink / raw) To: Pedro Alves, gdb-patches; +Cc: simon.marchi On 15-01-23 07:33 AM, Pedro Alves wrote: > On 12/05/2014 08:32 PM, Simon Marchi wrote: > >> 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. > > This is OK, thanks. > >> +/* This testcase is part of GDB, the GNU debugger. >> + >> + Copyright 2014 Free Software Foundation, Inc. > > Recall to update this to "2014-2015" before pushing. > >> +++ b/gdb/testsuite/gdb.mi/mi-var-list-children-invalid-grandchild.exp >> @@ -0,0 +1,63 @@ >> +# Copyright 2014 Free Software Foundation, Inc. >> + > > Please update these to "2014-2015" before pushing. > > Thanks, > Pedro Alves Hmm I am now getting a /home/emaisin/src/binutils-gdb/gdb/valops.c:3625:13: error: ‘target’ may be used uninitialized in this function [-Werror=maybe-uninitialized] real_type = value_rtti_type (target, full, top, using_enc); Logically, target can't be uninitialized there because of the exception throw. I would expect gcc to be smarter about it, since throw_error is marked as noreturn. I can obviously fix it by assigning it to NULL at declaration time, but is there a better way of getting rid of the error in these cases? ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2] Catch exception in value_rtti_indirect_type 2015-01-23 16:35 ` Simon Marchi @ 2015-01-23 18:00 ` Pedro Alves 2015-01-24 1:46 ` Simon Marchi 0 siblings, 1 reply; 10+ messages in thread From: Pedro Alves @ 2015-01-23 18:00 UTC (permalink / raw) To: Simon Marchi, gdb-patches; +Cc: simon.marchi On 01/23/2015 04:00 PM, Simon Marchi wrote: > Hmm I am now getting a > > /home/emaisin/src/binutils-gdb/gdb/valops.c:3625:13: error: âtargetâ may be used uninitialized in this function [-Werror=maybe-uninitialized] > real_type = value_rtti_type (target, full, top, using_enc); > > Logically, target can't be uninitialized there because of the exception throw. I would expect gcc to be > smarter about it, since throw_error is marked as noreturn. I can obviously fix it by assigning it to NULL > at declaration time, but is there a better way of getting rid of the error in these cases? Bah. Yeah, initializing as NULL is fine. Thanks, Pedro Alves ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2] Catch exception in value_rtti_indirect_type 2015-01-23 18:00 ` Pedro Alves @ 2015-01-24 1:46 ` Simon Marchi 0 siblings, 0 replies; 10+ messages in thread From: Simon Marchi @ 2015-01-24 1:46 UTC (permalink / raw) To: Pedro Alves, gdb-patches; +Cc: simon.marchi On 15-01-23 11:48 AM, Pedro Alves wrote: > On 01/23/2015 04:00 PM, Simon Marchi wrote: > >> Hmm I am now getting a >> >> /home/emaisin/src/binutils-gdb/gdb/valops.c:3625:13: error: ‘target’ may be used uninitialized in this function [-Werror=maybe-uninitialized] >> real_type = value_rtti_type (target, full, top, using_enc); >> >> Logically, target can't be uninitialized there because of the exception throw. I would expect gcc to be >> smarter about it, since throw_error is marked as noreturn. I can obviously fix it by assigning it to NULL >> at declaration time, but is there a better way of getting rid of the error in these cases? > > Bah. Yeah, initializing as NULL is fine. > > Thanks, > Pedro Alves Thanks, pushed. ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2015-01-23 18:00 UTC | newest] Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2014-09-20 1:02 [PATCH] Catch exception in value_rtti_indirect_type Simon Marchi 2014-10-20 17:50 ` Simon Marchi 2014-12-01 13:35 ` Simon Marchi 2014-12-04 17:47 ` Pedro Alves 2014-12-05 20:32 ` [PATCH v2] " Simon Marchi 2015-01-23 0:13 ` Simon Marchi 2015-01-23 14:35 ` Pedro Alves 2015-01-23 16:35 ` Simon Marchi 2015-01-23 18:00 ` Pedro Alves 2015-01-24 1:46 ` Simon Marchi
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).