From fa639f555afbe6bf670c27d161c42974740987cb Mon Sep 17 00:00:00 2001 From: Hannes Domani Date: Mon, 14 Dec 2020 19:06:38 +0100 Subject: [PATCH] Don't compare types of enum fields Comparing types of enum fields results in a crash, because they don't have a type. It can be reproduced by comparing the types of 2 instances of the same enum type in different objects: enum.h: enum e { zero, one, }; enum-1.c: #include int func(); enum e e1; int main() { return e1 + func(); } enum-2.c: #include enum e e2; int func() { return e2; } $ gcc -g -oenum enum-1.c enum-2.c $ gdb -q enum.exe Reading symbols from enum.exe... (gdb) py print(gdb.parse_and_eval("e1").type==gdb.parse_and_eval("e2").type) Thread 1 received signal SIGSEGV, Segmentation fault. [Switching to Thread 6184.0x1cc4] check_typedef (type=0x0) at C:/src/repos/binutils-gdb.git/gdb/gdbtypes.c:2745 2745 while (type->code () == TYPE_CODE_TYPEDEF) gdb/ChangeLog: 2020-12-19 Hannes Domani PR exp/27070 * gdbtypes.c (check_types_equal): Don't compare types of enum fields. gdb/testsuite/ChangeLog: 2020-12-19 Hannes Domani PR exp/27070 * gdb.python/compare-enum-type-a.c: New test. * gdb.python/compare-enum-type-b.c: New test. * gdb.python/compare-enum-type.exp: New file. * gdb.python/compare-enum-type.h: New test. --- gdb/ChangeLog | 5 ++++ gdb/gdbtypes.c | 4 ++- gdb/testsuite/ChangeLog | 8 ++++++ .../gdb.python/compare-enum-type-a.c | 28 +++++++++++++++++++ .../gdb.python/compare-enum-type-b.c | 26 +++++++++++++++++ .../gdb.python/compare-enum-type.exp | 27 ++++++++++++++++++ gdb/testsuite/gdb.python/compare-enum-type.h | 22 +++++++++++++++ 7 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 gdb/testsuite/gdb.python/compare-enum-type-a.c create mode 100644 gdb/testsuite/gdb.python/compare-enum-type-b.c create mode 100644 gdb/testsuite/gdb.python/compare-enum-type.exp create mode 100644 gdb/testsuite/gdb.python/compare-enum-type.h diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3cae03aaed..b379fcf24d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-12-19 Hannes Domani + + PR exp/27070 + * gdbtypes.c (check_types_equal): Don't compare types of enum fields. + 2020-12-19 Bernd Edlinger * configure.ac: Move the static libs vs. source-highlight diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 43058320c3..569e7a3e65 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -4175,7 +4175,9 @@ check_types_equal (struct type *type1, struct type *type2, case FIELD_LOC_KIND_ENUMVAL: if (FIELD_ENUMVAL (*field1) != FIELD_ENUMVAL (*field2)) return false; - break; + /* Don't compare types of enum fields, because they don't + have a type. */ + continue; case FIELD_LOC_KIND_PHYSADDR: if (FIELD_STATIC_PHYSADDR (*field1) != FIELD_STATIC_PHYSADDR (*field2)) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 551dd7192d..5b50452656 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2020-12-19 Hannes Domani + + PR exp/27070 + * gdb.python/compare-enum-type-a.c: New test. + * gdb.python/compare-enum-type-b.c: New test. + * gdb.python/compare-enum-type.exp: New file. + * gdb.python/compare-enum-type.h: New test. + 2020-12-18 Hannes Domani * gdb.python/py-format-string.exp: Add tests for address keyword. diff --git a/gdb/testsuite/gdb.python/compare-enum-type-a.c b/gdb/testsuite/gdb.python/compare-enum-type-a.c new file mode 100644 index 0000000000..be04d29c3c --- /dev/null +++ b/gdb/testsuite/gdb.python/compare-enum-type-a.c @@ -0,0 +1,28 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2020 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 . */ + +#include "compare-enum-type.h" + +int func (void); + +enum e e1; + +int +main (void) +{ + return e1 + func (); +} diff --git a/gdb/testsuite/gdb.python/compare-enum-type-b.c b/gdb/testsuite/gdb.python/compare-enum-type-b.c new file mode 100644 index 0000000000..622f490983 --- /dev/null +++ b/gdb/testsuite/gdb.python/compare-enum-type-b.c @@ -0,0 +1,26 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2020 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 . */ + +#include "compare-enum-type.h" + +enum e e2; + +int +func (void) +{ + return e2; +} diff --git a/gdb/testsuite/gdb.python/compare-enum-type.exp b/gdb/testsuite/gdb.python/compare-enum-type.exp new file mode 100644 index 0000000000..f05dcfe15b --- /dev/null +++ b/gdb/testsuite/gdb.python/compare-enum-type.exp @@ -0,0 +1,27 @@ +# Copyright 2020 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 . + +# Test if enum type comparison succeeds (PR exp/27070). + +standard_testfile -a.c -b.c + +if { [prepare_for_testing "failed to prepare" "compare-enum-type" \ + [list $srcfile $srcfile2]] } { + return +} + +if { [skip_python_tests] } { continue } + +gdb_test "py print(gdb.parse_and_eval('e1').type == gdb.parse_and_eval('e2').type)" "True" diff --git a/gdb/testsuite/gdb.python/compare-enum-type.h b/gdb/testsuite/gdb.python/compare-enum-type.h new file mode 100644 index 0000000000..f149fc1a7e --- /dev/null +++ b/gdb/testsuite/gdb.python/compare-enum-type.h @@ -0,0 +1,22 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2020 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 . */ + +enum e +{ + zero, + one, +}; -- 2.34.1