-
Notifications
You must be signed in to change notification settings - Fork 506
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
False positive on LocationParser.attribute_has_location() (#501)
* Fix for LocationParser.attribute_has_location * Test for DWARFv3, section 5.6.6 * V5 ctrparts to GNU attribs that may be locations * Test for the false negative * Test explanation
- Loading branch information
Showing
3 changed files
with
57 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,6 +9,7 @@ MANIFEST | |
*.sublime-workspace | ||
*.egg-info | ||
.vscode | ||
temp | ||
|
||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
#------------------------------------------------------------------------------- | ||
# elftools tests | ||
# | ||
# Eli Bendersky (eliben@gmail.com) | ||
# This code is in the public domain | ||
#------------------------------------------------------------------------------- | ||
import unittest | ||
|
||
from elftools.dwarf.locationlists import LocationParser | ||
from elftools.dwarf.die import AttributeValue | ||
|
||
class TestLocationAttrubute(unittest.TestCase): | ||
def test_has_location(self): | ||
# This attribute comes from a DWARFv3 binary that doesn't have a location lists | ||
# section. Before the patch, pyelftools would interpret it as an attribute with a | ||
# location, more specifically with a location list offset (as opposed to an expression). | ||
# Meanwhile, by the spec, DW_AT_data_member_location is not even capable | ||
# of storing a location list offset (since structure layout | ||
# can't vary by code location). DWARFv3 spec also provides that DW_AT_data_member_location | ||
# may be a small integer with an offset from the structure's base address, and that | ||
# seems to be the case here. Ergo, pyelftools should not claim this attribute a location. | ||
# Since the location/loclist parse function uses the same check, ths fix will | ||
# prevent such attribute values from being misparsed, also. | ||
# | ||
# The notion that member location in a structure had to be a DWARF expression | ||
# was a misnomer all along - how often does one see a compound datatype | ||
# with a static member set but a dynamic layout? | ||
attr = AttributeValue(name='DW_AT_data_member_location', form='DW_FORM_data1', value=0, raw_value=0, offset=402, indirection_length=0) | ||
self.assertFalse(LocationParser.attribute_has_location(attr, 3)) | ||
|
||
# This attribute comes from a DWARFv5 binary. Its form unambiguously tells us it's a | ||
# location expression. Before the patch, pyelftools would not recognize it as one, | ||
# because it has a hard-coded list of attributes that may contain a location, and | ||
# DW_AT_call_target was not in that list. | ||
attr = AttributeValue(name='DW_AT_call_target', form='DW_FORM_exprloc', value=[80], raw_value=[80], offset=8509, indirection_length=0) | ||
self.assertTrue(LocationParser.attribute_has_location(attr, 5)) | ||
|
||
|
||
if __name__ == '__main__': | ||
unittest.main() |