summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2015-07-31 02:54:02 -0400
committerRusty Wagner <rusty@vector35.com>2015-07-31 02:54:02 -0400
commitddca2fbb272ae8bbce6e421f07845d3439d08f5b (patch)
treea671494d5a59473bd5d22f04c72d0e1528b885e1
parent40192fa7adbf7b53e9d45343b0ae1b47cc5fef86 (diff)
Find functions that don't return based on control flow, and use that in parent functions
-rw-r--r--architecture.cpp2
-rw-r--r--basicblock.cpp6
-rw-r--r--binaryninjaapi.h5
-rw-r--r--function.cpp12
-rw-r--r--lowlevelil.cpp12
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);