summaryrefslogtreecommitdiffstats
path: root/lldb/unittests/Core/DataExtractorTest.cpp
diff options
context:
space:
mode:
authorPavel Labath <labath@google.com>2016-07-26 08:11:57 +0000
committerPavel Labath <labath@google.com>2016-07-26 08:11:57 +0000
commitf7e7fdd5cfebf4a8a30e4b4dce410a237f13a17c (patch)
tree292207befa0aff5545df77cd99b19009691ab0d2 /lldb/unittests/Core/DataExtractorTest.cpp
parent79011a660eda556f553fe52f090cb4156f12c1ab (diff)
downloadbcm5719-llvm-f7e7fdd5cfebf4a8a30e4b4dce410a237f13a17c.tar.gz
bcm5719-llvm-f7e7fdd5cfebf4a8a30e4b4dce410a237f13a17c.zip
Fix DataExtractor::PeekData for zero length peeks
Summary: The function was returning the null pointer for peeks of size zero, which seems like a sensible thing to do, but is actually pretty easy to get bitten by that if you are extracting a variable length field which happens to be of zero length and then doing pointer arithmetic on that (which SymbolFileDWARF does, and ended up crashing in case of empty DW_AT_location). This changes the function to return a null pointer only when it gets queried for data which is outside of the range of the extractor, which is more c++-y, as one can still do reasonable things with pointers to data of size zero (think, end() iterators). I also add a test and fix some signedness warnings in the existing data extractor tests. Reviewers: clayborg Subscribers: lldb-commits Differential Revision: https://reviews.llvm.org/D22755 llvm-svn: 276734
Diffstat (limited to 'lldb/unittests/Core/DataExtractorTest.cpp')
-rw-r--r--lldb/unittests/Core/DataExtractorTest.cpp23
1 files changed, 20 insertions, 3 deletions
diff --git a/lldb/unittests/Core/DataExtractorTest.cpp b/lldb/unittests/Core/DataExtractorTest.cpp
index f2288387505..22438e59bea 100644
--- a/lldb/unittests/Core/DataExtractorTest.cpp
+++ b/lldb/unittests/Core/DataExtractorTest.cpp
@@ -21,7 +21,7 @@ using namespace lldb_private;
TEST(DataExtractorTest, GetBitfield)
{
- char buffer[] = { 0x01, 0x23, 0x45, 0x67 };
+ uint8_t buffer[] = { 0x01, 0x23, 0x45, 0x67 };
DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle, sizeof(void *));
DataExtractor BE(buffer, sizeof(buffer), lldb::eByteOrderBig, sizeof(void *));
@@ -33,7 +33,24 @@ TEST(DataExtractorTest, GetBitfield)
ASSERT_EQ(buffer[1], BE.GetMaxU64Bitfield(&offset, sizeof(buffer), 8, 8));
offset = 0;
- ASSERT_EQ(buffer[1], LE.GetMaxS64Bitfield(&offset, sizeof(buffer), 8, 8));
+ ASSERT_EQ(int8_t(buffer[1]), LE.GetMaxS64Bitfield(&offset, sizeof(buffer), 8, 8));
offset = 0;
- ASSERT_EQ(buffer[1], BE.GetMaxS64Bitfield(&offset, sizeof(buffer), 8, 8));
+ ASSERT_EQ(int8_t(buffer[1]), BE.GetMaxS64Bitfield(&offset, sizeof(buffer), 8, 8));
+}
+
+TEST(DataExtractorTest, PeekData)
+{
+ uint8_t buffer[] = { 0x01, 0x02, 0x03, 0x04 };
+ DataExtractor E(buffer, sizeof buffer, lldb::eByteOrderLittle, 4);
+
+ EXPECT_EQ(buffer + 0, E.PeekData(0, 0));
+ EXPECT_EQ(buffer + 0, E.PeekData(0, 4));
+ EXPECT_EQ(nullptr, E.PeekData(0, 5));
+
+ EXPECT_EQ(buffer + 2, E.PeekData(2, 0));
+ EXPECT_EQ(buffer + 2, E.PeekData(2, 2));
+ EXPECT_EQ(nullptr, E.PeekData(2, 3));
+
+ EXPECT_EQ(buffer + 4, E.PeekData(4, 0));
+ EXPECT_EQ(nullptr, E.PeekData(4, 1));
}
OpenPOWER on IntegriCloud