From: Tom de Vries Date: Thu, 13 Aug 2026 01:59:17 +0000 (+0200) Subject: [gdb/cli] Don't emit emojis in MI X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dbf19e0f878eb592011c25c1dbbfc35eee330ec2;p=thirdparty%2Fbinutils-gdb.git [gdb/cli] Don't emit emojis in MI PR mi/34501 reports the following: ... $ gdb -q \ -ex 'set charset UTF-8' \ -ex 'interpreter-exec mi2 "-break-insert -f foo' \ -ex quit &"�\235\214�\217 No symbol table is loaded. Use the \"file\" command.\n" ... $ ... The output is a bit odd, but that gets better if we use 'set print sevenbit-strings on': ... &"\342\235\214\357\270\217 No symbol table is loaded. Use the \"file\" command.\n" ... The output we see there is the error emoji: ... $ gdb (gdb) b foo ❌️ No symbol table is loaded. Use the "file" command. ... More specifically, two utf-8 encoded unicode characters: - Cross Mark [1]: 0xE2 0x9D 0x8C - Variation Selector-16 (VS16) [2]: 0xEF 0xB8 0x8F Now the question: is GDB doing something wrong? I think we probably should encode unicode characters in MI error strings as octal escapes, independent of the sevenbit-strings setting. This patch does not address this part. Then there's the question whether we should emit emojis in MI error strings in the first place [3]. In principle they're unicode characters encoded in UTF-8, and we can expect other such unicode characters in translated error strings. But, given that MI has can_emit_style_escape () == false, and already filters out ANSI escape sequences, I think it's reasonable to also disable emojis. As for implementation, I introduced a function emoji_allowed alongside can_emit_style_escape, which defaults to the value of can_emit_style_escape. Tested on x86_64-linux. Approved-By: Tom Tromey Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=34501 [1] https://www.compart.com/en/unicode/U+274C [2] https://www.compart.com/en/unicode/U+FE0F [3] https://sourceware.org/bugzilla/show_bug.cgi?id=33920#c1 --- diff --git a/gdb/cli/cli-style.c b/gdb/cli/cli-style.c index 5c175ee29ea..60c00acdf43 100644 --- a/gdb/cli/cli-style.c +++ b/gdb/cli/cli-style.c @@ -471,7 +471,7 @@ show_warning_prefix (struct ui_file *file, int from_tty, void print_warning_prefix (ui_file *file) { - if (emojis_ok ()) + if (file->emoji_allowed () && emojis_ok ()) gdb_puts (warning_prefix.c_str (), file); } @@ -496,7 +496,7 @@ show_error_prefix (struct ui_file *file, int from_tty, void print_error_prefix (ui_file *file) { - if (emojis_ok ()) + if (file->emoji_allowed () && emojis_ok ()) gdb_puts (error_prefix.c_str (), file); } diff --git a/gdb/testsuite/gdb.base/style-mi-no-emoji.exp b/gdb/testsuite/gdb.base/style-mi-no-emoji.exp new file mode 100644 index 00000000000..c46c35b04a6 --- /dev/null +++ b/gdb/testsuite/gdb.base/style-mi-no-emoji.exp @@ -0,0 +1,30 @@ +# Copyright (C) 2026 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 . + +# Check that emojis are not printed in MI error messages. + +with_ansi_styling_terminal { + clean_restart + + gdb_test "set style emoji on" + + # Check that there is no emoji printed before the error. Regression test + # for PR34501. + set re_line \ + [string_to_regexp \ + {&"No symbol table is loaded. Use the \"file\" command.\n"}] + gdb_test {interpreter-exec mi2 "-break-insert -f foo"} \ + "\r\n${re_line}(?=\r\n).*" +} diff --git a/gdb/ui-file.h b/gdb/ui-file.h index 76185bbedf0..f5c23b9b6d9 100644 --- a/gdb/ui-file.h +++ b/gdb/ui-file.h @@ -93,6 +93,14 @@ public: virtual bool can_emit_style_escape () { return false; } + /* True if emojis are allowed on STREAM. */ + bool emoji_allowed () + { + /* By default, assume that emojis are not allowed on streams that don't + support ANSI escapes. */ + return can_emit_style_escape (); + } + virtual void flush () {}