summaryrefslogtreecommitdiff
path: root/python/lowlevelil.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/lowlevelil.py')
-rw-r--r--python/lowlevelil.py129
1 files changed, 76 insertions, 53 deletions
diff --git a/python/lowlevelil.py b/python/lowlevelil.py
index 28be0df6..4c785e22 100644
--- a/python/lowlevelil.py
+++ b/python/lowlevelil.py
@@ -2607,46 +2607,53 @@ class LowLevelILFunction:
self._source_function = value
@property
- def il_form(self) -> "binaryninja.enums.FunctionGraphType":
- if len(self.basic_blocks) < 1:
+ def il_form(self) -> FunctionGraphType:
+ if len(list(self.basic_blocks)) < 1:
return FunctionGraphType.InvalidILViewType
- return FunctionGraphType(core.BNGetBasicBlockFunctionGraphType(self.basic_blocks[0].handle))
+ return FunctionGraphType(core.BNGetBasicBlockFunctionGraphType(list(self.basic_blocks)[0].handle))
@property
def registers(self) -> List[ILRegister]:
""" List of registers used in this IL """
count = ctypes.c_ulonglong()
+ assert self.handle is not None, "LLIL Function handle is None"
registers = core.BNGetLowLevelRegisters(self.handle, count)
-
+ assert registers is not None, "core.BNGetLowLevelRegisters returned None"
result = []
- for var_i in range(count.value):
- result.append(ILRegister(self.arch, registers[var_i]))
- core.BNFreeLLILVariablesList(registers)
- return result
+ try:
+ for var_i in range(count.value):
+ result.append(ILRegister(self.arch, registers[var_i]))
+ return result
+ finally:
+ core.BNFreeLLILVariablesList(registers)
@property
def register_stacks(self) -> List[ILRegisterStack]:
""" List of register stacks used in this IL """
count = ctypes.c_ulonglong()
registerStacks = core.BNGetLowLevelRegisterStacks(self.handle, count)
-
+ assert registerStacks is not None, "core.BNGetLowLevelRegisterStacks returned None"
result = []
- for var_i in range(count.value):
- result.append(ILRegisterStack(self.arch, registerStacks[var_i]))
- core.BNFreeLLILVariablesList(registerStacks)
- return result
+ try:
+ for var_i in range(count.value):
+ result.append(ILRegisterStack(self.arch, registerStacks[var_i]))
+ return result
+ finally:
+ core.BNFreeLLILVariablesList(registerStacks)
@property
def flags(self) -> List[ILFlag]:
""" List of flags used in this IL """
count = ctypes.c_ulonglong()
flags = core.BNGetLowLevelFlags(self.handle, count)
-
+ assert flags is not None, "core.BNGetLowLevelFlags returned None"
result = []
- for var_i in range(count.value):
- result.append(ILFlag(self.arch, flags[var_i]))
- core.BNFreeLLILVariablesList(flags)
- return result
+ try:
+ for var_i in range(count.value):
+ result.append(ILFlag(self.arch, flags[var_i]))
+ return result
+ finally:
+ core.BNFreeLLILVariablesList(flags)
@property
def ssa_registers(self) -> List[SSARegister]:
@@ -2655,18 +2662,24 @@ class LowLevelILFunction:
return []
register_count = ctypes.c_ulonglong()
+ assert self.handle is not None, "LLIL Function handle is None"
registers = core.BNGetLowLevelRegisters(self.handle, register_count)
+ assert registers is not None, "core.BNGetLowLevelRegisters returned None"
result = []
- for var_i in range(register_count.value):
- version_count = ctypes.c_ulonglong()
- versions = core.BNGetLowLevelRegisterSSAVersions(self.handle, registers[var_i], version_count)
-
- for version_i in range(version_count.value):
- result.append(SSARegister(ILRegister(self.arch, registers[var_i]), versions[version_i]))
- core.BNFreeLLILVariableVersionList(versions)
+ try:
+ for var_i in range(register_count.value):
+ version_count = ctypes.c_ulonglong()
+ versions = core.BNGetLowLevelRegisterSSAVersions(self.handle, registers[var_i], version_count)
+ assert versions is not None, "core.BNGetLowLevelRegisterSSAVersions returned None"
+ try:
+ for version_i in range(version_count.value):
+ result.append(SSARegister(ILRegister(self.arch, registers[var_i]), versions[version_i]))
+ finally:
+ core.BNFreeLLILVariableVersionList(versions)
- core.BNFreeLLILVariablesList(registers)
- return result
+ return result
+ finally:
+ core.BNFreeLLILVariablesList(registers)
@property
def ssa_register_stacks(self) -> List[SSARegisterStack]:
@@ -2676,16 +2689,20 @@ class LowLevelILFunction:
register_stack_count = ctypes.c_ulonglong()
register_stacks = core.BNGetLowLevelRegisterStacks(self.handle, register_stack_count)
+ assert register_stacks is not None, "core.BNGetLowLevelRegisterStacks returned None"
result = []
- for var_i in range(register_stack_count.value):
- version_count = ctypes.c_ulonglong()
- versions = core.BNGetLowLevelRegisterStackSSAVersions(self.handle, register_stacks[var_i], version_count)
-
- for version_i in range(version_count.value):
- result.append(SSARegisterStack(ILRegisterStack(self.arch, register_stacks[var_i]), versions[version_i]))
- core.BNFreeLLILVariableVersionList(versions)
-
- core.BNFreeLLILVariablesList(register_stacks)
+ try:
+ for var_i in range(register_stack_count.value):
+ version_count = ctypes.c_ulonglong()
+ versions = core.BNGetLowLevelRegisterStackSSAVersions(self.handle, register_stacks[var_i], version_count)
+ assert versions is not None, "core.BNGetLowLevelRegisterStackSSAVersions returned None"
+ try:
+ for version_i in range(version_count.value):
+ result.append(SSARegisterStack(ILRegisterStack(self.arch, register_stacks[var_i]), versions[version_i]))
+ finally:
+ core.BNFreeLLILVariableVersionList(versions)
+ finally:
+ core.BNFreeLLILVariablesList(register_stacks)
return result
@property
@@ -2696,16 +2713,20 @@ class LowLevelILFunction:
flag_count = ctypes.c_ulonglong()
flags = core.BNGetLowLevelFlags(self.handle, flag_count)
+ assert flags is not None, "core.BNGetLowLevelFlags returned None"
result = []
- for var_i in range(flag_count.value):
- version_count = ctypes.c_ulonglong()
- versions = core.BNGetLowLevelFlagSSAVersions(self.handle, flags[var_i], version_count)
-
- for version_i in range(version_count.value):
- result.append(SSAFlag(ILFlag(self.arch, flags[var_i]), versions[version_i]))
- core.BNFreeLLILVariableVersionList(versions)
-
- core.BNFreeLLILVariablesList(flags)
+ try:
+ for var_i in range(flag_count.value):
+ version_count = ctypes.c_ulonglong()
+ versions = core.BNGetLowLevelFlagSSAVersions(self.handle, flags[var_i], version_count)
+ assert versions is not None, "core.BNGetLowLevelFlagSSAVersions returned None"
+ try:
+ for version_i in range(version_count.value):
+ result.append(SSAFlag(ILFlag(self.arch, flags[var_i]), versions[version_i]))
+ finally:
+ core.BNFreeLLILVariableVersionList(versions)
+ finally:
+ core.BNFreeLLILVariablesList(flags)
return result
@property
@@ -2713,12 +2734,14 @@ class LowLevelILFunction:
""" List of memory versions used in this IL """
count = ctypes.c_ulonglong()
memory_versions = core.BNGetLowLevelMemoryVersions(self.handle, count)
-
+ assert memory_versions is not None, "core.BNGetLowLevelMemoryVersions returned None"
result = []
- for version_i in range(count.value):
- result.append(memory_versions[version_i])
- core.BNFreeLLILVariableVersionList(memory_versions)
- return result
+ try:
+ for version_i in range(count.value):
+ result.append(memory_versions[version_i])
+ return result
+ finally:
+ core.BNFreeLLILVariableVersionList(memory_versions)
@property
def vars(self) -> List[Union[ILRegister, ILRegisterStack, ILFlag]]:
@@ -2727,14 +2750,14 @@ class LowLevelILFunction:
return []
if self.il_form in [FunctionGraphType.LiftedILFunctionGraph, FunctionGraphType.LowLevelILFunctionGraph, FunctionGraphType.LowLevelILSSAFormFunctionGraph]:
- return self.registers + self.register_stacks + self.flags
+ return self.registers + self.register_stacks + self.flags # type: ignore
return []
@property
- def ssa_vars(self) -> List["binaryninja.mediumlevelil.SSAVariable"]:
+ def ssa_vars(self) -> List[Union['mediumlevelil.SSAVariable', SSARegisterStack, SSAFlag]]:
"""This is the union `LowLevelILFunction.ssa_registers`, `LowLevelILFunction.ssa_register_stacks`, and `LowLevelILFunction.ssa_flags`"""
if self.il_form == FunctionGraphType.LowLevelILSSAFormFunctionGraph:
- return self.ssa_registers + self.ssa_register_stacks + self.ssa_flags
+ return self.ssa_registers + self.ssa_register_stacks + self.ssa_flags # type: ignore
return []
def get_instruction_start(self, addr:int, arch:Optional['architecture.Architecture']=None) -> Optional[int]: