Remove CHECK in AdjustEncodedValue.

The CHECK(encoding != DW_EH_PE_aligned) can trip given the right
arguments. This check isn't necessary, since the code will return
false in that case.

Add new unit test that tries all values to make sure no CHECK fires.

Bug: 120968571

Test: Passes new unit test, and passes fuzzing that failed before.
Change-Id: I062bcd18508c75cd3a4ca9dd12f922e25aafda8a
This commit is contained in:
Christopher Ferris 2018-12-20 08:40:58 -08:00
parent 38ff80810a
commit a39aaf91eb
2 changed files with 23 additions and 1 deletions

View file

@ -104,7 +104,6 @@ size_t DwarfMemory::GetEncodedSize(uint8_t encoding) {
bool DwarfMemory::AdjustEncodedValue(uint8_t encoding, uint64_t* value) {
CHECK((encoding & 0x0f) == 0);
CHECK(encoding != DW_EH_PE_aligned);
// Handle the encoding.
switch (encoding) {

View file

@ -54,6 +54,8 @@ class DwarfMemoryTest : public ::testing::Test {
void ReadEncodedValue_overflow();
template <typename AddressType>
void ReadEncodedValue_high_bit_set();
template <typename AddressType>
void ReadEncodedValue_all();
MemoryFake memory_;
std::unique_ptr<DwarfMemory> dwarf_mem_;
@ -457,6 +459,27 @@ TEST_F(DwarfMemoryTest, ReadEncodedValue_high_bit_set_uint64_t) {
ReadEncodedValue_high_bit_set<uint64_t>();
}
template <typename AddressType>
void DwarfMemoryTest::ReadEncodedValue_all() {
MemoryFakeAlwaysReadZero memory;
DwarfMemory dwarf_mem(&memory);
for (size_t i = 0; i <= 0xff; i++) {
uint64_t value;
if (dwarf_mem.ReadEncodedValue<AddressType>(static_cast<uint8_t>(i), &value)) {
ASSERT_EQ(0U, value);
}
}
}
TEST_F(DwarfMemoryTest, ReadEncodedValue_all_uint32_t) {
ReadEncodedValue_all<uint32_t>();
}
TEST_F(DwarfMemoryTest, ReadEncodedValue_all_uint64_t) {
ReadEncodedValue_all<uint64_t>();
}
TEST_F(DwarfMemoryTest, AdjustEncodedValue_absptr) {
uint64_t value = 0x1234;
ASSERT_TRUE(dwarf_mem_->AdjustEncodedValue(0x00, &value));