
Invoking -var-info-path-expression on a dynamic varobj lead either in wrong (nonsense) result or to a segmentation fault in cplus_describe_child(). This was caused by the fact that varobj_get_path_expr() called cplus_path_expr_of_child() ignoring the fact the parent of the variable is dynamic. Then, cplus_describe_child() accessed the underlaying C type members by index, causing (i) either wrong (nonsense) expression being returned (since dynamic child may be completely arbibtrary value) or (ii) segmentation fault (in case the index higher than number of underlaying C type members. This fixes the problem by checking whether a varobj is a child of a dynamic varobj and, if so, reporting an error as described in documentation. gdb/ChangeLog: * varobj.c (varobj_get_path_expr_parent): Report an error if parent is a dynamic varobj. gdb/testsuite/Changelog: * gdb.python/py-mi-var-info-path-expression.c: New file. * gdb.python/py-mi-var-info-path-expression.py: New file. * gdb.python/py-mi-var-info-path-expression.exp: New file.
88 lines
2.5 KiB
Text
88 lines
2.5 KiB
Text
# Copyright (C) 2018 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/>.
|
|
|
|
# Tests whether -var-info-path-expression fails as documented when
|
|
# invoked on a dynamic varobj.
|
|
|
|
load_lib mi-support.exp
|
|
set MIFLAGS "-i=mi"
|
|
|
|
gdb_exit
|
|
if {[mi_gdb_start]} {
|
|
continue
|
|
}
|
|
|
|
#
|
|
# Start here
|
|
#
|
|
standard_testfile
|
|
|
|
if {[gdb_compile "$srcdir/$subdir/$srcfile" $binfile executable {debug}] != "" } {
|
|
return -1
|
|
}
|
|
|
|
mi_gdb_test "source ${srcdir}/${subdir}/${testfile}.py" \
|
|
".*\\^done" \
|
|
"load python file"
|
|
|
|
mi_gdb_test "-enable-pretty-printing" \
|
|
"\\^done" \
|
|
"-enable-pretty-printing"
|
|
|
|
mi_gdb_test "set python print-stack full" \
|
|
".*\\^done" \
|
|
"set python print-stack full"
|
|
|
|
|
|
mi_run_to_main
|
|
|
|
|
|
mi_continue_to_line [gdb_get_line_number "next line" ${srcfile}] \
|
|
"step to breakpoint"
|
|
|
|
mi_gdb_test "-var-create c1 * &c1" \
|
|
"\\^done.*" \
|
|
"-var-create c1 * &c1"
|
|
|
|
mi_gdb_test "-var-info-path-expression c1" \
|
|
"\\^done,path_expr=\"&c1\"" \
|
|
"-var-info-path-expression c1"
|
|
|
|
mi_gdb_test "-var-list-children c1" \
|
|
"\\^done,numchild=\"2\",children=.child=\{name=\"c1.car\".*child=\{name=\"c1.cdr\".*" \
|
|
"-var-list-children c1"
|
|
|
|
mi_gdb_test "-var-info-path-expression c1.cdr" \
|
|
"\\^error,msg=\".*\"" \
|
|
"-var-info-path-expression c1.cdr"
|
|
|
|
mi_gdb_test "-var-list-children c1.cdr" \
|
|
"\\^done,numchild=\"2\",children=.child=\{name=\"c1.cdr.car\".*child=\{name=\"c1.cdr.cdr\".*" \
|
|
"-var-list-children c1.cdr"
|
|
|
|
mi_gdb_test "-var-info-path-expression c1.cdr.cdr" \
|
|
"\\^error,msg=\".*\"" \
|
|
"-var-info-path-expression c1.cdr.cdr"
|
|
|
|
mi_gdb_test "-var-list-children c1.car" \
|
|
"\\^done,numchild=\"1\",children=.child=\{name=\"c1.car.atom\".*" \
|
|
"-var-list-children c1.car"
|
|
|
|
mi_gdb_test "-var-list-children c1.car.atom" \
|
|
"\\^done,numchild=\"1\",children=.child=\{name=\"c1.car.atom.ival\".*" \
|
|
"-var-list-children c1.car.atom"
|
|
|
|
mi_gdb_test "-var-info-path-expression c1.car.atom.ival" \
|
|
"\\^error,msg=\".*\"" \
|
|
"-var-info-path-expression c1.car.atom.ival"
|