Avoid expression parsing crash with unknown language

Message ID 20210715161618.234526-1-tromey@adacore.com
State New
Headers show
Series
  • Avoid expression parsing crash with unknown language
Related show

Commit Message

Tom Tromey July 15, 2021, 4:16 p.m.
PR gdb/28093 points out that gdb crashes when language is set to
"unknown" and expression parsing is attempted.  At first I thought
this was a regression due to the expression rewrite, but it turns out
that older versions crash as well.

This patch avoids the crash by changing the default expression parser
to throw an exception.  I think this is preferable -- the current
behavior of silently doing nothing does not really make sense.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28093
---
 gdb/language.c                   | 4 ++--
 gdb/testsuite/gdb.base/langs.exp | 6 ++++++
 2 files changed, 8 insertions(+), 2 deletions(-)

-- 
2.26.3

Comments

Pedro Alves July 15, 2021, 4:28 p.m. | #1
On 2021-07-15 5:16 p.m., Tom Tromey wrote:
> PR gdb/28093 points out that gdb crashes when language is set to

> "unknown" and expression parsing is attempted.  At first I thought

> this was a regression due to the expression rewrite, but it turns out

> that older versions crash as well.

> 

> This patch avoids the crash by changing the default expression parser

> to throw an exception.  I think this is preferable -- the current

> behavior of silently doing nothing does not really make sense.

> 

> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28093


Looks good, thanks!
Tom Tromey July 15, 2021, 7:06 p.m. | #2
>> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28093


Pedro> Looks good, thanks!

Thanks.  I wonder if this should be put on the 11 branch as well?
It's not a regression but OTOH the patch is small & pretty obvious.

Tom
Joel Brobecker July 17, 2021, 6:37 p.m. | #3
> >> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28093

> 

> Pedro> Looks good, thanks!

> 

> Thanks.  I wonder if this should be put on the 11 branch as well?

> It's not a regression but OTOH the patch is small & pretty obvious.


That seems like a good idea to me too.

Thanks Tom.
-- 
Joel
Tom Tromey July 19, 2021, 5:08 p.m. | #4
>>>>> "Joel" == Joel Brobecker <brobecker@adacore.com> writes:


>> >> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28093

>> 

Pedro> Looks good, thanks!
>> 

>> Thanks.  I wonder if this should be put on the 11 branch as well?

>> It's not a regression but OTOH the patch is small & pretty obvious.


Joel> That seems like a good idea to me too.

Ok, I wrote a ChangeLog entry and pushed it.

Tom

Patch

diff --git a/gdb/language.c b/gdb/language.c
index 0d1e3848de8..45ce2ebcc92 100644
--- a/gdb/language.c
+++ b/gdb/language.c
@@ -825,8 +825,8 @@  class auto_or_unknown_language : public language_defn
 
   int parser (struct parser_state *ps) const override
   {
-    /* No parsing is done, just claim success.  */
-    return 1;
+    error (_("expression parsing not implemented for language \"%s\""),
+	   natural_name ());
   }
 
   /* See language.h.  */
diff --git a/gdb/testsuite/gdb.base/langs.exp b/gdb/testsuite/gdb.base/langs.exp
index 15908b0a19a..631401a8eab 100644
--- a/gdb/testsuite/gdb.base/langs.exp
+++ b/gdb/testsuite/gdb.base/langs.exp
@@ -111,6 +111,12 @@  if [runto csub] then {
              "set lang to minimal"
     
     gdb_test "print x" " = 5000" "print parameter value"
+
+    # Ensure this at least does not crash.
+    gdb_test_no_output "set language unknown"
+    gdb_test "print x" \
+	"expression parsing not implemented for language .Unknown." \
+	"expression parsing does not crash for unknown"
 }
 
 set timeout $oldtimeout