diff options
author | Hannes Domani <ssbssa@yahoo.de> | 2020-12-14 19:06:38 +0100 |
---|---|---|
committer | Hannes Domani <ssbssa@yahoo.de> | 2020-12-19 13:41:44 +0100 |
commit | fa639f555afbe6bf670c27d161c42974740987cb (patch) | |
tree | 8e8057a2a6ee3edbc469f20e434efb88d1876f78 /gdb | |
parent | 0455b7d325801142694c0a222acb08c7e2739f7d (diff) | |
download | fsf-binutils-gdb-fa639f555afbe6bf670c27d161c42974740987cb.zip fsf-binutils-gdb-fa639f555afbe6bf670c27d161c42974740987cb.tar.gz fsf-binutils-gdb-fa639f555afbe6bf670c27d161c42974740987cb.tar.bz2 |
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 <enum.h>
int func();
enum e e1;
int main()
{
return e1 + func();
}
enum-2.c:
#include <enum.h>
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 <ssbssa@yahoo.de>
PR exp/27070
* gdbtypes.c (check_types_equal): Don't compare types of enum fields.
gdb/testsuite/ChangeLog:
2020-12-19 Hannes Domani <ssbssa@yahoo.de>
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.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/gdbtypes.c | 4 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/compare-enum-type-a.c | 28 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/compare-enum-type-b.c | 26 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/compare-enum-type.exp | 27 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/compare-enum-type.h | 22 |
7 files changed, 119 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3cae03a..b379fcf 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-12-19 Hannes Domani <ssbssa@yahoo.de> + + PR exp/27070 + * gdbtypes.c (check_types_equal): Don't compare types of enum fields. + 2020-12-19 Bernd Edlinger <bernd.edlinger@hotmail.de> * configure.ac: Move the static libs vs. source-highlight diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 4305832..569e7a3 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 551dd71..5b50452 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2020-12-19 Hannes Domani <ssbssa@yahoo.de> + + 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 <ssbssa@yahoo.de> * 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 0000000..be04d29 --- /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 <http://www.gnu.org/licenses/>. */ + +#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 0000000..622f490 --- /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 <http://www.gnu.org/licenses/>. */ + +#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 0000000..f05dcfe --- /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 <http://www.gnu.org/licenses/>. + +# 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 0000000..f149fc1 --- /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 <http://www.gnu.org/licenses/>. */ + +enum e +{ + zero, + one, +}; |