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.
Output goes to STREAM (via stdio).
If VARSTRING is a non-empty string, print as an Ada variable/field
declaration.
If VARSTRING is a non-NULL, non-empty string, print as an Ada
variable/field declaration.
SHOW+1 is the maximum number of levels of internal type structure
to show (this applies to record types, enumerated types, and
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
"access" in this case. */
if (type->code () != TYPE_CODE_PTR
|| strstr (varstring, "___XVL") == nullptr)
|| (varstring != nullptr
&& strstr (varstring, "___XVL") == nullptr))
gdb_printf (stream, "access ");
ada_print_type (type->target_type (), "", stream, show, level,
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;