This is the mail archive of the elfutils-devel@sourceware.org mailing list for the elfutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix 22546: dwarf_aggregate_size() works with multi-dimensional arrays


This fixes

https://sourceware.org/bugzilla/show_bug.cgi?id=22546

>From 5f65148409fa08613f21280c5aea026d8b78366f Mon Sep 17 00:00:00 2001
From: Dima Kogan <dkogan@debian.org>
Date: Fri, 8 Dec 2017 01:45:10 -0800
Subject: [PATCH] libdw: dwarf_aggregate_size() works with multi-dimensional
 arrays

If we have a multidimensional array of dimensions (a,b,c) the number of elements
should be a*b*c, but prior to this patch dwarf_aggregate_size() would report
a+b+c instead.

This patch fixes the bug and adds a test that demonstrates the bug (the test
fails without the functional part of this patch).

Fixes: https://sourceware.org/bugzilla/show_bug.cgi?id=22546

Signed-off-by: Dima Kogan <dima@secretsauce.net>
---
 libdw/ChangeLog              |   5 +++++
 libdw/dwarf_aggregate_size.c |  43 ++++++++++++++++++++++---------------------
 tests/ChangeLog              |   6 ++++++
 tests/run-aggregate-size.sh  |   2 ++
 tests/run-peel-type.sh       |   1 +
 tests/testfile-sizes3.o.bz2  | Bin 1147 -> 1208 bytes
 6 files changed, 36 insertions(+), 21 deletions(-)

diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index 43752440..2a6d7118 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,8 @@
+2017-12-11  Dima Kogan  <dima@secretsauce.net>
+
+	* dwarf_aggregate_size.c (array_size): Handle multi-dimensional
+	arrays properly.
+
 2017-11-03  Mark Wielaard  <mark@klomp.org>
 
 	* dwarf_getlocation.c (__libdw_intern_expression): Handle
diff --git a/libdw/dwarf_aggregate_size.c b/libdw/dwarf_aggregate_size.c
index 838468dd..3010c0aa 100644
--- a/libdw/dwarf_aggregate_size.c
+++ b/libdw/dwarf_aggregate_size.c
@@ -63,7 +63,7 @@ array_size (Dwarf_Die *die, Dwarf_Word *size,
     return -1;
 
   bool any = false;
-  Dwarf_Word total = 0;
+  Dwarf_Word count_total = 1;
   do
     {
       Dwarf_Word count;
@@ -134,34 +134,35 @@ array_size (Dwarf_Die *die, Dwarf_Word *size,
 	  continue;
 	}
 
-      /* This is a subrange_type or enumeration_type and we've set COUNT.
-	 Now determine the stride for this array dimension.  */
-      Dwarf_Word stride = eltsize;
-      if (INTUSE(dwarf_attr_integrate) (&child, DW_AT_byte_stride,
-					attr_mem) != NULL)
-	{
-	  if (INTUSE(dwarf_formudata) (attr_mem, &stride) != 0)
-	    return -1;
-	}
-      else if (INTUSE(dwarf_attr_integrate) (&child, DW_AT_bit_stride,
-					     attr_mem) != NULL)
-	{
-	  if (INTUSE(dwarf_formudata) (attr_mem, &stride) != 0)
-	    return -1;
-	  if (stride % 8) 	/* XXX maybe compute in bits? */
-	    return -1;
-	  stride /= 8;
-	}
+      count_total *= count;
 
       any = true;
-      total += stride * count;
     }
   while (INTUSE(dwarf_siblingof) (&child, &child) == 0);
 
   if (!any)
     return -1;
 
-  *size = total;
+  /* This is a subrange_type or enumeration_type and we've set COUNT.
+     Now determine the stride for this array.  */
+  Dwarf_Word stride = eltsize;
+  if (INTUSE(dwarf_attr_integrate) (die, DW_AT_byte_stride,
+                                    attr_mem) != NULL)
+    {
+      if (INTUSE(dwarf_formudata) (attr_mem, &stride) != 0)
+        return -1;
+    }
+  else if (INTUSE(dwarf_attr_integrate) (die, DW_AT_bit_stride,
+                                         attr_mem) != NULL)
+    {
+      if (INTUSE(dwarf_formudata) (attr_mem, &stride) != 0)
+        return -1;
+      if (stride % 8) 	/* XXX maybe compute in bits? */
+        return -1;
+      stride /= 8;
+    }
+
+  *size = count_total * stride;
   return 0;
 }
 
diff --git a/tests/ChangeLog b/tests/ChangeLog
index fe633594..e16a3d04 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,9 @@
+2017-12-11  Dima Kogan  <dima@secretsauce.net>
+
+        * run-aggregate-size.sh: Added check for multi-dimensional arrays.
+        * run-peel-type.sh: Likewise.
+        * testfile-sizes3.o.bz2: Likewise.
+
 2017-12-07  Mark Wielaard  <mark@klomp.org>
 
 	* run-readelf-variant.sh: New test.
diff --git a/tests/run-aggregate-size.sh b/tests/run-aggregate-size.sh
index 42b0742b..6d8aa240 100755
--- a/tests/run-aggregate-size.sh
+++ b/tests/run-aggregate-size.sh
@@ -54,6 +54,7 @@
 # volatile int ia[32];
 # const volatile void * const volatile restrict va[64];
 # struct s sa[8];
+# double d3d[3][4][5];
 #
 # typedef const int foo;
 # typedef volatile foo bar;
@@ -98,6 +99,7 @@ ca size 16
 ia size 128
 va size 512
 sa size 128
+d3d size 480
 f size 4
 b size 4
 EOF
diff --git a/tests/run-peel-type.sh b/tests/run-peel-type.sh
index 7fd96e84..668e3161 100755
--- a/tests/run-peel-type.sh
+++ b/tests/run-peel-type.sh
@@ -55,6 +55,7 @@ ca raw type array_type
 ia raw type array_type
 va raw type array_type
 sa raw type array_type
+d3d raw type array_type
 f raw type base_type
 b raw type base_type
 EOF
diff --git a/tests/testfile-sizes3.o.bz2 b/tests/testfile-sizes3.o.bz2
index 7fa6a8a529676bc8324d383c8d11f86c66ef453c..863338269bab61fb385344c489d48d1466915b61 100644
GIT binary patch
literal 1208
zcmV;p1V{TqT4*^jL0KkKS#6BOfdB+#|L_0*|Nrmj|NqbJ$0`5s-*CW0grxvV07V4=
z#YuEo&;$O8fgmQKVWLd}XliXV4Jo|{$vjM$h||>3lRynJ4@5STKx7&K(@dIZ^*v4M
zO&SQACR0r@JyX%5c}+CX000Jn00000000004FExt044!3GGxF2m=ggpFiZdd005a7
z34shC5M;m!fJ{u8FaRb5z)VaN00000CPo5aLkIyPA|TR1Jk->A4Npn6GJ1y8(7_rs
z(V!328aANF8ZsJa^wA6v=#2sCEv>fvAEl-1JsnyijCVVn;F96iw5rqPe7fD8oTY%#
zzkuFv<xcg{!D<sifYLF?nebGyki!^;;IcV3kT6Jt;f0h@sFJHlOnPn9#jRRY%B<AH
zjq=CIm$z1%z_R8|7)b_UFzqO*gE*!?#)T&{Y1eVzUMWS!@aFb5Zu4@NvnvF^=1R;^
z0RfQ)^)tR{0eKSfk|o??SQ-Vu=K9pXR4bXD)0o%i-?oV@-j9cW*ZOQF6R)T1i@&<Z
zSjYl!?V$>wU@36G3K_Qb9Sag|zst|i=R^b=#SNyh%ugP6%%MroDY)>eBF2GVY8z>^
zA#zxcHJ~$H7_haaFxpbV8FL9XCW(Qu5ipQT9FWH50EP%nnyiM8k?@$e86)x5;K|ab
zjRE)de=To@@M38Tdc;E#&wkd|ogxudAm_AcG^Zpl&8cWfutQ+j8P2|N;UJ?)WMH{j
zkdUguXf=;74rRSb@MjvmMs8TC%hb};SB$d}XTE5h+iFFPJxFCbzy&paR@UwAE8I|a
z>xv}SnwAD>pa%$y@(plQfgqr{x1+1G*MleHd-cI?2p3a%pSs%d=EyV)h8{65&x97d
z>cDTWLv8Xn`g=akU54?c+i3h47%y-nOZ)e~&fmHUsODqv5K0UU8IB#yK_fyTqUYo+
z)d?A_7DlSo=IuV-hDwK$z_pp|ywWc)*!}X1qKo}@IdI`&akX%qVS+{otAS{>1hp0Y
zbtneMFy6|*&|9z(0}COLj1K0FvK}l(J|&ecc3B9Bj{i?y%G7S#p%iNi46?!k>de^?
z3Rs5G!w7B`gxJ+7U0I2THHuOQ(1_YGz6@iwwMq&Y2zO6EVh!zH9mMFImZ>*ZsuLy0
zn3@%twCb_%q@x}3@E3X|(lXKpMNGy8M6IZ*<}a>cyXYroi4JaI<XL6Mx(Jj~GqA-k
zXb%WdkRvqb%$dMKNLMVmfkGw{SNC~e%^@#>BJ!eQ3k4}8G!<+lI=Adwap=bECfTe(
zW+rQEQP(u6ongYUT{QX6VtT7#Np6UV8Ib#0Si}K9g8qhj$h|~>RR>A#gn%ZG0P;rC
zXb4sTR}i6mh^hs5)i70UnnMDF2qkUMOrr4^D7XnaV83=f7$B8Q&M?G4WL7l;K?{x`
z{u*5F#e8Rgc*rV;5Ik9ip@F4bgtMYX0k#wg$ahLQc{34|8S4cHt2PcHrIj$$i66yu
zQV^pm;)Dbq17r>Pa;eFUB?r>OOiJ&Q0|>(mpy5@cn3e0WYtS^ZjtF!vE8pbd@yJU2
WN)yF8Z)d&>{}*yaI8cynjKqQ37B1`n

literal 1147
zcmV->1cduST4*^jL0KkKSxZ~zf&c_3|NsC0|L^bT_ka8SS{VQT-|)ggfXE^V2tr{{
zfPe%fFbvQGsyqn-n<EVnnrMl=Dm_mW@=w%{DWSbd>NI+XsA;u5Kn*nY9-4z>Lror_
z1JrFJL-eE6^hSh2YGI~{l5I58Q%_UUX{Jp8000000000000068OeO$Km;eOC3;+NC
zm=geu002w?00IU~CIC#B00hJg0001(699|=089V?0Fe<0o{}3)Q#55BQ+lVUX_HKW
z>S>{%4X83S7?_Me4K&f|84pt<^+tzP)-#f|y7q30foPkXqYxWfgEY8a>(~ESWfS6-
z@Ni+=gF-x(6*8ds7=!_fcc2kOBPJBU<GRQ?0tC?^CN&|5C!&5Nxl<*@ihk@!8vP6N
zb~9?QZ$X^t;U!#h5Gk76G$6+a)RjA#4E{7O(J7KWD9`F?U-H)H-g)ZA26UR~0D>Tw
z#ZeF;oL~!mc$lCHaf@Drt4cMyxPV_n1%SYA{*@Uz8m{Xo77Mc1ipRx|I%Gs-^K(S#
zz~LeuggzfHUyp-V(Bybt)#5L0rk*Fcl4m_=YRW}g1D3!>b4XIsTc#4pVGLTXT1b{C
zY;B`mlF~hPlCrSbNQO5skS=2lszO~R9%C1M@JC<r;>p&g7!T8HvC6bBViRaun7(O9
zMH*Q?m_SQ4nGFCoAne2jUmhiaU4g<%SiRPgJxp*QJ!Z6V-=k*4?&l$Mq#Nd}>3J!t
zfx`XPsYr$eHCW5YOOW$;<Uu(Mp?6|G-W*-ru}Ghjw5>|$B@q}qM(GTYNG+|LJ({_8
zb?fQ(KL3N(l{N!Fuwt=`l~6!h_jQGp+&2DQfA3p2e_{{Wqh*T+0t305Wg<};8-x;t
zy1Eb$FcdZ6tgC~fs4Li$X=7Hm$kLz{Vyi0BR^Tv8VMh)byfdjST0soqw3Uq0%@siW
zhg)D{cfrYaV$Ry29j-}_4KTE4FuSx2gziv|o=8Q_V$X13V#y?Tx__-HW3poW6C$fd
z@R9=!CQBj`C4z1vY#q@>WGYL(A=#;?K`$6H79)_yACnT8a*1<2g3nIX@5n|ABB$^!
z2F#TNRAR^FJ!$x@vp$$~3RP9v;)X!xUCK>tjRyltEBDzZBH@|);M+R^*Ec4{I0-W4
zgB{bwG2sl~4o$|I-@tg-b+`N9^GeVf@32um(kr174#XSZnKXtArwj{}267M#JLjb?
zBEnP>Sz`~{TP{nXOoJaxH!a1OYD%q#3i;{k(pI3vICDllLdrL&<q$UwX54S9jwIN(
zLr@Cl+-iX>A+{t8{qoj}gu_}I)ytfkiqQ~5BcQzLqo_fwvE6!VfF5U-qN=(h5<Hk}
z?>IlgqS=W8etiOryOLoxgk~01!GmL1C>KHinx!gA5J!N5gTbgIL$nc6oK%e13>g$>
z2FNzDZWI9%SIuBR+mE)BL>%;jojDHxDS-I|yTEbKl*(HQYg(19@laZxtTkWzypjKl
Nxgwk>NF}ZF!2m-C{KEhM

-- 
2.14.1


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]