gdb/rust: fix crash for expression debug with strings

While working on another patch I did this:

  (gdb) set debug expression 1
  (gdb) set language rust
  (gdb) p "foo"
  Operation: OP_AGGREGATE
   Type: &str

  Fatal signal: Segmentation fault
  ... etc ...

The problem is that the second field of the rust_aggregate_operation
is created as a nullptr, this can be seen in rust-parse.c. in the
function rust_parser::parse_string().

However, in expop.h, in the function dump_for_expression, we make the
assumption that the expressions will never be nullptr.

I did consider moving the nullptr handling into a new function
rust_aggregate_operation::dump, however, as the expression debug
dumping code is not exercised as much as it might be, I would rather
that this code be hardened and able to handle a nullptr without
crashing, so I propose that we add nullptr handling into the general
dump_for_expression function.  The behaviour is now:

  (gdb) set debug expression 1
  (gdb) set language rust
  (gdb) p "foo"
  Operation: OP_AGGREGATE
   Type: &str
   nullptr
   Vector:
    String: data_ptr
    Operation: UNOP_ADDR
     Operation: OP_STRING
      String: foo
    String: length
    Operation: OP_LONG
     Type: usize
     Constant: 3
  evaluation of this expression requires the target program to be active
  (gdb)

There's a new test to check for this case.

Reviewed-By: Tom Tromey <tom@tromey.com>
This commit is contained in:
Andrew Burgess 2023-05-09 12:13:02 +01:00
parent 6109320673
commit 16c8122639
2 changed files with 25 additions and 1 deletions

View File

@ -314,7 +314,10 @@ static inline void
dump_for_expression (struct ui_file *stream, int depth,
const operation_up &op)
{
op->dump (stream, depth);
if (op == nullptr)
gdb_printf (stream, _("%*snullptr\n"), depth, "");
else
op->dump (stream, depth);
}
extern void dump_for_expression (struct ui_file *stream, int depth,

View File

@ -148,3 +148,24 @@ gdb_test "print r#" "No symbol 'r' in current context"
gdb_test "printf \"%d %d\\n\", 23+1, 23-1" "24 22"
gdb_test "print 5," "Syntax error near ','"
# Check expression debug works for strings.
gdb_test "with debug expression 1 -- print \"foo\"" \
[multi_line \
"Operation: OP_AGGREGATE" \
" Type: &str" \
" nullptr" \
" Vector:" \
" String: data_ptr" \
" Operation: UNOP_ADDR" \
" Operation: OP_STRING" \
" String: foo" \
" String: length" \
" Operation: OP_LONG" \
" Type: usize" \
" Constant: 3" \
"Operation: OP_LONG" \
" Type: i32" \
" Constant: 0" \
"evaluation of this expression requires the target program to be active"] \
"print a string with expression debug turned on"