From 1ad96ce9796ddab0512dd59b45d2795814d782c0 Mon Sep 17 00:00:00 2001 From: Christoph Egger Date: Sat, 25 Apr 2015 18:42:18 +0200 Subject: [PATCH] Some code cleanup --- src/disassembler/llvm/LLVMDisassembler.cxx | 22 +++++++++++++--------- src/gui/widgets/FunctionWidget.cxx | 1 + 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/disassembler/llvm/LLVMDisassembler.cxx b/src/disassembler/llvm/LLVMDisassembler.cxx index d9d615a..831a1a9 100644 --- a/src/disassembler/llvm/LLVMDisassembler.cxx +++ b/src/disassembler/llvm/LLVMDisassembler.cxx @@ -261,31 +261,33 @@ void LLVMDisassembler::disassembleFunction(Function* function) { std::map new_blocks; SectionRef text_section = getTextSection(); StringRef bytes; + uint64_t base_address, size; text_section.getContents(bytes); #if defined(LLVM_35) StringRefMemoryObject ref(bytes); + text_section.getAddress(base_address); + text_section.getSize(size); #elif defined(LLVM_36) ArrayRef bytearray(reinterpret_cast(bytes.data()), bytes.size()); + base_address = text_section.getAddress(); + size = text_section.getSize(); #else #error LLVM != 3.5 | 3.6 not supported #endif LOG4CXX_DEBUG(logger, "Handling function " << function->getName()); + if(function->getStartAddress() < base_address || function->getStartAddress() > base_address + size) { + LOG4CXX_INFO(logger, "Trying to disassemble function " << function->getName() << " but start address " << std::hex << function->getStartAddress() << " is located outside the text segment"); + return; + } + BasicBlock * block = manager->newBasicBlock(function->getStartAddress()); remaining_blocks.push(block); new_blocks.insert(std::make_pair(block->getStartAddress(), block)); function->addBasicBlock(block); - uint64_t base_address, size; -#if defined(LLVM_35) - text_section.getAddress(base_address); - text_section.getSize(size); -#elif defined(LLVM_36) - base_address = text_section.getAddress(); - size = text_section.getSize(); -#endif LOG4CXX_DEBUG(logger, "Text section at " << std::hex << base_address << " with size " << size); while (remaining_blocks.size()) { @@ -574,11 +576,13 @@ void LLVMDisassembler::readSymbols() { symbol_iterator si(o->symbol_begin()), se(o->symbol_end()); for (; si != se; ++si) { StringRef name; + uint64_t address; + si->getAddress(address); if ((ec = si->getName(name))) { LOG4CXX_ERROR(logger, ec.message()); break; } - LOG4CXX_DEBUG(logger, "Added symbol " << name.str()); + LOG4CXX_DEBUG(logger, "Added symbol " << name.str() << " at address " << std::hex << address); symbols.insert(make_pair(name.str(), *si)); } } diff --git a/src/gui/widgets/FunctionWidget.cxx b/src/gui/widgets/FunctionWidget.cxx index 576e848..3c0129b 100644 --- a/src/gui/widgets/FunctionWidget.cxx +++ b/src/gui/widgets/FunctionWidget.cxx @@ -62,6 +62,7 @@ namespace { CFGScene * scene, uint64_t starty, uint64_t startx) { decltype(known_blocks.begin()) old; + if (!block) return NULL; if ((old = known_blocks.find(block->getStartAddress())) != known_blocks.end()) return old->second; -- 2.39.2