This is the mail archive of the
elfutils-devel@sourceware.org
mailing list for the elfutils project.
[PATCH] Fix 22546: dwarf_aggregate_size() works with multi-dimensional arrays
- From: Dima Kogan <dima at secretsauce dot net>
- To: elfutils-devel at sourceware dot org
- Date: Mon, 11 Dec 2017 21:57:56 -0800
- Subject: [PATCH] Fix 22546: dwarf_aggregate_size() works with multi-dimensional arrays
- Authentication-results: sourceware.org; auth=none
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=secretsauce.net; h=content-type:date:from:message-id:mime-version:subject:to :x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=Q+UDy+A1LObOr6gzg Pg5cYXUFj/hzjXTX4v0P58maD0=; b=X4BmbABjP/wl7gyrpoErdtGBRF8U9O9e/ nNKKz2Pyta84xvhjc+U6gU5Qm4cqmVq4xXC5PVk2k/FbQ7dkMVMwcg0mdceCHuOv 1scYX0m/mav0SBZoBDsOVb5ObrHUvS+Dz+QPRLJQcV/D9l4AnB0c7z9j39v2NgQr Hgbg84oyOv9EOhjzG0UB35nvkIk6LYtYRIxZYwxgf1WDzZOTIG3yWZnl9rgiJT79 OxjDaNgwkqhx2Yt31qqynCwPwCSKqokIk2F/dvknX34biELvqE+rhwh8Au+qWyJR Xj7S/zb3uUzZlCaaoBSGRIOAKchmSE5J5Q/SULkkLkyISXXAxYi1w==
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-type:date:from:message-id :mime-version:subject:to:x-me-sender:x-me-sender:x-sasl-enc; s= fm1; bh=Q+UDy+A1LObOr6gzgPg5cYXUFj/hzjXTX4v0P58maD0=; b=HItTaAyP 7l31KWiNQVhNp6Dq+hQUy3ixILiOhljUmES9UlyKsu2qxMZsLRNfXG374yzYTCb/ Uyhkyy2US17resZktOxJRSXMC+bX/0UVMfLcuat374QGu+RHNN7hzjXnPpP34OXL 6C2nwbe2e+RThioLlyWXcaUNutXTe8fW3+c27MSB1MSveNoBgfhMUGSta3ZhmAKT edeI9jQcthYhuWxneGHcWYSQY0OJqFYoKYEnBcENlyTeSTLmgTfcSSNy8CCxxoR6 o751jtW3ckPtNUR0eSxgrPWenTVqHXImodGasUz+Og2a8KrWpwitap64nOPf1D7/ KFiVvwf1Q+i3Yg==
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