aboutsummaryrefslogtreecommitdiff
path: root/gdb/printcmd.c
diff options
context:
space:
mode:
authorKeith Seitz <keiths@redhat.com>2023-04-28 10:43:20 -0700
committerKeith Seitz <keiths@redhat.com>2023-04-28 10:43:20 -0700
commit1956da78cf450543343d58e5da9dc3cc6846dfff (patch)
tree7545f74a52ccca63db94fb62fce2ca5ab57fb84a /gdb/printcmd.c
parent005b65e801c48344d82753c93db5436b310bfde4 (diff)
downloadgdb-1956da78cf450543343d58e5da9dc3cc6846dfff.zip
gdb-1956da78cf450543343d58e5da9dc3cc6846dfff.tar.gz
gdb-1956da78cf450543343d58e5da9dc3cc6846dfff.tar.bz2
Allow strings with printf/eval
PR 13098 explains that if a user attempts to use a string with either `printf' (or `eval'), gdb returns an error (inferior not running): (gdb) printf "%s\n", "hello" evaluation of this expression requires the target program to be active However, the parser can certainly handle this case: (gdb) p "hello" $1 = "hello" This discrepancy occurs because printf_c_string does not handle this specific case. The passed-in value that we are attempting to print as a string is TYPE_CODE_ARRAY but it's lval type is not_lval. printf_c_string will only attempt to print a string from the value's contents when !TYPE_CODE_PTR, lval is lval_internalvar, and the value's type is considered a string type: if (value->type ()->code () != TYPE_CODE_PTR && value->lval () == lval_internalvar && c_is_string_type_p (value->type ())) { ... } Otherwise, it attempts to read the value of the string from the target's memory (which is what actually generates the "evaluation of this ..." error message).
Diffstat (limited to 'gdb/printcmd.c')
-rw-r--r--gdb/printcmd.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/gdb/printcmd.c b/gdb/printcmd.c
index dd92e31..6435311 100644
--- a/gdb/printcmd.c
+++ b/gdb/printcmd.c
@@ -2447,8 +2447,8 @@ printf_c_string (struct ui_file *stream, const char *format,
{
const gdb_byte *str;
- if (value->type ()->code () != TYPE_CODE_PTR
- && value->lval () == lval_internalvar
+ if (((value->type ()->code () != TYPE_CODE_PTR && value->lval () == lval_internalvar)
+ || value->type ()->code () == TYPE_CODE_ARRAY)
&& c_is_string_type_p (value->type ()))
{
size_t len = value->type ()->length ();