libabigail/include
Dodji Seketeli aad0e11f50 comparison: Ensure that fn parms with basic types can't be redundant
When comparing the two libc binaries from
"https://the.owo.foundation/Ac1Ksw8.tgz", abidiff crashes.

It appears to be due to an assert that is hit because the overload of
default_reporter::report for fn_parm_diff momentarily removes the
redundant-ness from the categorization of the diff node of the type of
a function parameter.  The problem is that the sole child diff node of
that type diff node is itself redundant.  So the function parameter
type diff node should really be redundant too.  Oops, there is a logic
violation there, hence the assert violation.

I commented out the line that removes the redundant-ness.  After all,
if function parameter types shouldn't be redundant, that should have
been taken care of by the redundancy_marking_visitor code in
abg-comparison.cc as well as its associated category propagation code.

But then consider what happens with a reproducer of the libc binaries
above:

	$ cat test-PR29387-v0.c
	typedef int Integer;

	void
	f0(Integer i, char c)
	{
	  i + c;
	}

	void
	f1(Integer i, unsigned char c)
	{
	  i + c;
	}

	$
	$ cat test-PR29387-v1.c
	typedef long int Integer;

	void
	f0(Integer i, char c)
	{
	  i + c;
	}

	void
	f1(Integer i, unsigned char c)
	{
	  i + c;
	}

	$ gcc -g test-PR29387-v0.c
	$ gcc -g test-PR29387-v1.c
	$
	$ abidiff test-PR29387-v0.o test-PR29387-v1.o
	Functions changes summary: 0 Removed, 2 Changed, 0 Added functions
	Variables changes summary: 0 Removed, 0 Changed, 0 Added variable

	2 functions with some indirect sub-type change:

	  [C] 'function void f0(Integer, char)' at PR29387-test-v1.c:4:1 has some indirect sub-type changes:
	    parameter 1 of type 'typedef Integer' changed:
	      underlying type 'int' changed:
		type name changed from 'int' to 'long int'
		type size changed from 32 to 64 (in bits)

	  [C] 'function void f1(Integer, unsigned char)' at PR29387-test-v1.c:10:1 has some indirect sub-type changes:
	$
	$

So, the problem is this peace of report:

	  [C] 'function void f1(Integer, unsigned char)' at PR29387-test-v1.c:10:1 has some indirect sub-type changes:

You see that the report is empty; the reporter could not say what changed.

What changed is the typedef "Integer" that changed from "int" to "long
int".  The redundancy_marking_visitor pass marked the change of the
underlying type of the Integer typedef as being redundant.  This is
because that typedef change has already been reported on the f0
function interface.

The problem is that by design, the 'int' to 'long int' change should
not have been marked as being redundant by the
redundancy_marking_visitor pass.  This is because, we want to see all
the "basic type changes" on function parameters types.  They are
deemed "local changes" of the function types, and we want to see all
local changes to functions because it is almost 100% sure these are
non-compatible changes.

The root cause of the problem is that the function
has_basic_type_change_only in abg-comparison.cc fails to detect that
the parameter change carries a typedef-to-basic-type change, so the
function parameter is wrongly marked as being redundant even though it
ultimately carries a basic type change.

This patch thus teaches has_basic_type_change_only to look through
parameter changes to better detect basic type changes.

	* include/abg-comparison.h (peel_fn_parm_diff)
	(peel_typedef_qualified_type_or_parameter_diff): Declare ...
	* src/abg-comparison.cc (peel_fn_parm_diff)
	(peel_typedef_qualified_type_or_parameter_diff): ... new
	functions.
	(has_basic_type_change_only): Look through function parameters,
	typedefs and qualified types.
	* src/abg-default-reporter.cc (default_reporter::report): Remove
	the temporary removal of the redundant categorisation.
	Redundant-ness should have been handled by the
	redundancy_marking_visitor pass.
	* tests/data/test-diff-filter/test-PR29387-report.txt: Reference
	test output.
	* tests/data/test-diff-filter/test-PR29387-v{0,1}.c: Source of the
	input tests.
	* tests/data/test-diff-filter/test-PR29387-v{0,1}.o: Input test
	binaries.
	* tests/data/Makefile.am: Add the new test material above to the
	source distribution.
	* tests/test-diff-filter.cc (in_out_specs): Add the test binaries
	above to the test harness.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2022-09-22 01:46:20 +02:00
..
abg-comp-filter.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
abg-comparison.h comparison: Ensure that fn parms with basic types can't be redundant 2022-09-22 01:46:20 +02:00
abg-config.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
abg-corpus.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
abg-ctf-reader.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
abg-cxx-compat.h optional: minor improvements 2022-06-30 18:30:58 +02:00
abg-diff-utils.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
abg-dwarf-reader.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
abg-elf-reader-common.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
abg-fwd.h ir, writer: Go back to canonicalizing typedefs in the IR 2022-09-20 11:43:34 +02:00
abg-hash.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
abg-ini.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
abg-interned-str.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
abg-ir.h ir, writer: Go back to canonicalizing typedefs in the IR 2022-09-20 11:43:34 +02:00
abg-libxml-utils.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
abg-reader.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
abg-regex.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
abg-reporter.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
abg-sptr-utils.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
abg-suppression.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
abg-tools-utils.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
abg-traverse.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
abg-version.h.in abidw: Add --abixml-version 2021-11-12 18:31:28 +01:00
abg-viz-common.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
abg-viz-dot.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
abg-viz-svg.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
abg-workers.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
abg-writer.h Update year in copyright notice 2022-06-21 12:58:57 +02:00
Makefile.am Move dwarf_reader::status facilities to an abigail::elf_reader namespace 2021-11-15 11:08:53 +01:00