summaryrefslogtreecommitdiff
path: root/gdb/expprint.c
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2012-03-21 15:16:19 +0000
committerJoel Brobecker <brobecker@gnat.com>2012-03-21 15:16:19 +0000
commit88a05594363f87bf8fa19b0832c3fa96a61cbcf6 (patch)
tree10eb1e4f0e11bc150dd54202ed2c9d9edf1db32c /gdb/expprint.c
parent7be9989f3742c1a538e5736c86165e1aa03bc563 (diff)
downloadgdb-88a05594363f87bf8fa19b0832c3fa96a61cbcf6.tar.gz
SEGV during AX eval of OP_DOUBLE (unsupported)
To reproduce the problem, simply try the following with any program: (gdb) maintenance agent-eval 1.0 Critical error handler: process [...] terminated due to access violation (this is on Windows; on GNU/Linux, the libc copes better) The problem is quite simple: gen_expr is given an expression that contains an unrecognized operator (OP_DOUBLE in this case). When that happens, it tries to report an error with a string image of the operator in the error message. Conversion of the opcode into a string is done using op_string which, despite its name, probably is not what the author was looking for. This function returns NULL for a lot of the opcodes, thus triggering the crash. There is a function that corresponds to what we are looking for: expprint.c:op_name. It was static, though, so I made it non-static, and used it from ax-gdb.c:gen_expr. gdb/ChangeLog: * expression.h (op_name): Add declaration. * expprint.c (op_name): Remove declaration. Make non-static. * ax-gdb.c (gen_expr): Use op_name instead of op_string.
Diffstat (limited to 'gdb/expprint.c')
-rw-r--r--gdb/expprint.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/gdb/expprint.c b/gdb/expprint.c
index d9d9b8fc873..fd1fccb0693 100644
--- a/gdb/expprint.c
+++ b/gdb/expprint.c
@@ -647,12 +647,11 @@ op_string (enum exp_opcode op)
/* Support for dumping the raw data from expressions in a human readable
form. */
-static char *op_name (struct expression *, enum exp_opcode);
static int dump_subexp_body (struct expression *exp, struct ui_file *, int);
/* Name for OPCODE, when it appears in expression EXP. */
-static char *
+char *
op_name (struct expression *exp, enum exp_opcode opcode)
{
return exp->language_defn->la_exp_desc->op_name (opcode);