[applied] Bug 33076 - abicompat doesn't filter out harmless diff nodes

Message ID 87msacpleq.fsf@redhat.com
State New
Headers
Series [applied] Bug 33076 - abicompat doesn't filter out harmless diff nodes |

Commit Message

Dodji Seketeli June 12, 2025, 11:53 p.m. UTC
  Hello,

In the test accompanying the bug report we can see that abicompat
doesn't filter out harmless changes.  Thus, in the non-regression test
added by this patch, abicompat would emit the error message:

    $ abicompat test-diff-ptr-to-void-ptr-app 1/libtest-diff-ptr-to-void-ptr-fn.so
    functions defined in library '1/libtest-diff-ptr-to-void-ptr-fn.so'
    have sub-types that are different from what application 'test-diff-ptr-to-void-ptr-app' expects:

      function void foo(int, char, VOID_PTR):
	parameter 3 of type 'typedef VOID_PTR' changed:
	  typedef name changed from VOID_PTR to PTR_TO_FN at test-diff-ptr-to-void-ptr-fn-v1.c:1:1
	  underlying type 'void*' changed:
	    in pointed to type 'void':
	      entity changed from 'void' to 'function type void (...)'
	      type size changed from 0 to 64 (in bits)

That ABI change is harmless and should have been filtered out, just
like what abidiff does:

    $ abidiff  0/libtest-diff-ptr-to-void-ptr-fn.so  1/libtest-diff-ptr-to-void-ptr-fn.so
    Functions changes summary: 0 Removed, 0 Changed (1 filtered out), 0 Added function
    Variables changes summary: 0 Removed, 0 Changed, 0 Added variable

This patch addresses that issue by renaming the function
abigail::comparison::apply_filters into
apply_filters_and_categorize_diff_node_tree and teaching it to perform
the categorization (and subsequent filtering) of nodes of a given diff
tree.

The patch amends abicompat to make it use the new
apply_filters_and_categorize_diff_node_tree to perform filtering on
nodes of the resulting diff tree.

	* include/abg-comparison.h (is_diff): Add a new template function.
	(apply_filters_and_categorize_diff_node_tree): Rename
	apply_filters into this new function.
	* src/abg-comparison.cc
	(apply_filters_and_categorize_diff_node_tree): Rename
	apply_filters into this.  Make it apply suppression
	specifications and all categorization filters.
	* tests/data/test-abicompat/test-diff-ptr-to-void-ptr/0/libtest-diff-ptr-to-void-ptr-fn.so:
	New binary test input.
	* tests/data/test-abicompat/test-diff-ptr-to-void-ptr/0/test-diff-ptr-to-void-ptr-fn-v0.c:
	Source code of binary test input.
	* tests/data/test-abicompat/test-diff-ptr-to-void-ptr/1/libtest-diff-ptr-to-void-ptr-fn.so:
	New binary test input.
	* tests/data/test-abicompat/test-diff-ptr-to-void-ptr/1/test-diff-ptr-to-void-ptr-fn-v1.c:
	Source code of binary test input.
	* tests/data/test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-app:
	New binary test input.
	* tests/data/test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-app.c:
	Source code of binary test input.
	* tests/data/test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-report-[01].txt:
	New reference test output.
	* tests/data/Makefile.am: Add new test material to source
	distribution.
	* tests/test-abicompat.cc: Add new test input to this harness.
	* tests/print-diff-tree.cc (main): Adjust.
	* tools/abicompat.cc (create_diff_context): Filter out harmless
	change categories by default.
	(compare_expected_against_provided_{function,variable}s): Use the
	new apply_filters_and_categorize_diff_node_tree.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
Applied to the mainline
---
 include/abg-comparison.h                      |  19 ++++++++-
 src/abg-comparison.cc                         |  40 ++++++++++++++----
 tests/data/Makefile.am                        |   8 ++++
 .../0/libtest-diff-ptr-to-void-ptr-fn.so      | Bin 0 -> 12680 bytes
 .../0/test-diff-ptr-to-void-ptr-fn-v0.c       |   8 ++++
 .../1/libtest-diff-ptr-to-void-ptr-fn.so      | Bin 0 -> 12704 bytes
 .../1/test-diff-ptr-to-void-ptr-fn-v1.c       |   8 ++++
 .../test-diff-ptr-to-void-ptr-app             | Bin 0 -> 13680 bytes
 .../test-diff-ptr-to-void-ptr-app.c           |  15 +++++++
 .../test-diff-ptr-to-void-ptr-report-0.txt    |   0
 .../test-diff-ptr-to-void-ptr-report-1.txt    |   0
 tests/print-diff-tree.cc                      |   8 +---
 tests/test-abicompat.cc                       |  20 +++++++++
 tools/abicompat.cc                            |  14 +++---
 14 files changed, 116 insertions(+), 24 deletions(-)
 create mode 100755 tests/data/test-abicompat/test-diff-ptr-to-void-ptr/0/libtest-diff-ptr-to-void-ptr-fn.so
 create mode 100644 tests/data/test-abicompat/test-diff-ptr-to-void-ptr/0/test-diff-ptr-to-void-ptr-fn-v0.c
 create mode 100755 tests/data/test-abicompat/test-diff-ptr-to-void-ptr/1/libtest-diff-ptr-to-void-ptr-fn.so
 create mode 100644 tests/data/test-abicompat/test-diff-ptr-to-void-ptr/1/test-diff-ptr-to-void-ptr-fn-v1.c
 create mode 100755 tests/data/test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-app
 create mode 100644 tests/data/test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-app.c
 create mode 100644 tests/data/test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-report-0.txt
 create mode 100644 tests/data/test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-report-1.txt

new file mode 100644
index 00000000..3d8ef278
new file mode 100644
index 00000000..156bcac3
new file mode 100644
index 00000000..b2de65a5
  

Patch

diff --git a/include/abg-comparison.h b/include/abg-comparison.h
index 6a90a838..f4194002 100644
--- a/include/abg-comparison.h
+++ b/include/abg-comparison.h
@@ -1168,6 +1168,20 @@  compute_diff(const type_base_sptr,
 	     const type_base_sptr,
 	     diff_context_sptr ctxt);
 
+/// Convert the type of a particular diff node into the generic @ref
+/// diff_sptr type.
+///
+/// @tparam DiffNodePtr the specific type of the diff node to convert
+/// into @ref diff_sptr
+///
+/// @param n the diff node to consider.
+///
+/// @return the instance of @ref diff_sptr @p n was converted into.
+template <class DiffNodePtr>
+diff_sptr
+is_diff(DiffNodePtr& n)
+{return std::dynamic_pointer_cast<diff>(n);}
+
 /// The base class of diff between types.
 class type_diff_base : public diff
 {
@@ -2996,7 +3010,10 @@  void
 clear_redundancy_categorization(corpus_diff_sptr diff_tree);
 
 void
-apply_filters(corpus_diff_sptr diff_tree);
+apply_filters_and_categorize_diff_node_tree(diff_sptr& diff_tree);
+
+void
+apply_filters_and_categorize_diff_node_tree(corpus_diff_sptr& c);
 
 bool
 is_diff_of_variadic_parameter_type(const diff*);
diff --git a/src/abg-comparison.cc b/src/abg-comparison.cc
index ab03c72f..3ae1f32a 100644
--- a/src/abg-comparison.cc
+++ b/src/abg-comparison.cc
@@ -14013,18 +14013,40 @@  void
 clear_redundancy_categorization(corpus_diff_sptr diff_tree)
 {clear_redundancy_categorization(diff_tree.get());}
 
-/// Apply the @ref diff tree filters that have been associated to the
-/// context of the a given @ref corpus_diff tree.  As a result, the
-/// nodes of the @diff tree are going to be categorized into one of
-/// several of the categories of @ref diff_category.
+/// Apply the @ref diff tree filters that have been associated with
+/// the context of the a given @ref diff, categorize the diff nodes
+/// subsequently.  As a result, the nodes of the @p diff_tree tree are
+/// going to be properly filtered out at reporting time.
 ///
-/// @param diff_tree the @ref corpus_diff instance which @ref diff are
-/// to be categorized.
+/// @param diff_tree the @ref diff instance to consider.
 void
-apply_filters(corpus_diff_sptr diff_tree)
+apply_filters_and_categorize_diff_node_tree(diff_sptr& diff_tree)
 {
-  diff_tree->context()->maybe_apply_filters(diff_tree);
-  propagate_categories(diff_tree);
+  if (!diff_tree)
+    return;
+
+  diff_context_sptr ctxt = diff_tree->context();
+  ABG_ASSERT(ctxt);
+
+  if (!ctxt->perform_change_categorization())
+    return;
+
+  apply_suppressions(diff_tree);
+  ctxt->maybe_apply_filters(diff_tree);
+  categorize_redundancy(diff_tree);
+}
+
+/// Apply the @ref diff tree filters that have been associated with
+/// the context of the a given @ref corpus_diff, categorize the diff
+/// nodes subsequently.  As a result, the nodes of the @p c tree are
+/// going to be properly filtered out at reporting time.
+///
+/// @param c the @ref corpus_diff instance to consider.
+void
+apply_filters_and_categorize_diff_node_tree(corpus_diff_sptr& c)
+{
+  if (c)
+    c->apply_filters_and_suppressions_before_reporting();
 }
 
 /// Test if a diff node represents the difference between a variadic
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index 8655d7b2..68811a5e 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -2265,6 +2265,14 @@  test-abicompat/test10/test10-fn-changed-report-1.txt \
 test-abicompat/test10/test10-fn-changed-report-2.txt \
 test-abicompat/test10/test10-fn-changed-report-3.txt \
 test-abicompat/test10/test10-fn-changed-report-4.txt \
+test-abicompat/test-diff-ptr-to-void-ptr/0/libtest-diff-ptr-to-void-ptr-fn.so \
+test-abicompat/test-diff-ptr-to-void-ptr/0/test-diff-ptr-to-void-ptr-fn-v0.c \
+test-abicompat/test-diff-ptr-to-void-ptr/1/libtest-diff-ptr-to-void-ptr-fn.so \
+test-abicompat/test-diff-ptr-to-void-ptr/1/test-diff-ptr-to-void-ptr-fn-v1.c \
+test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-app \
+test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-app.c \
+test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-report-0.txt \
+test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-report-1.txt \
 \
 test-diff-pkg/dbus-glib-0.104-3.fc23.x86_64.rpm \
 test-diff-pkg/dbus-glib-0.80-3.fc12.x86_64.rpm \
diff --git a/tests/data/test-abicompat/test-diff-ptr-to-void-ptr/0/libtest-diff-ptr-to-void-ptr-fn.so b/tests/data/test-abicompat/test-diff-ptr-to-void-ptr/0/libtest-diff-ptr-to-void-ptr-fn.so
new file mode 100755
index 0000000000000000000000000000000000000000..096981b08ea7723c0e4e255aac7296d64c8e4701
GIT binary patch
literal 12680
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

literal 0
HcmV?d00001

diff --git a/tests/data/test-abicompat/test-diff-ptr-to-void-ptr/0/test-diff-ptr-to-void-ptr-fn-v0.c b/tests/data/test-abicompat/test-diff-ptr-to-void-ptr/0/test-diff-ptr-to-void-ptr-fn-v0.c
--- /dev/null
+++ b/tests/data/test-abicompat/test-diff-ptr-to-void-ptr/0/test-diff-ptr-to-void-ptr-fn-v0.c
@@ -0,0 +1,8 @@ 
+typedef void* VOID_PTR;
+
+void
+foo(int a __attribute__((unused)),
+    char b __attribute__((unused)),
+    VOID_PTR c __attribute__((unused)))
+{
+}
diff --git a/tests/data/test-abicompat/test-diff-ptr-to-void-ptr/1/libtest-diff-ptr-to-void-ptr-fn.so b/tests/data/test-abicompat/test-diff-ptr-to-void-ptr/1/libtest-diff-ptr-to-void-ptr-fn.so
new file mode 100755
index 0000000000000000000000000000000000000000..7eacc45997a2ce95e83e1747c4d530a93aa4bf7a
GIT binary patch
literal 12704
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
J+XwKm;=fbs<a+=B

literal 0
HcmV?d00001

diff --git a/tests/data/test-abicompat/test-diff-ptr-to-void-ptr/1/test-diff-ptr-to-void-ptr-fn-v1.c b/tests/data/test-abicompat/test-diff-ptr-to-void-ptr/1/test-diff-ptr-to-void-ptr-fn-v1.c
--- /dev/null
+++ b/tests/data/test-abicompat/test-diff-ptr-to-void-ptr/1/test-diff-ptr-to-void-ptr-fn-v1.c
@@ -0,0 +1,8 @@ 
+typedef void (*PTR_TO_FN)(...);
+
+void
+foo(int a __attribute__((unused)),
+    char b __attribute__((unused)),
+    PTR_TO_FN c __attribute__((unused)))
+{
+}
diff --git a/tests/data/test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-app b/tests/data/test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-app
new file mode 100755
index 0000000000000000000000000000000000000000..71c02a711b473da09932a16d956728b39a29c5a3
GIT binary patch
literal 13680
zcmeHNZ)_aZ5r2E<a}J!?XNNxyDfJc{2$Wl&|0IM9A?rA{&omHY8}mnn&ED<$y!3AG
zdbbzsK--G~EdeS8B&w>as)$Nazcs3$Lj3?iX+f1L71S?$sT#EfrJ_ZKLPe>R>&)93
z`))a>6jl9nPuiU~^X516-t6w%H*fb_;|C@}iXym##BBn(YFL*d|18AHmnBQGU1F2a
z#dTtvXa`9f9J*{l>eraQ74jRHMoBLW6mcR(f|%}Ch<<^@Ou2_hBh=;-oj9L9Cyffh
zl<gz#V*XB2Kbh9!aE#}#_T8M1`+k`A6K*?E#vzNij|ulN;h3JI0WsycU?1`5#Q;gF
zH_(2`3BeR~u^`1m??Dc!-bf_}a-u<hRl-#X$5bVKrtEL_ZO{5V{-z06?e+~<yLDM%
zdXp~}OxfREfWvrx*21^d4EbB{`t{OvW6Jj#`n?PeybP0f-Ys7E=ubBvnLC#L<g)39
zo{!%1`211r=YQ||;wPzNe~qS|iaZDXO+9|b3)S989s6bU>}oe_JD!B5+P0_R+|{Q;
z4f#cE|I4{rt%f!R|2B2}%?DG*|Cl=V=auQX@xe2LzfQgW`a&D1Up@@#A1-KJeUC|-
zsDE~iJ@Ha3p^MZWJbRm8LKW=BC9j~Mc5dOs*@ZP_^#8KdKl+{|$5&FXzPC5^>c`=f
z@>=T63tsoCg$-mOh)4g`J#XS{P}zKU>iFB|kH9Eii@X97<$<%G@`w8GK8cFIz|Osl
zr&sWF{(}p(nsoO7Mho?1EE}SSimlR$Kq~^R2(%*5ia;v@tq8Ot(277S0{^QB4CI{j
z&XIwf70)?tWhuV2YiE4th*mCWL(&E2Lwx)<J~4OdX#zl7Y7;r;Yt8h9VPx|K*C=~t
z$ukVGP$+;1I-Ma=-gI06yl0oaxaBM?#EV`j?iJ#P3yvl03oZ-?RWdlNonrF9)V?ue
zNE;pjpCK5XKR!iF0nd5k3(tHH(#?>VrM|v3pvxNOps3H~T%DY^0Aw5FUsyK4L8-jt
z6|h-fl&#_2km1SP{oMPtS`iyRsMS(H5<tHS^c|qzM>!OXD;DL*j8K+h%GQk=q9>q3
z*l*k`ISn?hLxuetVkk?%@f(owo=HD8!LbN36{zTpO?39&-qrDNv?}&qwfn~5{%cT-
zwsLSxfbTvOjCRJp9U9xzem^)wo(ks4=mYIzo*b%*GbrO2L3A5<h<5{zy4X+DM?4mc
zS7Vf<xOHkppcR2u1X>YjMW7XdRs>oRXhonEfzKF$Lv6a$Oc3Suxy%)yg?Y?@ux#{+
zxHYWH+9u+kAp92M`8()V;yE|Ciue`!?#bVAx&5OHwF0WBF<okMesYrdb}1D?C;n36
zA0*mAw3q1RM452Tb)NDw&L>!(^C-;Euw3aAaW8$3WchaDx!;)UV7bI6g6+Y_EIFPi
z>BC1c$#Yy+h`&JNA^87|@OS5+!^3oaQ9d~~mQ=Sx7IuR=xI-J%2Gya&(2m5&&<=I`
zjBTkY)1!v?;0<DQJ~>hx9J*yh%*-cC71wp#teVYaf>^O{K54pcA?>(Ln<wu{CYElt
zb|!Z098xuHpuAkR>|%KUb|MDMv=es=o~>oX>~wNi%#I}o#n?o0*F_X34kQy7X`UPf
z6Vp@45ivWSObBNdP7PgfT*m`{(hJq4Nvb#K!mfnpWa1?|SIGE%OsD~wv=fj?djT25
zAMY{Dh4EpW9PL+z&B4|GFiz2RYNqodwJ~j`!_V=|MeOjieS)6xW_HdH9zRZFX{Pfy
zwK4s?I^5TLF4AZ2>vQB2_fq_49lZ*{{gitcQqp*O9@vObq;gmV=IZd|75?ObTr;>5
zjU0t0B`W8Lwzi1ldcZ{<MPaP%Yd|76ohae1G?4b_2Hdn#+LbDBp;0`^+C0>RqO|t_
zi9U?=4h36-K9wH|rC)S(+}0891Z+f1ZH7IPZe?5N=8h9e$1_TMxNmD;x6-pA25#F(
z6-E@fLWDb$9lJYj=|D((7Z`yZDNWhCB^>qT*KfIXivn#?O@NS;uirAY8O`avkK#0c
z7aS3|&^KZi73E)@n~*5TNkN~YLOrDPg}VI60|y92ToU4;ggcZ-_$!f1qkAICeIeKb
zQgQ{DEh=u=$+|GJU<5OZW=YH+oZ4?p&&}XokUBOr9Gpy=Ohjrt?^RrTPu6zrl9K_}
zEM*q=_#2sOJS(Itt58YjY~k+~qHifhzw2)tn#CeK)B}r!yggtQtcRR|tmEN^DNIXQ
z)5#6w&9Y~g2GBxzz%o5kR^!ktHzMsNP+!-)jMBO%3~!rwzZO)$8&!dw(rS+`n^bxB
z_fDJX<L^fyu*A<TsSA7_P`(n@StRKY$$6c?jVY)oVvE?A(4`3bhh+{91$HI*JuiiD
zdIS!%&+87Be+Mdx*erP6!17a2Y1aSO){*~K+KGu>6bH70w3(gXOa045@ICmB1a=Aj
z|46cM`lr;tQt<kL<y|mvd|-oRH^^034MZtE+<p_tV<6|av3wZqz_ZMAF3WEr{h*x*
zkgKdzNACuCcc@b=(Yk}1(kK_5qDXSwXT|b$kT>gp1>`ZfzW85IeK~^qp*C?k?8|wb
zwpZF|TYW!WN1$iPPH?<GB7L3_cs~9y$h$+mpYr=t)Q6dZ-&?DF%9Ol84Zi`vQ)YN(
zR)8RFXB`)WmR*7xK9h!*H!|>u+hx$S3Pv_pNSiss@(QK0VOEwzrjRe@Y|pl|L~{*e
z0bclqSt^;!hV6Q#WwB5)^R{7C^7&<e)Nuwb4H{I}edy!<oC1BeT}uvQVrKM?abx_>
z{qS+a*ni)hqjyY=fq9t!jPaD=x2E>b2xIcV!F{6#jDr&sv*UBd+~~do<A4Z$3eoGn
zZWuPsNkWbU2MLV-(FB-=k1EhsE*OiZYrzz0OdSL*%W;iL*|z)-F3?$FSUE#3bWG1i
zGqCV6iVo-->2jIu%IVcG=I$8d5n*VA(8|ks&rAdLN<LlWnq1yx-HMj3IPew9v4kcu
znrAP0Lc^<o61b*Cp`qTQSzZ*Hwd{gTpL!*~<*;2UI|a9aF`x~4Z6bhb#T?iz6=ZBQ
zdy%f>q6M1F32n7o#ZsYYm%L>XjqaO@<6S2^>0fidlUxTsX5Ps_Cko&OPMY-RdxJ;`
z4Q{<W+)+ZKRk8F1^3@<{rstKMbOr7r7@(c5WWl)UX4hE9T_~(JrPC$*Fmvz~&*nOW
zn5!s;YgAf&j6QD#^E_Pl@SDCjtV>h;ziPka)=oU{utb9jJldk21pIv8N(me1k*puY
ze>Z?XME(yEUS%Lrxt@kP(-ElG`>ztdN_bedG!(|MFd4w}{QU%Vl=EcP5B6UtJjYMO
zPy&S<ah~i8{l0P?DZYpQ0l6gORl=(QJgyV4F!ebhW}t$(Gvjr_>x4f<ikRPGC>YOq
z?)@OcP%-`_;ZG8t^K(#<B@j-L1}WyojOTp#0^!*oQ`TdONj2u$%yYgSrT>Xl>DABA
z>-$e)@lB}UHDNsG_uC1dAVv1il*j)B;rEdq?-$%lc-BK4CILbGvmnEMv44I)7YR>c
z01dw|p7|d@r5?}g7XF_a^Pl<>y#IazjrI7`v_3dZ{-3S~Lp|vKXCSM8{`DSRBJ>_f
zgwOePJO}Z=0$Dx2O86?_RRq<QVE=yyZIA`Ydl1!l9m)T92mLY6^bdgPs>AcTbp;p7
zP*~6B)_9h`3k^7T(R8u8p5*`h&tY((@ct0v__}@wZK%R{{;%LIS`e`w+Q7nirvAEg
z4bSV-^MqF=YVE{0rXg@%@1NJ1Q33|zO~Y9=7zF{^;{NkGZ{uggZzBJRRf~Rw@%VnI
zFYKS`73<)Ws*gIzie!XYrrV%`_aB$ov@WYpf615ZXGKy7#sk;+0TrqF#x*`5IIf`X
z?d#yhwLbn7`DGHs&#!|&Mfh(pkZ2HZt%JX|-v{`AV5}Jl;){e2j&q6dPp&~_jqyw$
zSqC55<^z}i10L=0+*z+$C47QzOzaL$DSY4ayo}E!-@Enr)7yRSMeZmy23W|cn&WNU
N9f9&x01#lszX9VUx_$rv

literal 0
HcmV?d00001

diff --git a/tests/data/test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-app.c b/tests/data/test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-app.c
--- /dev/null
+++ b/tests/data/test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-app.c
@@ -0,0 +1,15 @@ 
+#include <stddef.h>
+
+typedef void* VOID_PTR;
+
+void
+foo(int a __attribute__((unused)),
+    char b __attribute__((unused)),
+    VOID_PTR c __attribute__((unused)));
+
+int
+main()
+{
+  foo(0, 0, NULL);
+  return 0;
+}
diff --git a/tests/data/test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-report-0.txt b/tests/data/test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-report-0.txt
new file mode 100644
index 00000000..e69de29b
diff --git a/tests/data/test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-report-1.txt b/tests/data/test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-report-1.txt
new file mode 100644
index 00000000..e69de29b
diff --git a/tests/print-diff-tree.cc b/tests/print-diff-tree.cc
index 2a54591b..9e638628 100644
--- a/tests/print-diff-tree.cc
+++ b/tests/print-diff-tree.cc
@@ -22,7 +22,6 @@  using abigail::ir::environment_sptr;
 using abigail::comparison::corpus_diff_sptr;
 using abigail::comparison::compute_diff;
 using abigail::comparison::print_diff_tree;
-using abigail::comparison::apply_filters;
 using namespace abigail;
 
 struct options
@@ -131,11 +130,8 @@  main(int argc, char* argv[])
 	  return 1;
 	}
 
-      if (opts.categorize_redundancy)
-	categorize_redundancy(diff);
-
-      if (opts.apply_filters)
-	apply_filters(diff);
+      if (opts.categorize_redundancy || opts.apply_filters)
+	apply_filters_and_categorize_diff_node_tree(diff);
 
       print_diff_tree(diff, cout);
       return 0;
diff --git a/tests/test-abicompat.cc b/tests/test-abicompat.cc
index 5caac187..7dceb892 100644
--- a/tests/test-abicompat.cc
+++ b/tests/test-abicompat.cc
@@ -189,6 +189,26 @@  InOutSpec in_out_specs[] =
     "data/test-abicompat/test7-fn-changed-report-0.txt",
     "output/test-abicompat/test7-fn-changed-report-0.txt",
   },
+  {
+    "data/test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-app",
+    "data/test-abicompat/test-diff-ptr-to-void-ptr/0/libtest-diff-ptr-to-void-ptr-fn.so",
+    "",
+    "",
+    "--show-base-names --no-show-locs --no-redundant",
+    abigail::tools_utils::ABIDIFF_OK,
+    "data/test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-report-0.txt",
+    "output/test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-report-0.txt",
+  },
+  {
+    "data/test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-app",
+    "data/test-abicompat/test-diff-ptr-to-void-ptr/1/libtest-diff-ptr-to-void-ptr-fn.so",
+    "",
+    "",
+    "--show-base-names --no-show-locs --no-redundant",
+    abigail::tools_utils::ABIDIFF_OK,
+    "data/test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-report-1.txt",
+    "output/test-abicompat/test-diff-ptr-to-void-ptr/test-diff-ptr-to-void-ptr-report-1.txt",
+  },
 #ifdef WITH_BTF
   {
     "data/test-abicompat/test7-fn-changed-app.btf",
diff --git a/tools/abicompat.cc b/tools/abicompat.cc
index c6924fd2..b3e556dd 100644
--- a/tools/abicompat.cc
+++ b/tools/abicompat.cc
@@ -81,6 +81,8 @@  using abigail::comparison::corpus_diff;
 using abigail::comparison::corpus_diff_sptr;
 using abigail::comparison::function_type_diff_sptr;
 using abigail::comparison::compute_diff;
+using abigail::comparison::get_default_harmless_categories_bitmap;
+using abigail::comparison::apply_filters_and_categorize_diff_node_tree;
 using abigail::suppr::suppression_sptr;
 using abigail::suppr::suppressions_type;
 using abigail::suppr::read_suppressions;
@@ -400,14 +402,7 @@  create_diff_context(const options& opts)
   ctxt->show_locs(opts.show_locs);
   // Intentional logic flip of ignore_soname
   ctxt->show_soname_change(!opts.ignore_soname);
-  ctxt->switch_categories_off
-    (abigail::comparison::ACCESS_CHANGE_CATEGORY
-     | abigail::comparison::COMPATIBLE_TYPE_CHANGE_CATEGORY
-     | abigail::comparison::HARMLESS_DECL_NAME_CHANGE_CATEGORY
-     | abigail::comparison::NON_VIRT_MEM_FUN_CHANGE_CATEGORY
-     | abigail::comparison::STATIC_DATA_MEMBER_CHANGE_CATEGORY
-     | abigail::comparison::HARMLESS_ENUM_CHANGE_CATEGORY
-     | abigail::comparison::HARMLESS_SYMBOL_ALIAS_CHANGE_CATEGORY);
+  ctxt->switch_categories_off(get_default_harmless_categories_bitmap());
 
   // Load suppression specifications, if there are any.
   suppressions_type supprs;
@@ -481,6 +476,8 @@  compare_expected_against_provided_functions(diff_context_sptr&		ctxt,
 		compute_diff(expected_fn->get_type(),
 			     exported_fn->get_type(),
 			     ctxt);
+	      diff_sptr diff_tree = is_diff(fn_type_diff);
+	      apply_filters_and_categorize_diff_node_tree(diff_tree);
 	      if (fn_type_diff && fn_type_diff->to_be_reported())
 		{
 		  // So there is a type change between the function
@@ -555,6 +552,7 @@  compare_expected_against_provided_variables(diff_context_sptr&		ctxt,
 		compute_diff(expected_var->get_type(),
 			     exported_var->get_type(),
 			     ctxt);
+	      apply_filters_and_categorize_diff_node_tree(type_diff);
 	      if (type_diff && type_diff->to_be_reported())
 		{
 		  // So there is a type change between the variable