This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] gdb: Guard against undefined behaviour in mi-vla-fortran.exp


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

commit 37a8db1a336ce78a46bf7f303e47e17b2a1bf694
Author: Andrew Burgess <andrew.burgess@embecosm.com>
Date:   Fri Dec 11 19:58:50 2015 +0000

    gdb: Guard against undefined behaviour in mi-vla-fortran.exp
    
    The test gdb.mi/mi-vla-fortran.exp reveals an issue with the DWARF
    generated by gfortran.
    
    In the test a pointer variable 'pvla2' is created:
        real, pointer :: pvla2 (:, :)
    
    Initially this variable will be unassociated, so something like this:
        l = associated(pvla2)
    
    should return false.
    
    In the test gdb stops at a point _before_ pvla2 is associated with
    anything, and we then try to print pvla2, the expectation is that gdb
    should reply <not associated>.
    
    The problem is that the data the DWARF directs gdb to read (to identify
    if the variable is associated or not) is not initialised until the first
    time pvla2 is accessed.
    
    As a result gdb ends up reading uninitialised memory, sometimes this
    uninitialised memory indicates the variable is associated (when it's
    not).  This first mistake can lead to a cascade of errors, reading
    uninitialised memory, with the result that gdb builds an invalid type to
    associate with the variable pvla2.
    
    In some cases, this invalid type can be very large, which when we try to
    print pvla2 causes gdb to allocate a large amount of memory.
    
    A recent commit added a new gdb variable 'max-value-size', which
    prevents gdb from allocating values of extreme size.  As a result
    directly trying to print pvla2 will now now error rather than allocate a
    large amount of memory.
    
    However, some of the later tests create a varobj for pvla2, and then
    ask for the children of that varobj to be displayed.  In the case where
    an invalid type has been computed for pvla2 then the number of children
    can be wrong, and very big, in which case trying to display all of these
    children can cause gdb to consume an excessive amount of memory.
    
    This commit first detects if printing pvla2 triggers the max-value-size
    error, if it does then we avoid all the follow on tests relating to the
    unassociated pvla2, which avoids the second error printing the varobj
    children.
    
    gdb/testsuite/ChangeLog:
    
    	* gdb.mi/mi-vla-fortran.exp: Add XFAIL for accessing unassociated
    	pointer.  Don't perform further tests on the unassociated pointer
    	if the first test fails.

Diff:
---
 gdb/testsuite/ChangeLog                 |  6 +++++
 gdb/testsuite/gdb.mi/mi-vla-fortran.exp | 48 ++++++++++++++++++++++-----------
 2 files changed, 38 insertions(+), 16 deletions(-)

diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index d8fe181..6af0e48 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,11 @@
 2016-02-01  Andrew Burgess  <andrew.burgess@embecosm.com>
 
+	* gdb.mi/mi-vla-fortran.exp: Add XFAIL for accessing unassociated
+	pointer.  Don't perform further tests on the unassociated pointer
+	if the first test fails.
+
+2016-02-01  Andrew Burgess  <andrew.burgess@embecosm.com>
+
 	* gdb.base/max-value-size.c: New file.
 	* gdb.base/max-value-size.exp: New file.
 	* gdb.base/huge.exp: Disable max-value-size for this test.
diff --git a/gdb/testsuite/gdb.mi/mi-vla-fortran.exp b/gdb/testsuite/gdb.mi/mi-vla-fortran.exp
index da52d39..333b71a 100644
--- a/gdb/testsuite/gdb.mi/mi-vla-fortran.exp
+++ b/gdb/testsuite/gdb.mi/mi-vla-fortran.exp
@@ -128,24 +128,40 @@ mi_create_breakpoint "-t vla.f90:$bp_lineno" 6 "del" "vla" ".*vla.f90" \
 mi_run_cmd
 mi_expect_stop "breakpoint-hit" "vla" "" ".*vla.f90" "$bp_lineno" \
   { "" "disp=\"del\"" } "run to breakpoint at line $bp_lineno"
-mi_gdb_test "580-data-evaluate-expression pvla2" \
-  "580\\^done,value=\"<not associated>\"" "evaluate not associated vla"
-
-mi_create_varobj_checked pvla2_not_associated pvla2 "<not associated>" \
-  "create local variable pvla2_not_associated"
-mi_gdb_test "581-var-info-type pvla2_not_associated" \
-  "581\\^done,type=\"<not associated>\"" \
-  "info type variable pvla2_not_associated"
-mi_gdb_test "582-var-show-format pvla2_not_associated" \
-  "582\\^done,format=\"natural\"" \
-  "show format variable pvla2_not_associated"
-mi_gdb_test "583-var-evaluate-expression pvla2_not_associated" \
-  "583\\^done,value=\"\\\[0\\\]\"" \
-  "eval variable pvla2_not_associated"
-mi_list_array_varobj_children_with_index "pvla2_not_associated" "0" "1" \
-    "real\\\(kind=4\\\)" "get children of pvla2_not_associated"
 
 
+set test "evaluate not associated vla"
+send_gdb "580-data-evaluate-expression pvla2\n"
+gdb_expect {
+    -re "580\\^done,value=\"<not associated>\".*${mi_gdb_prompt}$" {
+	pass $test
+
+	mi_create_varobj_checked pvla2_not_associated pvla2 "<not associated>" \
+	    "create local variable pvla2_not_associated"
+	mi_gdb_test "581-var-info-type pvla2_not_associated" \
+	    "581\\^done,type=\"<not associated>\"" \
+	    "info type variable pvla2_not_associated"
+	mi_gdb_test "582-var-show-format pvla2_not_associated" \
+	    "582\\^done,format=\"natural\"" \
+	    "show format variable pvla2_not_associated"
+	mi_gdb_test "583-var-evaluate-expression pvla2_not_associated" \
+	    "583\\^done,value=\"\\\[0\\\]\"" \
+	    "eval variable pvla2_not_associated"
+	mi_list_array_varobj_children_with_index "pvla2_not_associated" "0" "1" \
+	    "real\\\(kind=4\\\)" "get children of pvla2_not_associated"
+    }
+    -re "580\\^error,msg=\"value contents too large \\(\[0-9\]+ bytes\\).*${mi_gdb_prompt}$" {
+	# Undefined behaviour in gfortran.
+	xfail $test
+    }
+    -re "${mi_gdb_prompt}$" {
+	fail $test
+    }
+    timeout {
+	fail "$test (timeout)"
+    }
+}
+
 set bp_lineno [gdb_get_line_number "pvla2-associated"]
 mi_create_breakpoint "-t vla.f90:$bp_lineno" 7 "del" "vla" ".*vla.f90" \
   $bp_lineno $hex "insert breakpoint at line $bp_lineno"


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]