-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Don't consider type name when comparing typedefs
This is from a problem report originating from Red Hat bugzilla at https://bugzilla.redhat.com/show_bug.cgi?id=1925876 I some C programs, the same type can be defined more than once in a binary, as there is no "One Definition Rule[1]" in C. [1]: https://en.wikipedia.org/wiki/One_Definition_Rule The definition of those two types can be slightly different and yet be equivalent. For instance, the data member of a struct S might be defined once as having a type which is a typedef Foo of, say, "long int" and that struct S might be defined again elsewhere with a data member of type typedef Bar of "long int" as well. With the current code, because Foo and Bar have different names, they are are going to compare different; so the two struct S are doing to compare different even though they are equivalent. Down the road, this is likely going to imply that the several 'struct S' that are declaration-only will not be resolved as being declarations of the definition of "struct S", because they is more than one such definition, and those definitions are different. This is going to lead to spurious (and hard to debug) type differences that are going to be detected and reported by libabigail later down the road. This patch addresses the problem by not taking typedef names into account when comparing typedefs before canonicalization. That allows the comparison of classes and structs that happens during the resolution of declaration-only classes to correctly deduce their equivalence even in cases like the one exposed above. It thus reduces the amount of declaration-only classes that are unnecessarily considered to be different from the definition they ought to equal. * include/abg-ir.h (maybe_compare_as_member_decls): Declare new function. Make it a friend of class decl_base. * src/abg-dwarf-reader.cc (maybe_canonicalize_type): Don't early canonicalize typedefs because they can be "part" of a type that is not yet completed, especially considering that class declaration resolution is part of type building, stricto sensu. * src/abg-ir.cc (maybe_compare_as_member_decls): Factorize this out of ... (equals): ... the overload for decl_base. Use it in the overload for typedef_decl. * tests/data/test-diff-pkg/nmap-7.70-5.el8_testjcc.x86_64-self-check-report-0.txt: New test reference output. * tests/data/test-diff-pkg/nmap-7.70-5.el8_testjcc.x86_64.rpm: New binary input. * tests/data/test-diff-pkg/nmap-debuginfo-7.70-5.el8_testjcc.x86_64.rpm: Likewise. * tests/data/Makefile.am: Add these new testing material to source distribution. * tests/test-diff-pkg.cc (in_out_specs): Add the new test input to the harness. * tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-0.txt: Adjust. * tests/data/test-diff-suppr/test39-opaque-type-report-0.txt: Adjust. Signed-off-by: Dodji Seketeli <[email protected]>
- Loading branch information
Dodji Seketeli
committed
Feb 11, 2021
1 parent
a8c0199
commit 77bc4b7
Showing
10 changed files
with
109 additions
and
61 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 changes: 2 additions & 0 deletions
2
tests/data/test-diff-pkg/nmap-7.70-5.el8_testjcc.x86_64-self-check-report-0.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
==== SELF CHECK SUCCEEDED for 'nmap' ==== | ||
==== SELF CHECK SUCCEEDED for 'nping' ==== |
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,3 @@ | ||
Functions changes summary: 0 Removed, 1 Changed (1 filtered out), 0 Added functions | ||
Functions changes summary: 0 Removed, 0 Changed (2 filtered out), 0 Added functions | ||
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable | ||
|
||
1 function with some indirect sub-type change: | ||
|
||
[C] 'function void bar(StructType*)' at test39-opaque-type-v1.c:20:1 has some indirect sub-type changes: | ||
parameter 1 of type 'StructType*' changed: | ||
in pointed to type 'typedef StructType' at test39-header-v1.h:2:1: | ||
typedef name changed from StructType to AnotherStructType at test39-header-v1.h:2:1 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters