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] [D] Fix crash when debug expression enabled.


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

commit f5e6296e2194add209b546ad49039753a10242f5
Author: Iain Buclaw <ibuclaw@gdcproject.org>
Date:   Sun Jan 8 11:17:54 2017 +0100

    [D] Fix crash when debug expression enabled.
    
    While casting works as expected with expression debugging turned off,
    this seems to be an indication that the D language parser function is
    doing something wrong in the building of the expression.
    
    Without changing the grammar, using UNOP_CAST_TYPE is the right thing to
    do here, as the TypeExp handler has already wrapped the type around a
    pair of OP_TYPE opcodes.
    
    gdb/ChangeLog:
    
    	* d-exp.y (CastExpression): Emit UNOP_CAST_TYPE.
    
    gdb/testsuite/ChangeLog:
    
    	* gdb.dlang/debug-expr.exp: New file.

Diff:
---
 gdb/ChangeLog                          |  4 ++++
 gdb/d-exp.y                            |  9 +++-----
 gdb/testsuite/ChangeLog                |  4 ++++
 gdb/testsuite/gdb.dlang/debug-expr.exp | 40 ++++++++++++++++++++++++++++++++++
 4 files changed, 51 insertions(+), 6 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index fec9974..7f16a5f 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,7 @@
+2017-01-08  Iain Buclaw  <ibuclaw@gdcproject.org>
+
+	* d-exp.y (CastExpression): Emit UNOP_CAST_TYPE.
+
 2017-01-06  Yao Qi  <yao.qi@linaro.org>
 
 	* x86-linux-nat.h: Include gdb_proc_service.h.
diff --git a/gdb/d-exp.y b/gdb/d-exp.y
index 077e645..b526575 100644
--- a/gdb/d-exp.y
+++ b/gdb/d-exp.y
@@ -321,15 +321,12 @@ UnaryExpression:
 
 CastExpression:
 	CAST_KEYWORD '(' TypeExp ')' UnaryExpression
-		{ write_exp_elt_opcode (pstate, UNOP_CAST);
-		  write_exp_elt_type (pstate, $3);
-		  write_exp_elt_opcode (pstate, UNOP_CAST); }
+		{ write_exp_elt_opcode (pstate, UNOP_CAST_TYPE); }
 	/* C style cast is illegal D, but is still recognised in
 	   the grammar, so we keep this around for convenience.  */
 |	'(' TypeExp ')' UnaryExpression
-		{ write_exp_elt_opcode (pstate, UNOP_CAST);
-		  write_exp_elt_type (pstate, $2);
-		  write_exp_elt_opcode (pstate, UNOP_CAST); }
+		{ write_exp_elt_opcode (pstate, UNOP_CAST_TYPE); }
+
 ;
 
 PowExpression:
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index d12072b..8a03282 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2017-01-08  Iain Buclaw  <ibuclaw@gdcproject.org>
+
+	* gdb.dlang/debug-expr.exp: New file.
+
 2016-12-23  Luis Machado  <lgustavo@codesourcery.com>
 
 	Fix test names for the following files:
diff --git a/gdb/testsuite/gdb.dlang/debug-expr.exp b/gdb/testsuite/gdb.dlang/debug-expr.exp
new file mode 100644
index 0000000..d62dcc6
--- /dev/null
+++ b/gdb/testsuite/gdb.dlang/debug-expr.exp
@@ -0,0 +1,40 @@
+# Copyright 2017 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/>.
+
+# Test "set debug expr 1" on d expressions.
+
+if { [skip_d_tests] } { return -1 }
+
+gdb_start
+gdb_test_no_output "set language d"
+gdb_test_no_output "set debug expression 1"
+
+# Test whether the expression debug machinery accepts the expression.
+
+proc test_debug_expr { cmd output } {
+    global gdb_prompt
+
+    gdb_test_multiple $cmd "" {
+	-re ".*Invalid expression.*\r\n$gdb_prompt $" {
+	    fail $cmd
+	}
+	-re ".*\[\r\n\]$output\r\n$gdb_prompt $" {
+	    pass $cmd
+	}
+    }
+}
+
+# This caused gdb to segfault.
+test_debug_expr "print *(int*)(0)" "Cannot access memory at address 0x0"


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