Fix crash in ada_print_type

The "varstring" paramter to ada_print_type can be null, but one spot
failed to check this.  This could cause a crash in some situations.

As this is Ada-specific, and we've been using it internally at AdaCore
for a while, I am going to push it.
This commit is contained in:
Tom Tromey 2022-10-20 10:55:35 -06:00
parent b0e8fa7ff0
commit 2c2316c5fd
5 changed files with 114 additions and 3 deletions

View file

@ -925,8 +925,8 @@ print_func_type (struct type *type, struct ui_file *stream, const char *name,
/* Print a description of a type TYPE0. /* Print a description of a type TYPE0.
Output goes to STREAM (via stdio). Output goes to STREAM (via stdio).
If VARSTRING is a non-empty string, print as an Ada variable/field If VARSTRING is a non-NULL, non-empty string, print as an Ada
declaration. variable/field declaration.
SHOW+1 is the maximum number of levels of internal type structure SHOW+1 is the maximum number of levels of internal type structure
to show (this applies to record types, enumerated types, and to show (this applies to record types, enumerated types, and
array types). array types).
@ -996,7 +996,8 @@ ada_print_type (struct type *type0, const char *varstring,
/* An __XVL field is not truly a pointer, so don't print /* An __XVL field is not truly a pointer, so don't print
"access" in this case. */ "access" in this case. */
if (type->code () != TYPE_CODE_PTR if (type->code () != TYPE_CODE_PTR
|| strstr (varstring, "___XVL") == nullptr) || (varstring != nullptr
&& strstr (varstring, "___XVL") == nullptr))
gdb_printf (stream, "access "); gdb_printf (stream, "access ");
ada_print_type (type->target_type (), "", stream, show, level, ada_print_type (type->target_type (), "", stream, show, level,
flags); flags);

View file

@ -0,0 +1,46 @@
# Copyright 2022 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 <http://www.gnu.org/licenses/>.
# Regression test for a crash in the overload menu.
load_lib "ada.exp"
if { [skip_ada_tests] } { return -1 }
standard_ada_testfile main
if {[gdb_compile_ada "$srcfile" "$binfile" executable {debug}] != ""} {
return -1
}
clean_restart ${testfile}
set bp_location [gdb_get_line_number "BREAK" ${testdir}/main.adb]
runto "main.adb:$bp_location"
set menu [multi_line "Multiple matches for regtest" \
"\\\[0\\\] cancel" \
"\\\[1\\\] pck.inner.regtest at .*pck.ads:\[0-9\]+" \
"\\\[2\\\] pck.regtest .* return boolean at .*pck.adb:\[0-9\]+" \
"> $"]
gdb_test_multiple "whatis &regtest" "menu does not crash" {
-re "$menu" {
pass "$gdb_test_name"
}
default {
fail "$gdb_test_name"
}
}
gdb_test "1" "type = access boolean" "choose from menu"

View file

@ -0,0 +1,21 @@
-- Copyright 2022 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 <http://www.gnu.org/licenses/>.
with Pck;
procedure Main is
begin
Pck.Inner.Regtest := Pck.Regtest (null); -- BREAK
end Main;

View file

@ -0,0 +1,21 @@
-- Copyright 2022 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 <http://www.gnu.org/licenses/>.
package body Pck is
function Regtest (A : access Integer) return Boolean is
begin
return True;
end Regtest;
end Pck;

View file

@ -0,0 +1,22 @@
-- Copyright 2022 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 <http://www.gnu.org/licenses/>.
package Pck is
package Inner is
Regtest : Boolean;
end Inner;
function Regtest (A : access Integer) return Boolean;
end Pck;