angr 9.2.102__py3-none-win_amd64.whl → 9.2.103__py3-none-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of angr might be problematic. Click here for more details.

Files changed (240) hide show
  1. angr/__init__.py +1 -1
  2. angr/analyses/analysis.py +7 -6
  3. angr/analyses/calling_convention.py +33 -35
  4. angr/analyses/cdg.py +2 -4
  5. angr/analyses/cfg/cfb.py +4 -3
  6. angr/analyses/cfg/cfg_base.py +14 -14
  7. angr/analyses/cfg/cfg_emulated.py +3 -4
  8. angr/analyses/cfg/cfg_fast.py +46 -46
  9. angr/analyses/cfg/cfg_fast_soot.py +1 -2
  10. angr/analyses/cfg/cfg_job_base.py +2 -2
  11. angr/analyses/cfg/indirect_jump_resolvers/jumptable.py +14 -13
  12. angr/analyses/cfg/indirect_jump_resolvers/mips_elf_fast.py +5 -5
  13. angr/analyses/cfg_slice_to_sink/cfg_slice_to_sink.py +3 -3
  14. angr/analyses/complete_calling_conventions.py +13 -12
  15. angr/analyses/data_dep/data_dependency_analysis.py +24 -24
  16. angr/analyses/data_dep/dep_nodes.py +3 -3
  17. angr/analyses/ddg.py +1 -2
  18. angr/analyses/decompiler/ail_simplifier.py +35 -34
  19. angr/analyses/decompiler/block_io_finder.py +20 -20
  20. angr/analyses/decompiler/block_similarity.py +4 -6
  21. angr/analyses/decompiler/block_simplifier.py +17 -16
  22. angr/analyses/decompiler/callsite_maker.py +25 -10
  23. angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py +1 -3
  24. angr/analyses/decompiler/ccall_rewriters/rewriter_base.py +2 -4
  25. angr/analyses/decompiler/clinic.py +250 -45
  26. angr/analyses/decompiler/condition_processor.py +15 -8
  27. angr/analyses/decompiler/decompilation_cache.py +7 -7
  28. angr/analyses/decompiler/decompilation_options.py +4 -4
  29. angr/analyses/decompiler/decompiler.py +19 -15
  30. angr/analyses/decompiler/expression_counters.py +10 -9
  31. angr/analyses/decompiler/goto_manager.py +2 -4
  32. angr/analyses/decompiler/graph_region.py +9 -9
  33. angr/analyses/decompiler/jump_target_collector.py +1 -2
  34. angr/analyses/decompiler/optimization_passes/__init__.py +4 -3
  35. angr/analyses/decompiler/optimization_passes/code_motion.py +5 -6
  36. angr/analyses/decompiler/optimization_passes/const_derefs.py +4 -4
  37. angr/analyses/decompiler/optimization_passes/deadblock_remover.py +73 -0
  38. angr/analyses/decompiler/optimization_passes/engine_base.py +25 -3
  39. angr/analyses/decompiler/optimization_passes/expr_op_swapper.py +6 -5
  40. angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py +2 -2
  41. angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py +3 -0
  42. angr/analyses/decompiler/optimization_passes/ite_expr_converter.py +2 -2
  43. angr/analyses/decompiler/optimization_passes/lowered_switch_simplifier.py +17 -17
  44. angr/analyses/decompiler/optimization_passes/optimization_pass.py +12 -13
  45. angr/analyses/decompiler/optimization_passes/register_save_area_simplifier.py +25 -21
  46. angr/analyses/decompiler/optimization_passes/ret_addr_save_simplifier.py +3 -3
  47. angr/analyses/decompiler/optimization_passes/ret_deduplicator.py +1 -2
  48. angr/analyses/decompiler/optimization_passes/return_duplicator_base.py +7 -7
  49. angr/analyses/decompiler/optimization_passes/spilled_register_finder.py +18 -0
  50. angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py +2 -3
  51. angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py +1 -2
  52. angr/analyses/decompiler/optimization_passes/x86_gcc_getpc_simplifier.py +2 -2
  53. angr/analyses/decompiler/peephole_optimizations/__init__.py +4 -3
  54. angr/analyses/decompiler/peephole_optimizations/base.py +13 -15
  55. angr/analyses/decompiler/peephole_optimizations/bswap.py +1 -3
  56. angr/analyses/decompiler/peephole_optimizations/cmpord_rewriter.py +72 -0
  57. angr/analyses/decompiler/peephole_optimizations/const_mull_a_shift.py +1 -2
  58. angr/analyses/decompiler/peephole_optimizations/eager_eval.py +1 -1
  59. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy.py +5 -10
  60. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy_consolidation.py +3 -4
  61. angr/analyses/decompiler/peephole_optimizations/inlined_wstrcpy.py +7 -10
  62. angr/analyses/decompiler/peephole_optimizations/rewrite_bit_extractions.py +2 -3
  63. angr/analyses/decompiler/peephole_optimizations/sar_to_signed_div.py +1 -2
  64. angr/analyses/decompiler/peephole_optimizations/tidy_stack_addr.py +4 -4
  65. angr/analyses/decompiler/redundant_label_remover.py +4 -5
  66. angr/analyses/decompiler/region_identifier.py +4 -5
  67. angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py +1 -2
  68. angr/analyses/decompiler/region_simplifiers/expr_folding.py +19 -20
  69. angr/analyses/decompiler/region_simplifiers/goto.py +2 -3
  70. angr/analyses/decompiler/region_simplifiers/loop.py +1 -2
  71. angr/analyses/decompiler/region_simplifiers/node_address_finder.py +1 -2
  72. angr/analyses/decompiler/region_simplifiers/region_simplifier.py +1 -3
  73. angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py +19 -19
  74. angr/analyses/decompiler/return_maker.py +1 -2
  75. angr/analyses/decompiler/structured_codegen/base.py +5 -6
  76. angr/analyses/decompiler/structured_codegen/c.py +39 -38
  77. angr/analyses/decompiler/structuring/__init__.py +1 -1
  78. angr/analyses/decompiler/structuring/dream.py +17 -16
  79. angr/analyses/decompiler/structuring/phoenix.py +45 -46
  80. angr/analyses/decompiler/structuring/recursive_structurer.py +4 -4
  81. angr/analyses/decompiler/structuring/structurer_base.py +16 -15
  82. angr/analyses/decompiler/structuring/structurer_nodes.py +10 -9
  83. angr/analyses/decompiler/utils.py +17 -16
  84. angr/analyses/disassembly.py +7 -6
  85. angr/analyses/flirt.py +9 -9
  86. angr/analyses/forward_analysis/forward_analysis.py +15 -14
  87. angr/analyses/forward_analysis/visitors/function_graph.py +1 -2
  88. angr/analyses/forward_analysis/visitors/graph.py +16 -15
  89. angr/analyses/propagator/engine_ail.py +30 -26
  90. angr/analyses/propagator/outdated_definition_walker.py +8 -7
  91. angr/analyses/propagator/propagator.py +11 -13
  92. angr/analyses/proximity_graph.py +21 -21
  93. angr/analyses/reaching_definitions/__init__.py +3 -3
  94. angr/analyses/reaching_definitions/call_trace.py +3 -6
  95. angr/analyses/reaching_definitions/dep_graph.py +41 -48
  96. angr/analyses/reaching_definitions/engine_ail.py +11 -5
  97. angr/analyses/reaching_definitions/engine_vex.py +9 -8
  98. angr/analyses/reaching_definitions/function_handler.py +51 -34
  99. angr/analyses/reaching_definitions/heap_allocator.py +3 -4
  100. angr/analyses/reaching_definitions/rd_initializer.py +8 -8
  101. angr/analyses/reaching_definitions/rd_state.py +57 -58
  102. angr/analyses/reaching_definitions/reaching_definitions.py +18 -17
  103. angr/analyses/reaching_definitions/subject.py +2 -3
  104. angr/analyses/stack_pointer_tracker.py +15 -6
  105. angr/analyses/typehoon/dfa.py +4 -4
  106. angr/analyses/typehoon/simple_solver.py +48 -52
  107. angr/analyses/typehoon/translator.py +3 -6
  108. angr/analyses/typehoon/typeconsts.py +13 -14
  109. angr/analyses/typehoon/typehoon.py +9 -9
  110. angr/analyses/typehoon/typevars.py +18 -17
  111. angr/analyses/variable_recovery/engine_ail.py +5 -5
  112. angr/analyses/variable_recovery/engine_base.py +25 -21
  113. angr/analyses/variable_recovery/irsb_scanner.py +8 -9
  114. angr/analyses/variable_recovery/variable_recovery.py +1 -2
  115. angr/analyses/variable_recovery/variable_recovery_base.py +14 -13
  116. angr/analyses/variable_recovery/variable_recovery_fast.py +8 -8
  117. angr/analyses/veritesting.py +1 -2
  118. angr/analyses/vfg.py +57 -56
  119. angr/analyses/xrefs.py +1 -2
  120. angr/angrdb/db.py +7 -7
  121. angr/angrdb/serializers/kb.py +16 -13
  122. angr/angrdb/serializers/loader.py +1 -2
  123. angr/angrdb/serializers/structured_code.py +2 -2
  124. angr/annocfg.py +1 -2
  125. angr/block.py +16 -6
  126. angr/calling_conventions.py +27 -27
  127. angr/code_location.py +8 -8
  128. angr/codenode.py +1 -2
  129. angr/concretization_strategies/max.py +1 -3
  130. angr/distributed/server.py +1 -3
  131. angr/distributed/worker.py +1 -2
  132. angr/engines/engine.py +2 -3
  133. angr/engines/light/engine.py +4 -4
  134. angr/engines/pcode/behavior.py +20 -2
  135. angr/engines/pcode/emulate.py +1 -1
  136. angr/engines/pcode/engine.py +7 -7
  137. angr/engines/pcode/lifter.py +78 -77
  138. angr/engines/vex/claripy/ccall.py +1 -2
  139. angr/engines/vex/claripy/datalayer.py +1 -2
  140. angr/engines/vex/light/light.py +1 -2
  141. angr/exploration_techniques/tracer.py +4 -4
  142. angr/factory.py +12 -15
  143. angr/flirt/__init__.py +8 -8
  144. angr/flirt/build_sig.py +2 -3
  145. angr/keyed_region.py +2 -2
  146. angr/knowledge_base/knowledge_base.py +3 -3
  147. angr/knowledge_plugins/callsite_prototypes.py +4 -6
  148. angr/knowledge_plugins/cfg/cfg_manager.py +19 -6
  149. angr/knowledge_plugins/cfg/cfg_model.py +26 -27
  150. angr/knowledge_plugins/cfg/cfg_node.py +2 -2
  151. angr/knowledge_plugins/cfg/indirect_jump.py +6 -8
  152. angr/knowledge_plugins/cfg/memory_data.py +8 -9
  153. angr/knowledge_plugins/custom_strings.py +1 -3
  154. angr/knowledge_plugins/debug_variables.py +2 -2
  155. angr/knowledge_plugins/functions/function.py +21 -22
  156. angr/knowledge_plugins/functions/function_manager.py +5 -5
  157. angr/knowledge_plugins/indirect_jumps.py +1 -3
  158. angr/knowledge_plugins/key_definitions/atoms.py +7 -7
  159. angr/knowledge_plugins/key_definitions/definition.py +14 -14
  160. angr/knowledge_plugins/key_definitions/environment.py +5 -7
  161. angr/knowledge_plugins/key_definitions/heap_address.py +1 -3
  162. angr/knowledge_plugins/key_definitions/key_definition_manager.py +3 -2
  163. angr/knowledge_plugins/key_definitions/live_definitions.py +60 -59
  164. angr/knowledge_plugins/key_definitions/liveness.py +16 -16
  165. angr/knowledge_plugins/key_definitions/rd_model.py +15 -15
  166. angr/knowledge_plugins/key_definitions/uses.py +11 -11
  167. angr/knowledge_plugins/patches.py +4 -8
  168. angr/knowledge_plugins/propagations/prop_value.py +10 -9
  169. angr/knowledge_plugins/propagations/propagation_manager.py +3 -5
  170. angr/knowledge_plugins/propagations/propagation_model.py +9 -9
  171. angr/knowledge_plugins/propagations/states.py +52 -22
  172. angr/knowledge_plugins/structured_code/manager.py +2 -2
  173. angr/knowledge_plugins/sync/sync_controller.py +3 -3
  174. angr/knowledge_plugins/variables/variable_access.py +4 -4
  175. angr/knowledge_plugins/variables/variable_manager.py +39 -39
  176. angr/knowledge_plugins/xrefs/xref.py +9 -11
  177. angr/knowledge_plugins/xrefs/xref_manager.py +3 -4
  178. angr/lib/angr_native.dll +0 -0
  179. angr/misc/ansi.py +1 -2
  180. angr/misc/autoimport.py +3 -3
  181. angr/misc/plugins.py +9 -9
  182. angr/procedures/definitions/__init__.py +16 -16
  183. angr/procedures/definitions/linux_kernel.py +1 -1
  184. angr/procedures/definitions/parse_win32json.py +1 -1
  185. angr/procedures/java_jni/__init__.py +1 -1
  186. angr/procedures/java_jni/array_operations.py +1 -2
  187. angr/procedures/java_jni/method_calls.py +1 -2
  188. angr/procedures/posix/inet_ntoa.py +1 -2
  189. angr/procedures/stubs/format_parser.py +3 -3
  190. angr/project.py +13 -11
  191. angr/sim_manager.py +12 -12
  192. angr/sim_procedure.py +7 -3
  193. angr/sim_state.py +2 -2
  194. angr/sim_type.py +60 -45
  195. angr/sim_variable.py +5 -5
  196. angr/simos/simos.py +1 -2
  197. angr/simos/userland.py +1 -2
  198. angr/state_plugins/callstack.py +3 -2
  199. angr/state_plugins/history.py +1 -2
  200. angr/state_plugins/solver.py +34 -34
  201. angr/storage/memory_mixins/__init__.py +4 -3
  202. angr/storage/memory_mixins/actions_mixin.py +1 -3
  203. angr/storage/memory_mixins/address_concretization_mixin.py +1 -3
  204. angr/storage/memory_mixins/convenient_mappings_mixin.py +3 -4
  205. angr/storage/memory_mixins/default_filler_mixin.py +1 -1
  206. angr/storage/memory_mixins/label_merger_mixin.py +2 -2
  207. angr/storage/memory_mixins/multi_value_merger_mixin.py +4 -3
  208. angr/storage/memory_mixins/paged_memory/page_backer_mixins.py +9 -8
  209. angr/storage/memory_mixins/paged_memory/paged_memory_mixin.py +12 -11
  210. angr/storage/memory_mixins/paged_memory/pages/cooperation.py +8 -8
  211. angr/storage/memory_mixins/paged_memory/pages/history_tracking_mixin.py +2 -3
  212. angr/storage/memory_mixins/paged_memory/pages/list_page.py +10 -11
  213. angr/storage/memory_mixins/paged_memory/pages/multi_values.py +11 -10
  214. angr/storage/memory_mixins/paged_memory/pages/mv_list_page.py +18 -17
  215. angr/storage/memory_mixins/paged_memory/pages/ultra_page.py +12 -11
  216. angr/storage/memory_mixins/regioned_memory/abstract_address_descriptor.py +3 -3
  217. angr/storage/memory_mixins/regioned_memory/abstract_merger_mixin.py +3 -2
  218. angr/storage/memory_mixins/regioned_memory/region_data.py +1 -2
  219. angr/storage/memory_mixins/regioned_memory/region_meta_mixin.py +2 -2
  220. angr/storage/memory_mixins/regioned_memory/regioned_address_concretization_mixin.py +3 -3
  221. angr/storage/memory_mixins/regioned_memory/regioned_memory_mixin.py +18 -21
  222. angr/storage/memory_mixins/size_resolution_mixin.py +1 -2
  223. angr/storage/memory_mixins/symbolic_merger_mixin.py +3 -2
  224. angr/storage/memory_mixins/top_merger_mixin.py +3 -2
  225. angr/storage/memory_object.py +2 -4
  226. angr/utils/algo.py +3 -2
  227. angr/utils/dynamic_dictlist.py +5 -5
  228. angr/utils/formatting.py +4 -4
  229. angr/utils/funcid.py +1 -2
  230. angr/utils/graph.py +5 -6
  231. angr/utils/library.py +5 -5
  232. angr/utils/mp.py +5 -4
  233. angr/utils/segment_list.py +3 -4
  234. angr/utils/typing.py +3 -2
  235. {angr-9.2.102.dist-info → angr-9.2.103.dist-info}/METADATA +9 -11
  236. {angr-9.2.102.dist-info → angr-9.2.103.dist-info}/RECORD +240 -237
  237. {angr-9.2.102.dist-info → angr-9.2.103.dist-info}/LICENSE +0 -0
  238. {angr-9.2.102.dist-info → angr-9.2.103.dist-info}/WHEEL +0 -0
  239. {angr-9.2.102.dist-info → angr-9.2.103.dist-info}/entry_points.txt +0 -0
  240. {angr-9.2.102.dist-info → angr-9.2.103.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,5 @@
1
- from typing import TYPE_CHECKING, Iterable, List, Set, Optional, Union, Callable, cast, Literal
1
+ from typing import TYPE_CHECKING, cast, Literal
2
+ from collections.abc import Iterable, Callable
2
3
  from dataclasses import dataclass, field
3
4
  import logging
4
5
  from functools import wraps
@@ -7,7 +8,7 @@ from cle.backends import ELF
7
8
  import claripy
8
9
 
9
10
  from angr.storage.memory_mixins.paged_memory.pages.multi_values import MultiValues
10
- from angr.sim_type import SimTypeBottom
11
+ from angr.sim_type import SimTypeBottom, dereference_simtype
11
12
  from angr.knowledge_plugins.key_definitions.atoms import Atom, Register, MemoryLocation, SpOffset
12
13
  from angr.knowledge_plugins.key_definitions.tag import Tag
13
14
  from angr.calling_conventions import SimCC
@@ -17,6 +18,7 @@ from angr.knowledge_plugins.functions import Function
17
18
  from angr.analyses.reaching_definitions.dep_graph import FunctionCallRelationships
18
19
  from angr.code_location import CodeLocation, ExternalCodeLocation
19
20
  from angr.knowledge_plugins.key_definitions.constants import ObservationPointType
21
+ from angr import SIM_LIBRARIES, SIM_TYPE_COLLECTIONS
20
22
 
21
23
 
22
24
  if TYPE_CHECKING:
@@ -51,12 +53,12 @@ class FunctionEffect:
51
53
  `FunctionCallData.depends` instead.
52
54
  """
53
55
 
54
- dest: Optional[Atom]
55
- sources: Set[Atom]
56
- value: Optional[MultiValues] = None
57
- sources_defns: Optional[Set[Definition]] = None
56
+ dest: Atom | None
57
+ sources: set[Atom]
58
+ value: MultiValues | None = None
59
+ sources_defns: set[Definition] | None = None
58
60
  apply_at_callsite: bool = False
59
- tags: Optional[Set[Tag]] = None
61
+ tags: set[Tag] | None = None
60
62
 
61
63
 
62
64
  @dataclass
@@ -83,21 +85,21 @@ class FunctionCallData:
83
85
 
84
86
  callsite_codeloc: CodeLocation
85
87
  function_codeloc: CodeLocation
86
- address_multi: Optional[MultiValues]
87
- address: Optional[int] = None
88
- symbol: Optional[Symbol] = None
89
- function: Optional[Function] = None
90
- name: Optional[str] = None
91
- cc: Optional[SimCC] = None
92
- prototype: Optional[SimTypeFunction] = None
93
- args_atoms: Optional[List[Set[Atom]]] = None
94
- args_values: Optional[List[MultiValues]] = None
95
- ret_atoms: Optional[Set[Atom]] = None
88
+ address_multi: MultiValues | None
89
+ address: int | None = None
90
+ symbol: Symbol | None = None
91
+ function: Function | None = None
92
+ name: str | None = None
93
+ cc: SimCC | None = None
94
+ prototype: SimTypeFunction | None = None
95
+ args_atoms: list[set[Atom]] | None = None
96
+ args_values: list[MultiValues] | None = None
97
+ ret_atoms: set[Atom] | None = None
96
98
  redefine_locals: bool = True
97
- visited_blocks: Optional[Set[int]] = None
98
- effects: List[FunctionEffect] = field(default_factory=lambda: [])
99
- ret_values: Optional[MultiValues] = None
100
- ret_values_deps: Optional[Set[Definition]] = None
99
+ visited_blocks: set[int] | None = None
100
+ effects: list[FunctionEffect] = field(default_factory=lambda: [])
101
+ ret_values: MultiValues | None = None
102
+ ret_values_deps: set[Definition] | None = None
101
103
  caller_will_handle_single_ret: bool = False
102
104
  guessed_cc: bool = False
103
105
  guessed_prototype: bool = False
@@ -135,11 +137,11 @@ class FunctionCallData:
135
137
 
136
138
  def depends(
137
139
  self,
138
- dest: Union[Atom, Iterable[Atom], None],
139
- *sources: Union[Atom, Iterable[Atom]],
140
- value: Union[MultiValues, claripy.ast.BV, bytes, int, None] = None,
140
+ dest: Atom | Iterable[Atom] | None,
141
+ *sources: Atom | Iterable[Atom],
142
+ value: MultiValues | claripy.ast.BV | bytes | int | None = None,
141
143
  apply_at_callsite: bool = False,
142
- tags: Optional[Set[Tag]] = None,
144
+ tags: set[Tag] | None = None,
143
145
  ):
144
146
  """
145
147
  Mark a single effect of the current function, including the atom being modified, the input atoms on which that
@@ -186,7 +188,7 @@ class FunctionCallData:
186
188
 
187
189
  def reset_prototype(
188
190
  self, prototype: SimTypeFunction, state: "ReachingDefinitionsState", soft_reset: bool = False
189
- ) -> Set[Atom]:
191
+ ) -> set[Atom]:
190
192
  self.prototype = prototype.with_arch(state.arch)
191
193
  if not soft_reset:
192
194
  self.args_atoms = self.args_values = self.ret_atoms = None
@@ -222,9 +224,9 @@ class FunctionCallDataUnwrapped(FunctionCallData):
222
224
  name: str
223
225
  cc: SimCC
224
226
  prototype: SimTypeFunction
225
- args_atoms: List[Set[Atom]]
226
- args_values: List[MultiValues]
227
- ret_atoms: Set[Atom]
227
+ args_atoms: list[set[Atom]]
228
+ args_values: list[MultiValues]
229
+ ret_atoms: set[Atom]
228
230
 
229
231
  def __init__(self, inner: FunctionCallData):
230
232
  d = dict(inner.__dict__)
@@ -268,7 +270,7 @@ class FunctionHandler:
268
270
  return self
269
271
 
270
272
  def make_function_codeloc(
271
- self, target: Union[None, int, MultiValues], callsite: CodeLocation, callsite_func_addr: Optional[int]
273
+ self, target: None | int | MultiValues, callsite: CodeLocation, callsite_func_addr: int | None
272
274
  ):
273
275
  """
274
276
  The RDA engine will call this function to transform a callsite CodeLocation into a callee CodeLocation.
@@ -329,6 +331,7 @@ class FunctionHandler:
329
331
  data.cc = data.function.calling_convention
330
332
  if data.prototype is None and data.function is not None:
331
333
  data.prototype = data.function.prototype
334
+ hook_libname = None
332
335
  if data.address is not None and (data.cc is None or data.prototype is None):
333
336
  hook = (
334
337
  None
@@ -348,6 +351,7 @@ class FunctionHandler:
348
351
  if data.prototype is None and hook is not None:
349
352
  data.prototype = hook.prototype.with_arch(state.arch)
350
353
  data.guessed_prototype = hook.guessed_prototype
354
+ hook_libname = hook.library_name
351
355
 
352
356
  # fallback to the default calling convention and prototype
353
357
  if data.cc is None:
@@ -357,6 +361,19 @@ class FunctionHandler:
357
361
  data.prototype = state.analysis.project.factory.function_prototype()
358
362
  data.guessed_prototype = True
359
363
 
364
+ if data.prototype is not None and data.function is not None:
365
+ # make sure the function prototype is resolved.
366
+ # TODO: Cache resolved function prototypes globally
367
+ prototype_libname = data.function.prototype_libname or hook_libname
368
+ type_collections = []
369
+ if prototype_libname is not None:
370
+ prototype_lib = SIM_LIBRARIES[prototype_libname]
371
+ if prototype_lib.type_collection_names:
372
+ for typelib_name in prototype_lib.type_collection_names:
373
+ type_collections.append(SIM_TYPE_COLLECTIONS[typelib_name])
374
+ if type_collections:
375
+ data.prototype = dereference_simtype(data.prototype, type_collections).with_arch(state.arch)
376
+
360
377
  args_atoms_from_values = data.reset_prototype(data.prototype, state, soft_reset=True)
361
378
 
362
379
  # PROCESS
@@ -512,7 +529,7 @@ class FunctionHandler:
512
529
  # get_exit_livedefinitions is currently only using ret_sites, but an argument could be made that it should
513
530
  # include jumpout sites as well. In the CFG generation tail call sites seem to be treated as return sites
514
531
  # and not as jumpout sites, so we are following that convention here.
515
- return_observation_points: List[ObservationPoint] = [
532
+ return_observation_points: list[ObservationPoint] = [
516
533
  (
517
534
  cast(Literal["node"], "node"), # pycharm doesn't treat a literal string, as Literal[] by default...
518
535
  block.addr,
@@ -540,7 +557,7 @@ class FunctionHandler:
540
557
  data.retaddr_popped = True
541
558
 
542
559
  @staticmethod
543
- def c_args_as_atoms(state: "ReachingDefinitionsState", cc: SimCC, prototype: SimTypeFunction) -> List[Set[Atom]]:
560
+ def c_args_as_atoms(state: "ReachingDefinitionsState", cc: SimCC, prototype: SimTypeFunction) -> list[set[Atom]]:
544
561
  if not prototype.variadic:
545
562
  sp_value = state.get_one_value(Register(state.arch.sp_offset, state.arch.bytes), strip_annotations=True)
546
563
  sp = state.get_stack_offset(sp_value) if sp_value is not None else None
@@ -563,7 +580,7 @@ class FunctionHandler:
563
580
  return [{Register(*state.arch.registers[arg_name], arch=state.arch)} for arg_name in cc.ARG_REGS]
564
581
 
565
582
  @staticmethod
566
- def c_return_as_atoms(state: "ReachingDefinitionsState", cc: SimCC, prototype: SimTypeFunction) -> Set[Atom]:
583
+ def c_return_as_atoms(state: "ReachingDefinitionsState", cc: SimCC, prototype: SimTypeFunction) -> set[Atom]:
567
584
  if prototype.returnty is not None and not isinstance(prototype.returnty, SimTypeBottom):
568
585
  retval = cc.return_val(prototype.returnty)
569
586
  if retval is not None:
@@ -574,7 +591,7 @@ class FunctionHandler:
574
591
  return set()
575
592
 
576
593
  @staticmethod
577
- def caller_saved_regs_as_atoms(state: "ReachingDefinitionsState", cc: SimCC) -> Set[Register]:
594
+ def caller_saved_regs_as_atoms(state: "ReachingDefinitionsState", cc: SimCC) -> set[Register]:
578
595
  return (
579
596
  {Register(*state.arch.registers[reg], arch=state.arch) for reg in cc.CALLER_SAVED_REGS}
580
597
  if cc.CALLER_SAVED_REGS is not None
@@ -1,6 +1,5 @@
1
1
  import logging
2
2
 
3
- from typing import Union, List
4
3
 
5
4
  from ...knowledge_plugins.key_definitions.heap_address import HeapAddress
6
5
  from ...knowledge_plugins.key_definitions.unknown_size import UnknownSize
@@ -26,10 +25,10 @@ class HeapAllocator:
26
25
  :param canonical_size: The concrete size an <UNKNOWN_SIZE> defaults to.
27
26
  """
28
27
  self._next_heap_address: HeapAddress = HeapAddress(0)
29
- self._allocated_addresses: List[HeapAddress] = [self._next_heap_address]
28
+ self._allocated_addresses: list[HeapAddress] = [self._next_heap_address]
30
29
  self._canonical_size: int = canonical_size
31
30
 
32
- def allocate(self, size: Union[int, UnknownSize]) -> HeapAddress:
31
+ def allocate(self, size: int | UnknownSize) -> HeapAddress:
33
32
  """
34
33
  Gives an address for a new memory chunck of <size> bytes.
35
34
 
@@ -45,7 +44,7 @@ class HeapAllocator:
45
44
 
46
45
  return address
47
46
 
48
- def free(self, address: Union[Undefined, HeapAddress]):
47
+ def free(self, address: Undefined | HeapAddress):
49
48
  """
50
49
  Mark the chunck pointed by <address> as freed.
51
50
 
@@ -1,5 +1,5 @@
1
1
  import logging
2
- from typing import Optional, Tuple, TYPE_CHECKING
2
+ from typing import TYPE_CHECKING
3
3
 
4
4
  import claripy
5
5
  from archinfo import Arch
@@ -38,7 +38,7 @@ class RDAStateInitializer:
38
38
  self.project = project
39
39
 
40
40
  def initialize_function_state(
41
- self, state: "ReachingDefinitionsState", cc: Optional[SimCC], func_addr: int, rtoc_value: Optional[int] = None
41
+ self, state: "ReachingDefinitionsState", cc: SimCC | None, func_addr: int, rtoc_value: int | None = None
42
42
  ) -> None:
43
43
  """
44
44
  This is the entry point to the state initialization logic.
@@ -71,8 +71,8 @@ class RDAStateInitializer:
71
71
  state: "ReachingDefinitionsState",
72
72
  func_addr: int,
73
73
  ex_loc: ExternalCodeLocation,
74
- cc: Optional[SimCC],
75
- prototype: Optional[SimTypeFunction],
74
+ cc: SimCC | None,
75
+ prototype: SimTypeFunction | None,
76
76
  ) -> None:
77
77
  """
78
78
  This method handles the setup for _all_ arguments of a function.
@@ -96,7 +96,7 @@ class RDAStateInitializer:
96
96
  func_addr: int,
97
97
  ex_loc: ExternalCodeLocation,
98
98
  argument_location: SimFunctionArgument,
99
- argument_type: Optional[SimType] = None,
99
+ argument_type: SimType | None = None,
100
100
  ) -> None:
101
101
  """
102
102
  This method handles the setup for _one_ argument of a function.
@@ -133,7 +133,7 @@ class RDAStateInitializer:
133
133
  state: "ReachingDefinitionsState",
134
134
  func_addr: int,
135
135
  ex_loc: ExternalCodeLocation,
136
- rtoc_value: Optional[int] = None,
136
+ rtoc_value: int | None = None,
137
137
  ) -> None:
138
138
  """
139
139
  Some architectures require initialization that is specific to that architecture.
@@ -191,7 +191,7 @@ class RDAStateInitializer:
191
191
  func_addr: int,
192
192
  ex_loc: ExternalCodeLocation,
193
193
  arg: SimRegArg,
194
- value: Optional[claripy.ast.Base] = None,
194
+ value: claripy.ast.Base | None = None,
195
195
  ):
196
196
  # FIXME: implement reg_offset handling in SimRegArg
197
197
  reg_offset = self.arch.registers[arg.reg_name][0]
@@ -218,7 +218,7 @@ class RDAStateInitializer:
218
218
  state.stack.store(stack_address, ml, endness=self.arch.memory_endness)
219
219
 
220
220
  @staticmethod
221
- def _generate_call_string(subject: Subject, current_address: int) -> Optional[Tuple[int, ...]]:
221
+ def _generate_call_string(subject: Subject, current_address: int) -> tuple[int, ...] | None:
222
222
  if isinstance(subject.content, Function):
223
223
  return (subject.content.addr,)
224
224
  elif isinstance(subject.content, CallTrace):
@@ -1,4 +1,5 @@
1
- from typing import Optional, Iterable, Set, Tuple, Any, TYPE_CHECKING, Iterator, Union, overload, Type
1
+ from typing import Optional, Any, TYPE_CHECKING, overload
2
+ from collections.abc import Iterable, Iterator
2
3
  import logging
3
4
 
4
5
  import archinfo
@@ -84,12 +85,12 @@ class ReachingDefinitionsState:
84
85
  track_consts: bool = False,
85
86
  analysis: Optional["ReachingDefinitionsAnalysis"] = None,
86
87
  rtoc_value=None,
87
- live_definitions: Optional[LiveDefinitions] = None,
88
+ live_definitions: LiveDefinitions | None = None,
88
89
  canonical_size: int = 8,
89
90
  heap_allocator: HeapAllocator = None,
90
91
  environment: Environment = None,
91
92
  sp_adjusted: bool = False,
92
- all_definitions: Optional[Set[Definition]] = None,
93
+ all_definitions: set[Definition] | None = None,
93
94
  initializer: Optional["RDAStateInitializer"] = None,
94
95
  element_limit: int = 5,
95
96
  ):
@@ -104,12 +105,12 @@ class ReachingDefinitionsState:
104
105
  self._sp_adjusted: bool = sp_adjusted
105
106
  self._element_limit: int = element_limit
106
107
 
107
- self.all_definitions: Set[Definition] = set() if all_definitions is None else all_definitions
108
+ self.all_definitions: set[Definition] = set() if all_definitions is None else all_definitions
108
109
 
109
110
  self.heap_allocator = heap_allocator or HeapAllocator(canonical_size)
110
111
  self._environment: Environment = environment or Environment()
111
112
 
112
- self.codeloc_uses: Set[Definition] = set()
113
+ self.codeloc_uses: set[Definition] = set()
113
114
 
114
115
  # have we observed an exit statement or not during the analysis of the *last instruction* of a block? we should
115
116
  # not perform any sp updates if it is the case. this is for handling conditional returns in ARM binaries.
@@ -149,7 +150,7 @@ class ReachingDefinitionsState:
149
150
  def is_top(self, *args):
150
151
  return self.live_definitions.is_top(*args)
151
152
 
152
- def heap_address(self, offset: Union[int, HeapAddress]) -> claripy.ast.BV:
153
+ def heap_address(self, offset: int | HeapAddress) -> claripy.ast.BV:
153
154
  return self.live_definitions.heap_address(offset)
154
155
 
155
156
  @staticmethod
@@ -157,7 +158,7 @@ class ReachingDefinitionsState:
157
158
  return LiveDefinitions.is_heap_address(addr)
158
159
 
159
160
  @staticmethod
160
- def get_heap_offset(addr: claripy.ast.Base) -> Optional[int]:
161
+ def get_heap_offset(addr: claripy.ast.Base) -> int | None:
161
162
  return LiveDefinitions.get_heap_offset(addr)
162
163
 
163
164
  def stack_address(self, offset: int) -> claripy.ast.BV:
@@ -166,7 +167,7 @@ class ReachingDefinitionsState:
166
167
  def is_stack_address(self, addr: claripy.ast.Base) -> bool:
167
168
  return self.live_definitions.is_stack_address(addr)
168
169
 
169
- def get_stack_offset(self, addr: claripy.ast.Base) -> Optional[int]:
170
+ def get_stack_offset(self, addr: claripy.ast.Base) -> int | None:
170
171
  offset = self.live_definitions.get_stack_offset(addr)
171
172
  if offset is not None:
172
173
  return self._to_signed(offset)
@@ -278,8 +279,8 @@ class ReachingDefinitionsState:
278
279
  def _set_initialization_values(
279
280
  self,
280
281
  subject: Subject,
281
- rtoc_value: Optional[int] = None,
282
- initializer: Optional[RDAStateInitializer] = None,
282
+ rtoc_value: int | None = None,
283
+ initializer: RDAStateInitializer | None = None,
283
284
  project=None,
284
285
  ):
285
286
  if initializer is None:
@@ -321,7 +322,7 @@ class ReachingDefinitionsState:
321
322
 
322
323
  return rd
323
324
 
324
- def merge(self, *others) -> Tuple["ReachingDefinitionsState", bool]:
325
+ def merge(self, *others) -> tuple["ReachingDefinitionsState", bool]:
325
326
  state = self.copy()
326
327
  others: Iterable["ReachingDefinitionsState"]
327
328
 
@@ -358,12 +359,12 @@ class ReachingDefinitionsState:
358
359
  atom: Atom,
359
360
  data: MultiValues,
360
361
  dummy=False,
361
- tags: Set[Tag] = None,
362
+ tags: set[Tag] = None,
362
363
  endness=None, # XXX destroy
363
364
  annotated: bool = False,
364
- uses: Optional[Set[Definition]] = None,
365
- override_codeloc: Optional[CodeLocation] = None,
366
- ) -> Tuple[Optional[MultiValues], Set[Definition]]:
365
+ uses: set[Definition] | None = None,
366
+ override_codeloc: CodeLocation | None = None,
367
+ ) -> tuple[MultiValues | None, set[Definition]]:
367
368
  codeloc = override_codeloc or self.codeloc
368
369
  existing_defs = self.live_definitions.get_definitions(atom)
369
370
  mv = self.live_definitions.kill_and_add_definition(
@@ -439,86 +440,84 @@ class ReachingDefinitionsState:
439
440
 
440
441
  return mv, defs
441
442
 
442
- def add_use(self, atom: Atom, expr: Optional[Any] = None) -> None:
443
+ def add_use(self, atom: Atom, expr: Any | None = None) -> None:
443
444
  self.codeloc_uses.update(self.get_definitions(atom))
444
445
  self.live_definitions.add_use(atom, self.codeloc, expr=expr)
445
446
 
446
- def add_use_by_def(self, definition: Definition, expr: Optional[Any] = None) -> None:
447
+ def add_use_by_def(self, definition: Definition, expr: Any | None = None) -> None:
447
448
  self.codeloc_uses.add(definition)
448
449
  self.live_definitions.add_use_by_def(definition, self.codeloc, expr=expr)
449
450
 
450
- def add_tmp_use(self, tmp: int, expr: Optional[Any] = None) -> None:
451
+ def add_tmp_use(self, tmp: int, expr: Any | None = None) -> None:
451
452
  defs = self.live_definitions.get_tmp_definitions(tmp)
452
453
  self.add_tmp_use_by_defs(defs, expr=expr)
453
454
 
454
455
  def add_tmp_use_by_defs(
455
- self, defs: Iterable[Definition], expr: Optional[Any] = None
456
+ self, defs: Iterable[Definition], expr: Any | None = None
456
457
  ) -> None: # pylint:disable=unused-argument
457
458
  for definition in defs:
458
459
  self.codeloc_uses.add(definition)
459
460
  # if track_tmps is False, definitions may not be Tmp definitions
460
461
  self.live_definitions.add_use_by_def(definition, self.codeloc, expr=expr)
461
462
 
462
- def add_register_use(self, reg_offset: int, size: int, expr: Optional[Any] = None) -> None:
463
+ def add_register_use(self, reg_offset: int, size: int, expr: Any | None = None) -> None:
463
464
  defs = self.live_definitions.get_register_definitions(reg_offset, size)
464
465
  self.add_register_use_by_defs(defs, expr=expr)
465
466
 
466
- def add_register_use_by_defs(self, defs: Iterable[Definition], expr: Optional[Any] = None) -> None:
467
+ def add_register_use_by_defs(self, defs: Iterable[Definition], expr: Any | None = None) -> None:
467
468
  for definition in defs:
468
469
  self.codeloc_uses.add(definition)
469
470
  self.live_definitions.add_register_use_by_def(definition, self.codeloc, expr=expr)
470
471
 
471
- def add_stack_use(self, stack_offset: int, size: int, expr: Optional[Any] = None) -> None:
472
+ def add_stack_use(self, stack_offset: int, size: int, expr: Any | None = None) -> None:
472
473
  defs = self.live_definitions.get_stack_definitions(stack_offset, size)
473
474
  self.add_stack_use_by_defs(defs, expr=expr)
474
475
 
475
- def add_stack_use_by_defs(self, defs: Iterable[Definition], expr: Optional[Any] = None):
476
+ def add_stack_use_by_defs(self, defs: Iterable[Definition], expr: Any | None = None):
476
477
  for definition in defs:
477
478
  self.codeloc_uses.add(definition)
478
479
  self.live_definitions.add_stack_use_by_def(definition, self.codeloc, expr=expr)
479
480
 
480
- def add_heap_use(self, heap_offset: int, size: int, expr: Optional[Any] = None) -> None:
481
+ def add_heap_use(self, heap_offset: int, size: int, expr: Any | None = None) -> None:
481
482
  defs = self.live_definitions.get_heap_definitions(heap_offset, size)
482
483
  self.add_heap_use_by_defs(defs, expr=expr)
483
484
 
484
- def add_heap_use_by_defs(self, defs: Iterable[Definition], expr: Optional[Any] = None):
485
+ def add_heap_use_by_defs(self, defs: Iterable[Definition], expr: Any | None = None):
485
486
  for definition in defs:
486
487
  self.codeloc_uses.add(definition)
487
488
  self.live_definitions.add_heap_use_by_def(definition, self.codeloc, expr=expr)
488
489
 
489
- def add_memory_use_by_def(self, definition: Definition, expr: Optional[Any] = None):
490
+ def add_memory_use_by_def(self, definition: Definition, expr: Any | None = None):
490
491
  self.codeloc_uses.add(definition)
491
492
  self.live_definitions.add_memory_use_by_def(definition, self.codeloc, expr=expr)
492
493
 
493
- def add_memory_use_by_defs(self, defs: Iterable[Definition], expr: Optional[Any] = None):
494
+ def add_memory_use_by_defs(self, defs: Iterable[Definition], expr: Any | None = None):
494
495
  for definition in defs:
495
496
  self.codeloc_uses.add(definition)
496
497
  self.live_definitions.add_memory_use_by_def(definition, self.codeloc, expr=expr)
497
498
 
498
- def get_definitions(self, atom: Union[Atom, Definition, Iterable[Atom], Iterable[Definition]]) -> Set[Definition]:
499
+ def get_definitions(self, atom: Atom | Definition | Iterable[Atom] | Iterable[Definition]) -> set[Definition]:
499
500
  return self.live_definitions.get_definitions(atom)
500
501
 
501
- def get_values(self, spec: Union[Atom, Definition, Iterable[Atom]]) -> Optional[MultiValues]:
502
+ def get_values(self, spec: Atom | Definition | Iterable[Atom]) -> MultiValues | None:
502
503
  return self.live_definitions.get_values(spec)
503
504
 
504
- def get_one_value(
505
- self, spec: Union[Atom, Definition], strip_annotations: bool = False
506
- ) -> Optional[claripy.ast.bv.BV]:
505
+ def get_one_value(self, spec: Atom | Definition, strip_annotations: bool = False) -> claripy.ast.bv.BV | None:
507
506
  return self.live_definitions.get_one_value(spec, strip_annotations=strip_annotations)
508
507
 
509
508
  @overload
510
509
  def get_concrete_value(
511
- self, spec: Union[Atom, Definition[Atom], Iterable[Atom]], cast_to: Type[int] = ...
512
- ) -> Optional[int]: ...
510
+ self, spec: Atom | Definition[Atom] | Iterable[Atom], cast_to: type[int] = ...
511
+ ) -> int | None: ...
513
512
 
514
513
  @overload
515
514
  def get_concrete_value(
516
- self, spec: Union[Atom, Definition[Atom], Iterable[Atom]], cast_to: Type[bytes] = ...
517
- ) -> Optional[bytes]: ...
515
+ self, spec: Atom | Definition[Atom] | Iterable[Atom], cast_to: type[bytes] = ...
516
+ ) -> bytes | None: ...
518
517
 
519
518
  def get_concrete_value(
520
- self, spec: Union[Atom, Definition[Atom], Iterable[Atom]], cast_to: Union[Type[int], Type[bytes]] = int
521
- ) -> Union[int, bytes, None]:
519
+ self, spec: Atom | Definition[Atom] | Iterable[Atom], cast_to: type[int] | type[bytes] = int
520
+ ) -> int | bytes | None:
522
521
  return self.live_definitions.get_concrete_value(spec, cast_to)
523
522
 
524
523
  def mark_guard(self, target):
@@ -544,7 +543,7 @@ class ReachingDefinitionsState:
544
543
  self.live_definitions.reset_uses()
545
544
 
546
545
  @deprecated("deref")
547
- def pointer_to_atoms(self, pointer: MultiValues, size: int, endness: str) -> Set[MemoryLocation]:
546
+ def pointer_to_atoms(self, pointer: MultiValues, size: int, endness: str) -> set[MemoryLocation]:
548
547
  """
549
548
  Given a MultiValues, return the set of atoms that loading or storing to the pointer with that value
550
549
  could define or use.
@@ -559,7 +558,7 @@ class ReachingDefinitionsState:
559
558
  return result
560
559
 
561
560
  @deprecated("deref")
562
- def pointer_to_atom(self, value: claripy.ast.base.Base, size: int, endness: str) -> Optional[MemoryLocation]:
561
+ def pointer_to_atom(self, value: claripy.ast.base.Base, size: int, endness: str) -> MemoryLocation | None:
563
562
  if self.is_top(value):
564
563
  return None
565
564
 
@@ -582,33 +581,33 @@ class ReachingDefinitionsState:
582
581
  @overload
583
582
  def deref(
584
583
  self,
585
- pointer: Union[int, claripy.ast.bv.BV, HeapAddress, SpOffset],
586
- size: Union[int, DerefSize],
584
+ pointer: int | claripy.ast.bv.BV | HeapAddress | SpOffset,
585
+ size: int | DerefSize,
587
586
  endness: str = ...,
588
- ) -> Optional[MemoryLocation]: ...
587
+ ) -> MemoryLocation | None: ...
589
588
 
590
589
  @overload
591
590
  def deref(
592
591
  self,
593
- pointer: Union[MultiValues, Atom, Definition, Iterable[Atom], Iterable[Definition]],
594
- size: Union[int, DerefSize],
592
+ pointer: MultiValues | Atom | Definition | Iterable[Atom] | Iterable[Definition],
593
+ size: int | DerefSize,
595
594
  endness: str = ...,
596
- ) -> Set[MemoryLocation]: ...
595
+ ) -> set[MemoryLocation]: ...
597
596
 
598
597
  def deref(
599
598
  self,
600
- pointer: Union[
601
- MultiValues,
602
- Atom,
603
- Definition,
604
- Iterable[Atom],
605
- Iterable[Definition],
606
- int,
607
- claripy.ast.BV,
608
- HeapAddress,
609
- SpOffset,
610
- ],
611
- size: Union[int, DerefSize],
599
+ pointer: (
600
+ MultiValues
601
+ | Atom
602
+ | Definition
603
+ | Iterable[Atom]
604
+ | Iterable[Definition]
605
+ | int
606
+ | claripy.ast.BV
607
+ | HeapAddress
608
+ | SpOffset
609
+ ),
610
+ size: int | DerefSize,
612
611
  endness: str = archinfo.Endness.BE,
613
612
  ):
614
613
  return self.live_definitions.deref(pointer, size, endness)