[applied] Bug 30959 - Crash on malformed fn call expression

Message ID 87wmvtpdsl.fsf@redhat.com
State New
Headers
Series [applied] Bug 30959 - Crash on malformed fn call expression |

Commit Message

Dodji Seketeli Oct. 11, 2023, 12:02 p.m. UTC
  Hello,

The code fails to ignore a function call expression that is considered
malformed by the type suppression parser.  Fixed thus.

	* src/abg-suppression.cc
	(type_suppression::insertion_range::eval_boundary): If the
	function call expression is considered malformed, then do not
	crash.
	* tests/data/test-diff-suppr/test-has-data-member-inserted-at-1-report-1.txt:
	New reference test output.
	* tests/data/test-diff-suppr/test-has-data-member-inserted-at-1-v{0,1}.c:
	Source code of the new input binaries.
	* tests/data/test-diff-suppr/test-has-data-member-inserted-at-1-v{0,1}.o:
	New input binaries.
	* tests/data/test-diff-suppr/test-has-data-member-inserted-at-1.1.suppr:
	New test suppression specification.
	* tests/data/Makefile.am: Add the new test material above to the
	source distribution.
	* tests/test-diff-suppr.cc (in_out_specs): Add the new tests to
	this harness.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
Applied to master.
---
 src/abg-suppression.cc                         |   9 +++++----
 tests/data/Makefile.am                         |   6 ++++++
 ...-has-data-member-inserted-at-1-report-1.txt |  17 +++++++++++++++++
 .../test-has-data-member-inserted-at-1-v0.c    |  10 ++++++++++
 .../test-has-data-member-inserted-at-1-v0.o    | Bin 0 -> 3232 bytes
 .../test-has-data-member-inserted-at-1-v1.c    |  11 +++++++++++
 .../test-has-data-member-inserted-at-1-v1.o    | Bin 0 -> 3240 bytes
 .../test-has-data-member-inserted-at-1.1.suppr |   3 +++
 tests/test-diff-suppr.cc                       |  10 ++++++++++
 9 files changed, 62 insertions(+), 4 deletions(-)
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-inserted-at-1-report-1.txt
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-inserted-at-1-v0.c
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-inserted-at-1-v0.o
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-inserted-at-1-v1.c
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-inserted-at-1-v1.o
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-inserted-at-1.1.suppr

new file mode 100644
index 00000000..d0ddcd2e
new file mode 100644
index 00000000..49ae2f76
  

Patch

diff --git a/src/abg-suppression.cc b/src/abg-suppression.cc
index 26d19217..254d6ae4 100644
--- a/src/abg-suppression.cc
+++ b/src/abg-suppression.cc
@@ -1468,10 +1468,11 @@  type_suppression::insertion_range::eval_boundary(const boundary_sptr	boundary,
   else if (fn_call_expr_boundary_sptr b = is_fn_call_expr_boundary(boundary))
     {
       ini::function_call_expr_sptr fn_call = b->as_function_call_expr();
-      if ((fn_call->get_name() == "offset_of"
-	   || fn_call->get_name() == "offset_after"
-	   || fn_call->get_name() == "offset_of_first_data_member_regexp"
-	   || fn_call->get_name() == "offset_of_last_data_member_regexp")
+      if (fn_call
+	  && (fn_call->get_name() == "offset_of"
+	      || fn_call->get_name() == "offset_after"
+	      || fn_call->get_name() == "offset_of_first_data_member_regexp"
+	      || fn_call->get_name() == "offset_of_last_data_member_regexp")
 	  && fn_call->get_arguments().size() == 1)
 	{
 	  if (fn_call->get_name() == "offset_of"
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index 0569af34..7b07236e 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -1880,6 +1880,12 @@  test-diff-suppr/test-has-data-member-inserted-between-1-v3.o \
 test-diff-suppr/test-has-data-member-inserted-between-1-v4.c \
 test-diff-suppr/test-has-data-member-inserted-between-1-v4.o \
 test-diff-suppr/test-has-data-member-inserted-between-1.suppr \
+test-diff-suppr/test-has-data-member-inserted-at-1-report-1.txt \
+test-diff-suppr/test-has-data-member-inserted-at-1-v0.c \
+test-diff-suppr/test-has-data-member-inserted-at-1-v0.o \
+test-diff-suppr/test-has-data-member-inserted-at-1-v1.c \
+test-diff-suppr/test-has-data-member-inserted-at-1-v1.o \
+test-diff-suppr/test-has-data-member-inserted-at-1.1.suppr \
 \
 test-diff-dwarf-abixml/test0-pr19026-libvtkIOSQL-6.1.so.1 \
 test-diff-dwarf-abixml/test0-pr19026-libvtkIOSQL-6.1.so.1.abi \
diff --git a/tests/data/test-diff-suppr/test-has-data-member-inserted-at-1-report-1.txt b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-1-report-1.txt
new file mode 100644
index 00000000..d0fac818
--- /dev/null
+++ b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-1-report-1.txt
@@ -0,0 +1,17 @@ 
+Functions changes summary: 0 Removed, 0 Changed, 0 Added function
+Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
+Unreachable types summary: 0 removed, 1 changed, 0 added type
+
+1 changed type unreachable from any public interface:
+
+  [C] 'struct foo' changed:
+    type size hasn't changed
+    1 data member insertion:
+      'int x', at offset 0 (in bits) at test-has-data-member-inserted-at-1-v1.c:3:1
+    1 data member change:
+      type of 'char p[8]' changed:
+        type name changed from 'char[8]' to 'char[4]'
+        array type size changed from 64 to 32
+        array type subrange 1 changed length from 8 to 4
+      and offset changed from 0 to 32 (in bits) (by +32 bits)
+
diff --git a/tests/data/test-diff-suppr/test-has-data-member-inserted-at-1-v0.c b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-1-v0.c
new file mode 100644
index 00000000..237d0d06
--- /dev/null
+++ b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-1-v0.c
@@ -0,0 +1,10 @@ 
+struct foo
+{
+  char p[8];
+};
+
+int
+main(void)
+{
+  return 0;
+}
diff --git a/tests/data/test-diff-suppr/test-has-data-member-inserted-at-1-v0.o b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-1-v0.o
new file mode 100644
index 0000000000000000000000000000000000000000..fb70318ec911a4d03502aa82ecd02d37eba4863b
GIT binary patch
literal 3232
zcmcgu&2Jl35TECbW4GJ5NnAlgK-r?AHi);5Lsddcicv(<P}EkHDnunPYx~(=@UG47
zI!el+NJt<A2M!!L^uUEPm)^N>LY(*ykT{kz2bfvUbGI*BH3Er|_RY+1KHsN(_szF2
z7lZ&!0xrQrO``z!N)P2mDmLH*RN>Z@FMq#J`g=cpfnyOwnY028&(V-2JEK_L;SkC~
zl(!L_8G*1;2~)g}z&rTO(on*LX=x#5QAHg|l*DJmnRHt5U3sSHhY32I2HU=5TNUhN
zLA+3@+SbbQ%7R!d%|8ubRk4_DU$8IQuiB!D<>$aEPt=|22Bs?tu~Q|>>?zo()(|PV
z@cNQfnK+$U+Nn~q#>qQN0A(&l6MqT6bncKYgYFP?i&KDwtH_J!`yz57#9x&;VzdGH
zp|FzfMM10-j!)92aYX?~rs`7h=+&Zlw@^U;?Q6H3t@<lYz3#s3)}8gW_4Rsvz3!a7
zsXERTFJXf`x9Z3s8HZ}Kr$QC^ZB)Ie-QV2XI4{qile_DV>^ZU<4y79SfggH_lH+h3
ztB&lb*0?8={gH|x@ca-4!?5R!!`SbIScTTV-S;A>^@o9~b%vb}{aVjYY6HLJwfvsv
z4{BY1PsO!F#YtT2c!`&avg3EVG9Hgc5s*pty;zb}1}bQ&Ncv%{q69ne5?PnKYi|30
zsd3m|V0&xpf^!zPVD%8|pY9_LCs+`7Zi3jG7t6;=<!^A)pGBNLqV({*QJMd|ur)V(
z8675Y?nvil2LAjz&uHb|Y`hPAWX%{0EqP>Ng*>t#y`l$9*5uaa;71N%1Xz!`E*2bn
zj6dG<9J1he4odmw4&bYZEN0ecdSMT{{pnS}$AB{*MV?&^U6JtYtQRx>WP6SErwp7`
zc!mYq=jjuGGCd$fltcGG`fVDJblvep1&_JL>G3A&PT16c#QMj~&ANJyl&8o(#O7Hx
z{hw!?{ORkkP7f!M#_y#XK%Ke9e`ft6b2GogIIT@~eZY<PgT!kgPofF$YbjBC3Apss
zfZK{=a3eMF-1MDm`eAp7HhS}#UaJ+U-ABw`<b^$a2(uvrKU6vdOK6ecW~#S`L7?!N
zbi-kyTzoKOoOtbzIEm^vyO9?tp2&Y>%NS2<r1wduYp^gq=d6=&mQJBUnE4XW4_6+U
z@n_J9&f~w0r~Nl`Qe9pDD^fCK`qH_g*Q$~6A@K$u)(4C)ASXY4cTO_CiQLRdrr+4U
z&s;Op_XZkFjC`*%xTXV{o4z#9y#5=!p*o)Wr~gJ~|8&31oCv{P2CtKnA=9^sw!Hcy
zuKxkYQhj>Y%=#n5D5vfd#gu;GLSJiuxvsDICy3|8-{#Bx;0f_`KJwz<;saTGLj1QJ
zZ@9s}d7#-r_pSYZ;P^-0BE&xB_zmsIT(6&ozegc&{eR{4*XNYhpMLFhyvC^?vo=C-
qpX>LzVfr1SUr{rj_B3y*4&NUa?O8JCPkrUZ|H1wLm<>kRjQ<BUj2Q?3

literal 0
HcmV?d00001

diff --git a/tests/data/test-diff-suppr/test-has-data-member-inserted-at-1-v1.c b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-1-v1.c
--- /dev/null
+++ b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-1-v1.c
@@ -0,0 +1,11 @@ 
+struct foo
+{
+  int x;
+  char p[4];
+};
+
+int
+main(void)
+{
+  return 0;
+}
diff --git a/tests/data/test-diff-suppr/test-has-data-member-inserted-at-1-v1.o b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-1-v1.o
new file mode 100644
index 0000000000000000000000000000000000000000..e85c3aa0e6f1a146a66698bb2c86fb6dcd7f74e2
GIT binary patch
literal 3240
zcmcgu&2Jl35TEC@W4CVHBu3CQplm8olZsu}rYa#N#VDdpR0OD^f*z1r+t2nEdu?{t
zQ5p^iApsQ}df>=`0|z*B;fTbAKcP2H+{2jzomtOwUSGCq1QJhrJ2StTc{A^0#{Tq;
zH?L)c05t?$g+oc906*pr`Fg_E;VCG?t?he%{zCExzum`g4n%<@i$2fMM;}E^$aaQ9
zC<sw_2SKq1R-PCTBghusLnaHkY|am2m<dqo;>^>>f=nSvB_n1~ge00Mh{Txy94d_X
z4#X^2g^d+)rT9v5r@W4u%=1tzUM*TBTx(vuP%0O#<)!6$v5=p82BVgRRVWrWisT^5
zxFI&jI5R@*lnKkPz)rb>YZY90ZP6-Ctj{m*lxdmznf*mf;zgVp%4U*c!qG=1HwBov
zfi#D<7mx}e{w~cDp{u}&%yM!o8L^x>Jy|yK%LzC!70>2Q-pGmDnGD)rf9saLRejm6
zR^6A}s$IKSt5vJDs=azsw(V^%W`%QU&2|RyIFOrN8OYFYq3DIJ-sax=W#{rGXSZfM
zUEApdLr3=gfggCWbjHCrl5M9go8zt%-yO*a2A&^4e;9P_aS-|40He_5wR&C%mELe5
zEA3(Xj$i5eai#A!y{6yw{C=h5@5!hV%P5X2Z7=o`)@l2ljuVYXqYy~t^t{L+tuv5=
zrVJfFh-4UJ243t`o!zS2`d?xkHy60RwY6cd;uWkN<NT9*#9EpRv40b*VNNWa$`|hA
zl|PFxO&ZD5dA&6EMP_Su<{BDI;M6a@mMr}BPnyz7t?;C_(#)~ul5#$xvoJ#1uplYT
zBPt8DCZcIAIH5_0to4{;vEbC9k;YkoMV&G%IGuvherJ#1Yltjp=QAzW<6eGJ2!};~
z64%pDLq#N9-}M4#LO9J=S$^8US%kC9&^=EZ0P+_Yr#1BVaYw@`?wI9|4g5=%cMW{R
z@@GuVxN46SH^(+a=9o9_&oNH+G}|mw+oYlJ?-L22%2eUMvwVfAxxURfosE7z;6`@`
zvDZWzhZEXUTrBruaH-LN+l(S`L)rJ-q{}t@pff}rb-aexY=(085w#b3K^NPg?$Y-I
zsa!CGVhL^}a%(skNNkdBFpQ;(?ZSy-uk{fxB72Qa=nW)q<Uf)n^rtgY_oSAqGc$eX
zER(H1R!|_!>;&|)l{QTO^Jqlx@!$H>{hMo2TowOY60~93(z~K=Ro85YeV-re0ps&X
z$xhYI8OAq}nro8k57zH9Rm8NV|0gC!wznC)s2rJ^wzSW*{I~f+l|SWAUDnK>>dRac
zA-Koj+azeiv~8d+E&d+I|B!ttKJ^zf{s=KzQ{{<lG9GZCZxp~(#aHwb#MAuST-*mw
z@c;TT{_paGtUSS=-j~WnH~rjv(5y6Ve`5bfdJ$q@vH!ZhDDvw36#N4+Y3Kid&tJV$
zI)D1LQ~nC4e9YJg!LJ;@#|hK#5dDgp{&c5lTV3V)aZ#@ibN`fAn*Rak|FiClyy^cC
Dm(LpS

literal 0
HcmV?d00001

diff --git a/tests/data/test-diff-suppr/test-has-data-member-inserted-at-1.1.suppr b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-1.1.suppr
--- /dev/null
+++ b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-1.1.suppr
@@ -0,0 +1,3 @@ 
+[suppress_type]
+  type_kind = struct
+  has_data_member_inserted_at = offset_of_first_data_member_regexp(.*foo[0-9]?$)
diff --git a/tests/test-diff-suppr.cc b/tests/test-diff-suppr.cc
index 11be9b9a..19db440b 100644
--- a/tests/test-diff-suppr.cc
+++ b/tests/test-diff-suppr.cc
@@ -2256,6 +2256,16 @@  InOutSpec in_out_specs[] =
     "data/test-diff-suppr/test-has-data-member-inserted-between-1-report-4.txt",
     "output/test-diff-suppr/test-has-data-member-inserted-between-1-report-4.txt"
   },
+  {
+    "data/test-diff-suppr/test-has-data-member-inserted-at-1-v0.o",
+    "data/test-diff-suppr/test-has-data-member-inserted-at-1-v1.o",
+    "",
+    "",
+    "data/test-diff-suppr/test-has-data-member-inserted-at-1.1.suppr",
+    "--drop-private-types --no-default-suppression --non-reachable-types",
+    "data/test-diff-suppr/test-has-data-member-inserted-at-1-report-1.txt",
+    "output/test-diff-suppr/test-has-data-member-inserted-at-1-report-1.txt"
+  },
   // This should be the last entry
   {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}
 };