From df2691ad3443fdf9767869be73c1014f49383239 Mon Sep 17 00:00:00 2001 From: Ryan Snyder Date: Fri, 20 Jun 2025 11:13:53 -0400 Subject: abb: minor refactor --- binaryninjaapi.h | 80 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 49 insertions(+), 31 deletions(-) (limited to 'binaryninjaapi.h') diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 74d30d92..8ca9ad33 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -8073,7 +8073,52 @@ namespace BinaryNinja { class RelocationHandler; typedef size_t ExprId; - typedef BNBasicBlockAnalysisContext BasicBlockAnalysisContext; + + class BasicBlockAnalysisContext + { + private: + // in + std::optional>> m_indirectBranches; + std::optional> m_indirectNoReturnCalls; + + // in/out + std::optional> m_contextualReturns; + + // out + std::optional>> m_directCodeReferences; + std::optional> m_directNoReturnCalls; + std::optional> m_haltedDisassemblyAddresses; + + public: + BNBasicBlockAnalysisContext* m_context; + + BasicBlockAnalysisContext(BNBasicBlockAnalysisContext* context); + + BNFunctionAnalysisSkipOverride GetAnalysisSkipOverride() const { return m_context->analysisSkipOverride; } + bool GetTranslateTailCalls() const { return m_context->translateTailCalls; } + bool GetDisallowBranchToString() const { return m_context->disallowBranchToString; } + bool GetHaltOnInvalidInstructions() const { return m_context->haltOnInvalidInstructions; } + uint64_t GetMaxFunctionSize() const { return m_context->maxFunctionSize; } + + bool GetMaxSizeReached() const { return m_context->maxSizeReached; } + void SetMaxSizeReached(bool reached) { m_context->maxSizeReached = reached; } + + const std::map> GetIndirectBranches(); + const std::set& GetIndirectNoReturnCalls(); + + std::map& GetContextualReturns(); + + std::map>& GetDirectCodeReferences(); + std::set& GetDirectNoReturnCalls(); + std::set& GetHaltedDisassemblyAddresses(); + + void AddTempOutgoingReference(Function* targetFunc); + + Ref CreateBasicBlock(Architecture* arch, uint64_t start); + void AddFunctionBasicBlock(BasicBlock* block); + + void Finalize(); + }; /*! The Architecture class is the base class for all CPU architectures. This provides disassembly, assembly, patching, and IL translation lifting for a given architecture. @@ -8182,7 +8227,7 @@ namespace BinaryNinja { \param function Function to analyze \param context Context for the analysis */ - static void DefaultAnalyzeBasicBlocks(Function& function, BasicBlockAnalysisContext& context); + static void DefaultAnalyzeBasicBlocks(Function* function, BasicBlockAnalysisContext& context); /*! Get an Architecture by name @@ -8287,7 +8332,7 @@ namespace BinaryNinja { \param function Function to analyze \param context Context for the analysis */ - virtual void AnalyzeBasicBlocks(Function& function, BasicBlockAnalysisContext& context); + virtual void AnalyzeBasicBlocks(Function* function, BasicBlockAnalysisContext& context); /*! Gets a register name from a register index. @@ -8682,7 +8727,7 @@ namespace BinaryNinja { const uint8_t* data, uint64_t addr, size_t& len, std::vector& result) override; virtual bool GetInstructionLowLevelIL( const uint8_t* data, uint64_t addr, size_t& len, LowLevelILFunction& il) override; - virtual void AnalyzeBasicBlocks(Function& function, BasicBlockAnalysisContext& context) override; + virtual void AnalyzeBasicBlocks(Function* function, BasicBlockAnalysisContext& context) override; virtual std::string GetRegisterName(uint32_t reg) override; virtual std::string GetFlagName(uint32_t flag) override; virtual std::string GetFlagWriteTypeName(uint32_t flags) override; @@ -11063,24 +11108,6 @@ namespace BinaryNinja { */ std::vector> GetBasicBlocks() const; - /*! Create a new basic block for this function - - \param arch Architecture for the basic block - \param addr Address of the basic block - \return The new BasicBlock - */ - Ref CreateBasicBlock(Architecture* arch, uint64_t addr); - - /*! Add a basic block to the function analysis basic block list - - \param block The BasicBlock to add - */ - void AddBasicBlock(Ref block); - - /*! Finalize basic block list for this function - */ - void FinalizeBasicBlocks(); - /*! Get the basic block an address is located in \param arch Architecture for the basic block @@ -11411,16 +11438,7 @@ namespace BinaryNinja { std::vector GetIndirectBranches(); std::vector GetIndirectBranchesAt(Architecture* arch, uint64_t addr); - void AddDirectCodeReference(const ArchAndAddr& source, uint64_t target); - void AddDirectNoReturnCall(const ArchAndAddr& location); - bool LocationHasNoReturnCalls(const ArchAndAddr& location) const; Ref GetCalleeForAnalysis(Ref platform, uint64_t addr, bool exact); - void AddTempOutgoingReference(Ref target); - bool HasTempOutgoingReference(Ref target) const; - void AddTempIncomingReference(Ref source); - - bool GetContextualFunctionReturn(const ArchAndAddr& location, bool& value) const; - void SetContextualFunctionReturn(const ArchAndAddr& location, bool value); std::vector GetUnresolvedIndirectBranches(); bool HasUnresolvedIndirectBranches(); -- cgit v1.3.1