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 Dict, Optional, Set, Tuple, Iterator, Union
1
+ from typing import Union
2
+ from collections.abc import Iterator
2
3
  import archinfo
3
4
 
4
5
  import claripy
@@ -19,12 +20,12 @@ class MultiValues:
19
20
  "_single_value",
20
21
  )
21
22
 
22
- _single_value: Optional[claripy.ast.Bits]
23
- _values: Optional[Dict[int, Set[claripy.ast.Bits]]]
23
+ _single_value: claripy.ast.Bits | None
24
+ _values: dict[int, set[claripy.ast.Bits]] | None
24
25
 
25
26
  def __init__(
26
27
  self,
27
- v: Union[claripy.ast.Bits, "MultiValues", None, Dict[int, Set[claripy.ast.Bits]]] = None,
28
+ v: Union[claripy.ast.Bits, "MultiValues", None, dict[int, set[claripy.ast.Bits]]] = None,
28
29
  offset_to_values=None,
29
30
  ):
30
31
  if v is not None and offset_to_values is not None:
@@ -126,7 +127,7 @@ class MultiValues:
126
127
  for v in remaining_values:
127
128
  self.add_value(offset, v)
128
129
 
129
- def one_value(self, strip_annotations: bool = False) -> Optional[claripy.ast.Bits]:
130
+ def one_value(self, strip_annotations: bool = False) -> claripy.ast.Bits | None:
130
131
  if self._single_value is not None:
131
132
  return self._single_value
132
133
 
@@ -192,7 +193,7 @@ class MultiValues:
192
193
  return offset == 0
193
194
  return False if not self._values else offset in self._values
194
195
 
195
- def __getitem__(self, offset: int) -> Set[claripy.ast.Bits]:
196
+ def __getitem__(self, offset: int) -> set[claripy.ast.Bits]:
196
197
  if self._single_value is not None:
197
198
  if offset == 0:
198
199
  return {self._single_value}
@@ -201,12 +202,12 @@ class MultiValues:
201
202
  raise KeyError()
202
203
  return self._values[offset]
203
204
 
204
- def keys(self) -> Set[int]:
205
+ def keys(self) -> set[int]:
205
206
  if self._single_value is not None:
206
207
  return {0}
207
208
  return set() if not self._values else set(self._values.keys())
208
209
 
209
- def values(self) -> Iterator[Set[claripy.ast.Bits]]:
210
+ def values(self) -> Iterator[set[claripy.ast.Bits]]:
210
211
  if self._single_value is not None:
211
212
  yield {self._single_value}
212
213
  else:
@@ -214,7 +215,7 @@ class MultiValues:
214
215
  return
215
216
  yield from self._values.values()
216
217
 
217
- def items(self) -> Iterator[Tuple[int, Set[claripy.ast.Bits]]]:
218
+ def items(self) -> Iterator[tuple[int, set[claripy.ast.Bits]]]:
218
219
  if self._single_value is not None:
219
220
  yield 0, {self._single_value}
220
221
  else:
@@ -265,7 +266,7 @@ class MultiValues:
265
266
  # Private methods
266
267
  #
267
268
 
268
- def _adjacent_offset(self, offset: int, before: bool = True) -> Optional[int]:
269
+ def _adjacent_offset(self, offset: int, before: bool = True) -> int | None:
269
270
  """
270
271
  Find the offset that is right before or after the given offset.
271
272
 
@@ -1,6 +1,7 @@
1
1
  # pylint:disable=abstract-method,arguments-differ,assignment-from-no-return
2
2
  import logging
3
- from typing import Optional, List, Set, Tuple, Union, Callable, Any, FrozenSet
3
+ from typing import Union, Any
4
+ from collections.abc import Callable
4
5
 
5
6
  from angr.utils.dynamic_dictlist import DynamicDictList
6
7
  from .....storage.memory_object import SimMemoryObject, SimLabeledMemoryObject
@@ -28,19 +29,19 @@ class MVListPage(
28
29
  def __init__(self, memory=None, content=None, sinkhole=None, mo_cmp=None, **kwargs):
29
30
  super().__init__(**kwargs)
30
31
 
31
- self.content: DynamicDictList[Optional[Union[_MOTYPE, Set[_MOTYPE]]]] = (
32
+ self.content: DynamicDictList[_MOTYPE | set[_MOTYPE] | None] = (
32
33
  DynamicDictList(max_size=memory.page_size, content=content) if content is not None else None
33
34
  )
34
35
  self.stored_offset = set()
35
- self._mo_cmp: Optional[Callable] = mo_cmp
36
+ self._mo_cmp: Callable | None = mo_cmp
36
37
 
37
38
  if self.content is None:
38
39
  if memory is not None:
39
- self.content: DynamicDictList[Optional[Union[_MOTYPE, Set[_MOTYPE]]]] = DynamicDictList(
40
+ self.content: DynamicDictList[_MOTYPE | set[_MOTYPE] | None] = DynamicDictList(
40
41
  max_size=memory.page_size
41
42
  )
42
43
 
43
- self.sinkhole: Optional[_MOTYPE] = sinkhole
44
+ self.sinkhole: _MOTYPE | None = sinkhole
44
45
 
45
46
  def copy(self, memo) -> "MVListPage":
46
47
  o = super().copy(memo)
@@ -52,7 +53,7 @@ class MVListPage(
52
53
 
53
54
  def load(
54
55
  self, addr, size=None, endness=None, page_addr=None, memory=None, cooperate=False, **kwargs
55
- ) -> List[Tuple[int, _MOTYPE]]:
56
+ ) -> list[tuple[int, _MOTYPE]]:
56
57
  result = []
57
58
  last_seen = ... # ;)
58
59
 
@@ -111,7 +112,7 @@ class MVListPage(
111
112
  if not cooperate:
112
113
  data = self._force_store_cooperation(addr, data, size, endness, memory=memory, **kwargs)
113
114
 
114
- data: Set[_MOTYPE]
115
+ data: set[_MOTYPE]
115
116
 
116
117
  if size == len(self.content) and addr == 0 and len(data) == 1:
117
118
  self.sinkhole = next(iter(data))
@@ -141,19 +142,19 @@ class MVListPage(
141
142
 
142
143
  def merge(
143
144
  self,
144
- others: List["MVListPage"],
145
+ others: list["MVListPage"],
145
146
  merge_conditions,
146
147
  common_ancestor=None,
147
148
  page_addr: int = None,
148
149
  memory=None,
149
- changed_offsets: Optional[Set[int]] = None,
150
+ changed_offsets: set[int] | None = None,
150
151
  ):
151
152
  if changed_offsets is None:
152
153
  changed_offsets = set()
153
154
  for other in others:
154
155
  changed_offsets |= self.changed_bytes(other, page_addr)
155
156
 
156
- all_pages: List["MVListPage"] = [self] + others
157
+ all_pages: list["MVListPage"] = [self] + others
157
158
  if merge_conditions is None:
158
159
  merge_conditions = [None] * len(all_pages)
159
160
 
@@ -166,7 +167,7 @@ class MVListPage(
166
167
  continue
167
168
  l.debug("... on byte 0x%x", b)
168
169
 
169
- memory_object_sets: Set[Tuple[FrozenSet[SimMemoryObject], Any]] = set()
170
+ memory_object_sets: set[tuple[frozenset[SimMemoryObject], Any]] = set()
170
171
  unconstrained_in = []
171
172
 
172
173
  # first get a list of all memory objects at that location, and all memories that don't have those bytes
@@ -288,7 +289,7 @@ class MVListPage(
288
289
 
289
290
  unconstrained_in = []
290
291
  self_has_memory_object_set = False
291
- memory_object_sets: Set[FrozenSet[SimMemoryObject]] = set()
292
+ memory_object_sets: set[frozenset[SimMemoryObject]] = set()
292
293
  for sm in [self, other]:
293
294
  if sm._contains(b, page_addr):
294
295
  memory_objects = set()
@@ -312,14 +313,14 @@ class MVListPage(
312
313
  return True
313
314
 
314
315
  def changed_bytes(self, other: "MVListPage", page_addr: int = None):
315
- candidates: Set[int] = super().changed_bytes(other)
316
+ candidates: set[int] = super().changed_bytes(other)
316
317
  if candidates is not None:
317
318
  # using the result from the history tracking mixin as an approximation
318
319
  return candidates
319
320
 
320
321
  # slower path
321
322
  if candidates is None:
322
- candidates: Set[int] = set()
323
+ candidates: set[int] = set()
323
324
  # resort to the slower solution
324
325
  if self.sinkhole is None:
325
326
  candidates |= self.stored_offset
@@ -336,7 +337,7 @@ class MVListPage(
336
337
  candidates.add(i)
337
338
 
338
339
  byte_width = 8 # TODO: Introduce self.state if we want to use self.state.arch.byte_width
339
- differences: Set[int] = set()
340
+ differences: set[int] = set()
340
341
  for c in candidates:
341
342
  s_contains = self._contains(c, page_addr)
342
343
  o_contains = other._contains(c, page_addr)
@@ -410,14 +411,14 @@ class MVListPage(
410
411
  return new_mo
411
412
 
412
413
  @staticmethod
413
- def _resolve_range(mo: SimMemoryObject, page_addr: int, page_size) -> Tuple[int, int]:
414
+ def _resolve_range(mo: SimMemoryObject, page_addr: int, page_size) -> tuple[int, int]:
414
415
  start = max(mo.base, page_addr)
415
416
  end = min(mo.last_addr + 1, page_addr + page_size)
416
417
  if end <= start:
417
418
  l.warning("Nothing left of the memory object to store in SimPage.")
418
419
  return start, end
419
420
 
420
- def _get_objects(self, start: int, page_addr: int) -> Optional[List[SimMemoryObject]]:
421
+ def _get_objects(self, start: int, page_addr: int) -> list[SimMemoryObject] | None:
421
422
  mos = self.content[start]
422
423
  if mos is None:
423
424
  return None
@@ -1,6 +1,7 @@
1
1
  # pylint:disable=arguments-differ
2
2
  import logging
3
- from typing import List, Set, Optional, Tuple, Union, Any, Iterable
3
+ from typing import Any
4
+ from collections.abc import Iterable
4
5
 
5
6
  from sortedcontainers import SortedDict
6
7
 
@@ -116,7 +117,7 @@ class UltraPage(MemoryObjectMixin, PageBase):
116
117
  def store(
117
118
  self,
118
119
  addr,
119
- data: Union[int, SimMemoryObject],
120
+ data: int | SimMemoryObject,
120
121
  size: int = None,
121
122
  endness=None,
122
123
  memory=None,
@@ -197,12 +198,12 @@ class UltraPage(MemoryObjectMixin, PageBase):
197
198
 
198
199
  def merge(
199
200
  self,
200
- others: List["UltraPage"],
201
+ others: list["UltraPage"],
201
202
  merge_conditions,
202
203
  common_ancestor=None,
203
204
  page_addr: int = None, # pylint: disable=arguments-differ
204
205
  memory=None,
205
- changed_offsets: Optional[Set[int]] = None,
206
+ changed_offsets: set[int] | None = None,
206
207
  ):
207
208
  all_pages = [self] + others
208
209
  merged_to = None
@@ -220,10 +221,10 @@ class UltraPage(MemoryObjectMixin, PageBase):
220
221
  continue
221
222
  l.debug("... on byte 0x%x", b)
222
223
 
223
- memory_objects: List[Tuple[SimMemoryObject, Any]] = []
224
- concretes: List[Tuple[int, Any]] = []
225
- unconstrained_in: List[Tuple["UltraPage", Any]] = []
226
- our_mo: Optional[SimMemoryObject] = None
224
+ memory_objects: list[tuple[SimMemoryObject, Any]] = []
225
+ concretes: list[tuple[int, Any]] = []
226
+ unconstrained_in: list[tuple["UltraPage", Any]] = []
227
+ our_mo: SimMemoryObject | None = None
227
228
 
228
229
  # first get a list of all memory objects at that location, and
229
230
  # all memories that don't have those bytes
@@ -335,12 +336,12 @@ class UltraPage(MemoryObjectMixin, PageBase):
335
336
  else:
336
337
  return self.concrete_data[addr : addr + size], memoryview(self.symbolic_bitmap)[addr : addr + size]
337
338
 
338
- def changed_bytes(self, other, page_addr=None) -> Set[int]:
339
+ def changed_bytes(self, other, page_addr=None) -> set[int]:
339
340
  changed_candidates = super().changed_bytes(other)
340
341
  if changed_candidates is None:
341
342
  changed_candidates = range(len(self.symbolic_bitmap))
342
343
 
343
- changes: Set[int] = set()
344
+ changes: set[int] = set()
344
345
 
345
346
  for addr in changed_candidates:
346
347
  if self.symbolic_bitmap[addr] != other.symbolic_bitmap[addr]:
@@ -395,7 +396,7 @@ class UltraPage(MemoryObjectMixin, PageBase):
395
396
  # symbolic data or does not exist
396
397
  return self._get_object(start, page_addr) is not None
397
398
 
398
- def _get_object(self, start: int, page_addr: int, memory=None) -> Optional[SimMemoryObject]:
399
+ def _get_object(self, start: int, page_addr: int, memory=None) -> SimMemoryObject | None:
399
400
  try:
400
401
  place = next(self.symbolic_data.irange(maximum=start, reverse=True))
401
402
  except StopIteration:
@@ -1,4 +1,4 @@
1
- from typing import List, Tuple, Generator
1
+ from collections.abc import Generator
2
2
 
3
3
  from claripy.vsa import StridedInterval
4
4
 
@@ -12,13 +12,13 @@ class AbstractAddressDescriptor:
12
12
  __slots__ = ("_regioned_addrs",)
13
13
 
14
14
  def __init__(self):
15
- self._regioned_addrs: List[Tuple[str, StridedInterval]] = []
15
+ self._regioned_addrs: list[tuple[str, StridedInterval]] = []
16
16
 
17
17
  def __len__(self) -> int:
18
18
  # this may raise an OverflowError if self.cardinality is greater than sys.maxint
19
19
  return self.cardinality
20
20
 
21
- def __iter__(self) -> Generator[Tuple[str, StridedInterval], None, None]:
21
+ def __iter__(self) -> Generator[tuple[str, StridedInterval], None, None]:
22
22
  yield from self._regioned_addrs
23
23
 
24
24
  @property
@@ -1,5 +1,6 @@
1
1
  import logging
2
- from typing import Iterable, Tuple, Any
2
+ from typing import Any
3
+ from collections.abc import Iterable
3
4
 
4
5
  from .. import MemoryMixin
5
6
 
@@ -7,7 +8,7 @@ l = logging.getLogger(name=__name__)
7
8
 
8
9
 
9
10
  class AbstractMergerMixin(MemoryMixin):
10
- def _merge_values(self, values: Iterable[Tuple[Any, Any]], merged_size: int, **kwargs):
11
+ def _merge_values(self, values: Iterable[tuple[Any, Any]], merged_size: int, **kwargs):
11
12
  # if self.category == 'reg' and self.state.arch.register_endness == 'Iend_LE':
12
13
  # should_reverse = True
13
14
  # elif self.state.arch.memory_endness == 'Iend_LE':
@@ -1,4 +1,3 @@
1
- from typing import Optional
2
1
  from sortedcontainers import SortedDict
3
2
 
4
3
  from ....errors import SimRegionMapError
@@ -19,7 +18,7 @@ class AddressWrapper:
19
18
  "function_address",
20
19
  )
21
20
 
22
- def __init__(self, region: str, region_base_addr: int, address, is_on_stack: bool, function_address: Optional[int]):
21
+ def __init__(self, region: str, region_base_addr: int, address, is_on_stack: bool, function_address: int | None):
23
22
  """
24
23
  Constructor for the class AddressWrapper.
25
24
 
@@ -1,5 +1,5 @@
1
1
  import copy
2
- from typing import Dict, Tuple, Any
2
+ from typing import Any
3
3
 
4
4
  from claripy.vsa import AbstractLocation
5
5
 
@@ -21,7 +21,7 @@ class MemoryRegionMetaMixin(MemoryMixin):
21
21
  super().__init__(**kwargs)
22
22
  self._related_function_addr = related_function_addr
23
23
  # This is a map from tuple (basicblock_key, stmt_id) to AbstractLocation objects
24
- self.alocs: Dict[Tuple[Any, int], AbstractLocation] = {}
24
+ self.alocs: dict[tuple[Any, int], AbstractLocation] = {}
25
25
 
26
26
  self._is_stack = None
27
27
 
@@ -1,4 +1,4 @@
1
- from typing import Optional, Generator
1
+ from collections.abc import Generator
2
2
 
3
3
  import claripy
4
4
 
@@ -95,7 +95,7 @@ class RegionedAddressConcretizationMixin(MemoryMixin):
95
95
  desc: AbstractAddressDescriptor,
96
96
  original_addr: claripy.ast.Bits,
97
97
  is_write: bool = False,
98
- target_region: Optional[str] = None,
98
+ target_region: str | None = None,
99
99
  ) -> Generator[AddressWrapper, None, None]:
100
100
  strategies = self.write_strategies if is_write else self.read_strategies
101
101
  targets_limit = self._write_targets_limit if is_write else self._read_targets_limit
@@ -113,6 +113,6 @@ class RegionedAddressConcretizationMixin(MemoryMixin):
113
113
  yield self._normalize_address_core(region, c, target_region=target_region)
114
114
 
115
115
  def _normalize_address_core(
116
- self, region_id: str, relative_address: int, target_region: Optional[str] = None
116
+ self, region_id: str, relative_address: int, target_region: str | None = None
117
117
  ) -> AddressWrapper:
118
118
  return super()._normalize_address_core(region_id, relative_address, target_region)
@@ -1,6 +1,7 @@
1
1
  import logging
2
2
  from itertools import count
3
- from typing import Dict, Optional, Generator, Union, TYPE_CHECKING, Tuple, Iterable
3
+ from typing import Optional, TYPE_CHECKING
4
+ from collections.abc import Generator, Iterable
4
5
 
5
6
  import claripy
6
7
  from claripy.ast import Bool, Bits, BV
@@ -45,12 +46,12 @@ class RegionedMemoryMixin(MemoryMixin):
45
46
  self,
46
47
  write_targets_limit: int = 2048,
47
48
  read_targets_limit: int = 4096,
48
- stack_region_map: Optional[RegionMap] = None,
49
- generic_region_map: Optional[RegionMap] = None,
49
+ stack_region_map: RegionMap | None = None,
50
+ generic_region_map: RegionMap | None = None,
50
51
  stack_size: int = 65536,
51
52
  cle_memory_backer: Optional = None,
52
- dict_memory_backer: Optional[Dict] = None,
53
- regioned_memory_cls: Optional[type] = None,
53
+ dict_memory_backer: dict | None = None,
54
+ regioned_memory_cls: type | None = None,
54
55
  **kwargs,
55
56
  ):
56
57
  super().__init__(**kwargs)
@@ -62,15 +63,13 @@ class RegionedMemoryMixin(MemoryMixin):
62
63
  regioned_memory_cls = RegionedMemory
63
64
 
64
65
  self._regioned_memory_cls = regioned_memory_cls
65
- self._regions: Dict[str, regioned_memory_cls] = {}
66
+ self._regions: dict[str, regioned_memory_cls] = {}
66
67
 
67
68
  self._cle_memory_backer = cle_memory_backer
68
69
  self._dict_memory_backer = dict_memory_backer
69
70
  self._stack_size: int = stack_size
70
- self._stack_region_map: Optional[RegionMap] = (
71
- stack_region_map if stack_region_map is not None else RegionMap(True)
72
- )
73
- self._generic_region_map: Optional[RegionMap] = (
71
+ self._stack_region_map: RegionMap | None = stack_region_map if stack_region_map is not None else RegionMap(True)
72
+ self._generic_region_map: RegionMap | None = (
74
73
  generic_region_map if generic_region_map is not None else RegionMap(False)
75
74
  )
76
75
 
@@ -96,9 +95,7 @@ class RegionedMemoryMixin(MemoryMixin):
96
95
 
97
96
  return o
98
97
 
99
- def load(
100
- self, addr, size: Optional[Union[BV, int]] = None, endness=None, condition: Optional[Bool] = None, **kwargs
101
- ):
98
+ def load(self, addr, size: BV | int | None = None, endness=None, condition: Bool | None = None, **kwargs):
102
99
  if isinstance(size, BV) and isinstance(size._model_vsa, ValueSet):
103
100
  _l.critical("load(): size %s is a ValueSet. Something is wrong.", size)
104
101
  if self.state.scratch.ins_addr is not None:
@@ -146,7 +143,7 @@ class RegionedMemoryMixin(MemoryMixin):
146
143
 
147
144
  return val
148
145
 
149
- def store(self, addr, data, size: Optional[int] = None, endness=None, **kwargs):
146
+ def store(self, addr, data, size: int | None = None, endness=None, **kwargs):
150
147
  regioned_addrs_desc = self._normalize_address(addr)
151
148
  if (
152
149
  regioned_addrs_desc.cardinality >= self._write_targets_limit
@@ -169,7 +166,7 @@ class RegionedMemoryMixin(MemoryMixin):
169
166
  r = True
170
167
  return r
171
168
 
172
- def find(self, addr: Union[int, Bits], data, max_search, **kwargs):
169
+ def find(self, addr: int | Bits, data, max_search, **kwargs):
173
170
  # FIXME: Attempt find() on more than one region
174
171
 
175
172
  gen = self._normalize_address_type(addr, self.state.arch.bits)
@@ -196,7 +193,7 @@ class RegionedMemoryMixin(MemoryMixin):
196
193
  #
197
194
 
198
195
  def set_stack_address_mapping(
199
- self, absolute_address: int, region_id: str, related_function_address: Optional[int] = None
196
+ self, absolute_address: int, region_id: str, related_function_address: int | None = None
200
197
  ):
201
198
  """
202
199
  Create a new mapping between an absolute address (which is the base address of a specific stack frame) and a
@@ -255,7 +252,7 @@ class RegionedMemoryMixin(MemoryMixin):
255
252
  related_function_addr: int,
256
253
  endness,
257
254
  cle_memory_backer: Optional = None,
258
- dict_memory_backer: Optional[Dict] = None,
255
+ dict_memory_backer: dict | None = None,
259
256
  ):
260
257
  """
261
258
  Create a new MemoryRegion with the region key specified, and store it to self._regions.
@@ -317,7 +314,7 @@ class RegionedMemoryMixin(MemoryMixin):
317
314
 
318
315
  return self._regions[key].load(addr, size, bbl_addr, stmt_id, ins_addr, **kwargs)
319
316
 
320
- def _region_store(self, addr, data, key: str, endness, related_function_addr: Optional[int] = None, **kwargs):
317
+ def _region_store(self, addr, data, key: str, endness, related_function_addr: int | None = None, **kwargs):
321
318
  if key not in self._regions:
322
319
  self._create_region(
323
320
  key,
@@ -351,7 +348,7 @@ class RegionedMemoryMixin(MemoryMixin):
351
348
  desc: AbstractAddressDescriptor,
352
349
  original_addr: claripy.ast.Bits,
353
350
  is_write: bool = False,
354
- target_region: Optional[str] = None,
351
+ target_region: str | None = None,
355
352
  ) -> Generator[AddressWrapper, None, None]:
356
353
  raise NotImplementedError()
357
354
 
@@ -384,7 +381,7 @@ class RegionedMemoryMixin(MemoryMixin):
384
381
  return desc
385
382
 
386
383
  def _normalize_address_core(
387
- self, region_id: str, relative_address: int, target_region: Optional[str] = None
384
+ self, region_id: str, relative_address: int, target_region: str | None = None
388
385
  ) -> AddressWrapper:
389
386
  """
390
387
  If this is a stack address, we convert it to a correct region and address
@@ -434,7 +431,7 @@ class RegionedMemoryMixin(MemoryMixin):
434
431
  return addr
435
432
 
436
433
  @staticmethod
437
- def _normalize_address_type(addr: Union[int, Bits], bits) -> Generator[Tuple[str, StridedInterval], None, None]:
434
+ def _normalize_address_type(addr: int | Bits, bits) -> Generator[tuple[str, StridedInterval], None, None]:
438
435
  """
439
436
  Convert address of different types to a list of mapping between region IDs and offsets (strided intervals).
440
437
 
@@ -1,4 +1,3 @@
1
- from typing import Optional
2
1
  import logging
3
2
 
4
3
  from . import MemoryMixin
@@ -60,7 +59,7 @@ class SizeConcretizationMixin(MemoryMixin):
60
59
  def __init__(
61
60
  self,
62
61
  concretize_symbolic_write_size: bool = False,
63
- max_concretize_count: Optional[int] = 256,
62
+ max_concretize_count: int | None = 256,
64
63
  max_symbolic_size: int = 0x400000,
65
64
  raise_memory_limit_error: bool = False,
66
65
  size_limit: int = 257,
@@ -1,10 +1,11 @@
1
- from typing import Iterable, Tuple, Any
1
+ from typing import Any
2
+ from collections.abc import Iterable
2
3
 
3
4
  from . import MemoryMixin
4
5
 
5
6
 
6
7
  class SymbolicMergerMixin(MemoryMixin):
7
- def _merge_values(self, values: Iterable[Tuple[Any, Any]], merged_size: int, **kwargs):
8
+ def _merge_values(self, values: Iterable[tuple[Any, Any]], merged_size: int, **kwargs):
8
9
  merged_val = self.state.solver.BVV(0, merged_size * self.state.arch.byte_width)
9
10
  for tm, fv in values:
10
11
  merged_val = self.state.solver.If(fv, tm, merged_val)
@@ -1,4 +1,5 @@
1
- from typing import Iterable, Tuple, Any, Callable
1
+ from typing import Any
2
+ from collections.abc import Iterable, Callable
2
3
 
3
4
  from . import MemoryMixin
4
5
 
@@ -13,7 +14,7 @@ class TopMergerMixin(MemoryMixin):
13
14
 
14
15
  super().__init__(*args, **kwargs)
15
16
 
16
- def _merge_values(self, values: Iterable[Tuple[Any, Any]], merged_size: int, **kwargs):
17
+ def _merge_values(self, values: Iterable[tuple[Any, Any]], merged_size: int, **kwargs):
17
18
  merged_val = self._top_func(merged_size * self.state.arch.byte_width)
18
19
  return merged_val
19
20
 
@@ -1,5 +1,3 @@
1
- from typing import Optional
2
-
3
1
  import claripy
4
2
 
5
3
  from ..errors import SimMemoryError
@@ -45,7 +43,7 @@ class SimMemoryObject:
45
43
  self.object = obj
46
44
  self.length = obj_bit_size(obj) // self._byte_width if length is None else length
47
45
  self.endness = endness
48
- self._concrete_bytes: Optional[bytes] = None
46
+ self._concrete_bytes: bytes | None = None
49
47
 
50
48
  def size(self):
51
49
  return self.length * self._byte_width
@@ -69,7 +67,7 @@ class SimMemoryObject:
69
67
  def last_addr(self):
70
68
  return self.base + self.length - 1
71
69
 
72
- def concrete_bytes(self, offset: int, size: int) -> Optional[bytes]:
70
+ def concrete_bytes(self, offset: int, size: int) -> bytes | None:
73
71
  if self._concrete_bytes is None:
74
72
  if isinstance(self.object, claripy.ast.Bits) and self.object.op == "BVV" and not self.object.annotations:
75
73
  self._concrete_bytes = self.object.concrete_value.to_bytes(len(self.object) // self._byte_width, "big")
angr/utils/algo.py CHANGED
@@ -1,7 +1,8 @@
1
- from typing import Callable, List, Any, Optional
1
+ from typing import Any
2
+ from collections.abc import Callable
2
3
 
3
4
 
4
- def binary_insert(lst: List, elem: Any, key: Callable, lo: int = 0, hi: Optional[int] = None) -> None:
5
+ def binary_insert(lst: list, elem: Any, key: Callable, lo: int = 0, hi: int | None = None) -> None:
5
6
  """
6
7
  Insert an element into a sorted list, and keep the list sorted.
7
8
 
@@ -1,5 +1,5 @@
1
1
  import platform
2
- from typing import Optional, Union, Dict, List, Generic, TypeVar
2
+ from typing import Union, Generic, TypeVar
3
3
 
4
4
 
5
5
  # Ref: https://github.com/angr/angr/pull/3471#issuecomment-1236515950
@@ -26,11 +26,11 @@ class DynamicDictList(Generic[VT]):
26
26
 
27
27
  def __init__(
28
28
  self,
29
- max_size: Optional[int] = None,
30
- content: Optional[Union["DynamicDictList", Dict[int, VT], List[VT]]] = None,
29
+ max_size: int | None = None,
30
+ content: Union["DynamicDictList", dict[int, VT], list[VT]] | None = None,
31
31
  ):
32
- self.list_content: Optional[List[VT]] = None
33
- self.dict_content: Optional[Dict[int, VT]] = None
32
+ self.list_content: list[VT] | None = None
33
+ self.dict_content: dict[int, VT] | None = None
34
34
  self.max_size = max_size
35
35
 
36
36
  if content:
angr/utils/formatting.py CHANGED
@@ -1,5 +1,5 @@
1
1
  import sys
2
- from typing import Sequence, Optional, Callable
2
+ from collections.abc import Sequence, Callable
3
3
 
4
4
 
5
5
  if sys.platform == "win32":
@@ -25,7 +25,7 @@ def setup_terminal():
25
25
  ansi_color_enabled = isatty
26
26
 
27
27
 
28
- def ansi_color(s: str, color: Optional[str]) -> str:
28
+ def ansi_color(s: str, color: str | None) -> str:
29
29
  """
30
30
  Colorize string `s` by wrapping in ANSI escape sequence for given `color`.
31
31
 
@@ -62,9 +62,9 @@ def add_edge_to_buffer(
62
62
  ref: Sequence[str],
63
63
  start: int,
64
64
  end: int,
65
- formatter: Optional[Callable[[str], str]] = None,
65
+ formatter: Callable[[str], str] | None = None,
66
66
  dashed: bool = False,
67
- ascii_only: Optional[bool] = None,
67
+ ascii_only: bool | None = None,
68
68
  ):
69
69
  """
70
70
  Draw an edge by adding Unicode box and arrow glyphs to beginning of each line in a list of lines.
angr/utils/funcid.py CHANGED
@@ -1,5 +1,4 @@
1
1
  # pylint:disable=too-many-boolean-expressions
2
- from typing import Optional
3
2
 
4
3
  import capstone
5
4
 
@@ -32,7 +31,7 @@ def is_function_security_check_cookie(func, project, security_cookie_addr: int)
32
31
  return False
33
32
 
34
33
 
35
- def is_function_security_init_cookie(func: "Function", project, security_cookie_addr: Optional[int]) -> bool:
34
+ def is_function_security_init_cookie(func: "Function", project, security_cookie_addr: int | None) -> bool:
36
35
  if func.is_plt or func.is_syscall or func.is_simprocedure:
37
36
  return False
38
37
  # the function should have only one return point