diff options
| author | Rusty Wagner <rusty@vector35.com> | 2015-07-31 02:54:02 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2015-07-31 02:54:02 -0400 |
| commit | ddca2fbb272ae8bbce6e421f07845d3439d08f5b (patch) | |
| tree | a671494d5a59473bd5d22f04c72d0e1528b885e1 | |
| parent | 40192fa7adbf7b53e9d45343b0ae1b47cc5fef86 (diff) | |
Find functions that don't return based on control flow, and use that in parent functions
| -rw-r--r-- | architecture.cpp | 2 | ||||
| -rw-r--r-- | basicblock.cpp | 6 | ||||
| -rw-r--r-- | binaryninjaapi.h | 5 | ||||
| -rw-r--r-- | function.cpp | 12 | ||||
| -rw-r--r-- | lowlevelil.cpp | 12 |
5 files changed, 36 insertions, 1 deletions
diff --git a/architecture.cpp b/architecture.cpp index 2399e102..9ad94b0c 100644 --- a/architecture.cpp +++ b/architecture.cpp @@ -344,7 +344,7 @@ size_t Architecture::GetDefaultIntegerSize() const bool Architecture::GetInstructionLowLevelIL(const uint8_t*, uint64_t, size_t&, LowLevelILFunction& il) { - il.AddInstruction(il.Unimplemented()); + il.AddInstruction(il.Undefined()); return false; } diff --git a/basicblock.cpp b/basicblock.cpp index bca6e704..e27cdfa2 100644 --- a/basicblock.cpp +++ b/basicblock.cpp @@ -65,6 +65,12 @@ vector<BasicBlockEdge> BasicBlock::GetOutgoingEdges() const } +bool BasicBlock::HasUndeterminedOutgoingEdges() const +{ + return BNBasicBlockHasUndeterminedOutgoingEdges(m_block); +} + + void BasicBlock::MarkRecentUse() { BNMarkBasicBlockAsRecentlyUsed(m_block); diff --git a/binaryninjaapi.h b/binaryninjaapi.h index df2484df..e094aaa7 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -1043,6 +1043,7 @@ namespace BinaryNinja uint64_t GetLength() const; std::vector<BasicBlockEdge> GetOutgoingEdges() const; + bool HasUndeterminedOutgoingEdges() const; void MarkRecentUse(); }; @@ -1062,6 +1063,8 @@ namespace BinaryNinja Ref<Architecture> GetArchitecture() const; uint64_t GetStart() const; Ref<Symbol> GetSymbol() const; + bool WasAutomaticallyDiscovered() const; + bool CanReturn() const; std::vector<Ref<BasicBlock>> GetBasicBlocks() const; void MarkRecentUse(); @@ -1225,6 +1228,7 @@ namespace BinaryNinja size_t Jump(uint64_t dest); size_t Call(uint64_t dest); size_t Return(size_t dest); + size_t NoReturn(); size_t FlagCondition(BNLowLevelILFlagCondition cond); size_t CompareEqual(size_t size, uint64_t a, uint64_t b); size_t CompareNotEqual(size_t size, uint64_t a, uint64_t b); @@ -1238,6 +1242,7 @@ namespace BinaryNinja size_t CompareUnsignedGreaterThan(size_t size, uint64_t a, uint64_t b); size_t SystemCall(); size_t Breakpoint(); + size_t Trap(uint32_t num); size_t Undefined(); size_t Unimplemented(); size_t UnimplementedMemoryRef(size_t size, uint64_t addr); diff --git a/function.cpp b/function.cpp index 4e813916..c1367ad6 100644 --- a/function.cpp +++ b/function.cpp @@ -33,6 +33,18 @@ Ref<Symbol> Function::GetSymbol() const } +bool Function::WasAutomaticallyDiscovered() const +{ + return BNWasFunctionAutomaticallyDiscovered(m_func); +} + + +bool Function::CanReturn() const +{ + return BNCanFunctionReturn(m_func); +} + + vector<Ref<BasicBlock>> Function::GetBasicBlocks() const { size_t count; diff --git a/lowlevelil.cpp b/lowlevelil.cpp index 421de897..97abb8af 100644 --- a/lowlevelil.cpp +++ b/lowlevelil.cpp @@ -309,6 +309,12 @@ size_t LowLevelILFunction::Return(size_t dest) } +size_t LowLevelILFunction::NoReturn() +{ + return AddExpr(LLIL_NORET, 0, 0); +} + + size_t LowLevelILFunction::FlagCondition(BNLowLevelILFlagCondition cond) { return AddExpr(LLIL_FLAG_COND, 0, 0, (uint64_t)cond); @@ -387,6 +393,12 @@ size_t LowLevelILFunction::Breakpoint() } +size_t LowLevelILFunction::Trap(uint32_t num) +{ + return AddExpr(LLIL_TRAP, 0, 0, num); +} + + size_t LowLevelILFunction::Undefined() { return AddExpr(LLIL_UNDEF, 0, 0); |
