llvm-project/lldb/unittests/Core/DataExtractorTest.cpp
Pavel Labath f7e7fdd5cf 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
2016-07-26 08:11:57 +00:00

57 lines
1.8 KiB
C++

//===-- DataExtractorTest.cpp -----------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#if defined(_MSC_VER) && (_HAS_EXCEPTIONS == 0)
// Workaround for MSVC standard library bug, which fails to include <thread> when
// exceptions are disabled.
#include <eh.h>
#endif
#include "gtest/gtest.h"
#include "lldb/Core/DataExtractor.h"
using namespace lldb_private;
TEST(DataExtractorTest, GetBitfield)
{
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 *));
lldb::offset_t offset;
offset = 0;
ASSERT_EQ(buffer[1], LE.GetMaxU64Bitfield(&offset, sizeof(buffer), 8, 8));
offset = 0;
ASSERT_EQ(buffer[1], BE.GetMaxU64Bitfield(&offset, sizeof(buffer), 8, 8));
offset = 0;
ASSERT_EQ(int8_t(buffer[1]), LE.GetMaxS64Bitfield(&offset, sizeof(buffer), 8, 8));
offset = 0;
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));
}