From 0b752f36c9d3b6bcb51a05fdcf5b38633d38bdbd Mon Sep 17 00:00:00 2001 From: Peter LaFosse Date: Wed, 8 Feb 2023 08:56:03 -0500 Subject: Add boolean for Function.user_type to indicate if a user type has been set --- binaryninjaapi.h | 2 ++ binaryninjacore.h | 1 + function.cpp | 6 ++++++ python/function.py | 5 +++++ suite/api_test.py | 2 ++ 5 files changed, 16 insertions(+) diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 7ad86999..c08e2c1a 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -8754,6 +8754,8 @@ namespace BinaryNinja { void SetRegisterStackAdjustments(const std::map>& regStackAdjust); void SetClobberedRegisters(const Confidence>& clobbered); + bool HasUserType() const; + void ApplyImportedTypes(Symbol* sym, Ref type = nullptr); void ApplyAutoDiscoveredType(Type* type); diff --git a/binaryninjacore.h b/binaryninjacore.h index 52614f41..6486f657 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -3763,6 +3763,7 @@ extern "C" BINARYNINJACOREAPI BNBoolWithConfidence BNCanFunctionReturn(BNFunction* func); BINARYNINJACOREAPI void BNSetFunctionAutoType(BNFunction* func, BNType* type); BINARYNINJACOREAPI void BNSetFunctionUserType(BNFunction* func, BNType* type); + BINARYNINJACOREAPI bool BNFunctionHasUserType(BNFunction* func); BINARYNINJACOREAPI char* BNGetFunctionComment(BNFunction* func); BINARYNINJACOREAPI char* BNGetCommentForAddress(BNFunction* func, uint64_t addr); diff --git a/function.cpp b/function.cpp index 37192ba0..04318393 100644 --- a/function.cpp +++ b/function.cpp @@ -1051,6 +1051,12 @@ void Function::SetUserType(Type* type) } +bool Function::HasUserType() const +{ + return BNFunctionHasUserType(m_object); +} + + void Function::SetReturnType(const Confidence>& type) { BNTypeWithConfidence tc; diff --git a/python/function.py b/python/function.py index 73b08b48..80dd3968 100644 --- a/python/function.py +++ b/python/function.py @@ -2512,6 +2512,11 @@ class Function: (value, _) = self.view.parse_type_string(value) core.BNSetFunctionUserType(self.handle, value.handle) + @property + def user_type(self) -> bool: + """True if the function has a user-defined type""" + return core.BNFunctionHasUserType(self.handle) + def set_auto_return_type(self, value: StringOrType) -> None: type_conf = core.BNTypeWithConfidence() if value is None: diff --git a/suite/api_test.py b/suite/api_test.py index 39c58491..9e5431ac 100644 --- a/suite/api_test.py +++ b/suite/api_test.py @@ -2115,7 +2115,9 @@ class TestWithFunction(TestWithBinaryView): assert ft.return_value == Type.int(4) ftm = ft.mutable_copy() ftm.return_value = Type.int(4, False) + assert not ft.user_type self.func.function_type = ftm + assert ft.user_type self.func.view.update_analysis_and_wait() assert self.func.function_type.return_value == Type.int(4, False), f"{self.func.function_type.return_value} != {Type.int(4, False)}" func_str = "int32_t main(int32_t argc, char** argv, char** envp)" -- cgit v1.3.1