This is the mail archive of the
elfutils-devel@sourceware.org
mailing list for the elfutils project.
incorrect signed data
- From: Josh Stone <jistone at redhat dot com>
- To: elfutils-devel at lists dot fedorahosted dot org
- Date: Tue, 04 Feb 2014 14:00:29 -0800
- Subject: incorrect signed data
Hi,
I was just investigating some signed-value inconsistencies I found
between libdwarf and libdw, while working on a little experiment[1]. I
think elfutils is actually handling dwarf_formsdata incorrectly.
Libdwarf doesn't have dwarf_decl_line et al., so I was coding that bit
manually, but I got some negative values from dwarf_formsdata. An
example raw attr is data1 0xb5, which gave me -75.
DWARF4 section 7.5.4 states that values of data1/2/4/8 may be signed or
unsigned integers, or anything else depending on context. So when
libdwarf's dwarf_formsdata treats 0xb5 as signed for -75, I think that's
the proper interpretation of context. On the other hand, libdw's
dwarf_formsdata does "*return_sval = *attr->valp", which in C's
promotion rules will not sign-extend! (from unsigned char to int64_t)
So libdw's dwarf_formsdata reads 0xb5 as 179. The rest of data2/4/8 are
using read_2/4/8ubyte_unaligned, which is also wrong IMO.
DWARF4 section 2.14 states that DW_AT_decl_file/line/column are all
unsigned constants, but dwarf_decl_line/column (and _file internally)
are treating these as signed values, using dwarf_formsdata. I think
they're just lucky that this isn't getting sign-extended, but really
these functions should be using dwarf_formudata.
So:
- dwarf_formsdata ought to sign-extend small data.
- dwarf_decl_file/line/column should use dwarf_formudata.
Thoughts?
Josh
[1] https://github.com/cuviper/nontrivial-param