angr 9.2.138__py3-none-manylinux2014_x86_64.whl → 9.2.140__py3-none-manylinux2014_x86_64.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 (100) hide show
  1. angr/__init__.py +1 -1
  2. angr/analyses/calling_convention/calling_convention.py +48 -21
  3. angr/analyses/calling_convention/fact_collector.py +59 -12
  4. angr/analyses/calling_convention/utils.py +2 -2
  5. angr/analyses/cfg/cfg_base.py +13 -0
  6. angr/analyses/cfg/cfg_fast.py +23 -4
  7. angr/analyses/decompiler/ail_simplifier.py +79 -53
  8. angr/analyses/decompiler/block_simplifier.py +0 -2
  9. angr/analyses/decompiler/callsite_maker.py +80 -14
  10. angr/analyses/decompiler/clinic.py +99 -80
  11. angr/analyses/decompiler/condition_processor.py +2 -2
  12. angr/analyses/decompiler/decompiler.py +19 -7
  13. angr/analyses/decompiler/dephication/rewriting_engine.py +16 -7
  14. angr/analyses/decompiler/expression_narrower.py +1 -1
  15. angr/analyses/decompiler/optimization_passes/__init__.py +3 -0
  16. angr/analyses/decompiler/optimization_passes/condition_constprop.py +149 -0
  17. angr/analyses/decompiler/optimization_passes/const_prop_reverter.py +8 -7
  18. angr/analyses/decompiler/optimization_passes/deadblock_remover.py +12 -3
  19. angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py +1 -1
  20. angr/analyses/decompiler/optimization_passes/ite_region_converter.py +21 -13
  21. angr/analyses/decompiler/optimization_passes/optimization_pass.py +21 -12
  22. angr/analyses/decompiler/optimization_passes/return_duplicator_base.py +17 -9
  23. angr/analyses/decompiler/optimization_passes/return_duplicator_high.py +7 -10
  24. angr/analyses/decompiler/peephole_optimizations/eager_eval.py +12 -1
  25. angr/analyses/decompiler/peephole_optimizations/remove_redundant_conversions.py +61 -25
  26. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts.py +50 -1
  27. angr/analyses/decompiler/presets/fast.py +2 -0
  28. angr/analyses/decompiler/presets/full.py +2 -0
  29. angr/analyses/decompiler/region_simplifiers/expr_folding.py +259 -108
  30. angr/analyses/decompiler/region_simplifiers/region_simplifier.py +28 -9
  31. angr/analyses/decompiler/ssailification/rewriting_engine.py +20 -2
  32. angr/analyses/decompiler/ssailification/traversal_engine.py +4 -3
  33. angr/analyses/decompiler/structured_codegen/c.py +10 -3
  34. angr/analyses/decompiler/structuring/dream.py +28 -19
  35. angr/analyses/decompiler/structuring/phoenix.py +253 -89
  36. angr/analyses/decompiler/structuring/recursive_structurer.py +1 -0
  37. angr/analyses/decompiler/structuring/structurer_base.py +121 -46
  38. angr/analyses/decompiler/structuring/structurer_nodes.py +6 -1
  39. angr/analyses/decompiler/utils.py +60 -1
  40. angr/analyses/deobfuscator/api_obf_finder.py +13 -5
  41. angr/analyses/deobfuscator/api_obf_type2_finder.py +166 -0
  42. angr/analyses/deobfuscator/string_obf_finder.py +105 -18
  43. angr/analyses/forward_analysis/forward_analysis.py +1 -1
  44. angr/analyses/propagator/top_checker_mixin.py +6 -6
  45. angr/analyses/reaching_definitions/__init__.py +2 -1
  46. angr/analyses/reaching_definitions/dep_graph.py +1 -12
  47. angr/analyses/reaching_definitions/engine_vex.py +36 -31
  48. angr/analyses/reaching_definitions/function_handler.py +15 -2
  49. angr/analyses/reaching_definitions/rd_state.py +1 -37
  50. angr/analyses/reaching_definitions/reaching_definitions.py +13 -24
  51. angr/analyses/s_propagator.py +129 -87
  52. angr/analyses/s_reaching_definitions/s_rda_model.py +7 -1
  53. angr/analyses/s_reaching_definitions/s_rda_view.py +2 -2
  54. angr/analyses/s_reaching_definitions/s_reaching_definitions.py +3 -1
  55. angr/analyses/stack_pointer_tracker.py +36 -22
  56. angr/analyses/typehoon/simple_solver.py +45 -7
  57. angr/analyses/typehoon/typeconsts.py +18 -5
  58. angr/analyses/variable_recovery/engine_ail.py +1 -1
  59. angr/analyses/variable_recovery/engine_base.py +62 -67
  60. angr/analyses/variable_recovery/engine_vex.py +1 -1
  61. angr/analyses/variable_recovery/irsb_scanner.py +2 -2
  62. angr/block.py +69 -107
  63. angr/callable.py +14 -7
  64. angr/calling_conventions.py +81 -10
  65. angr/distributed/__init__.py +1 -1
  66. angr/engines/__init__.py +7 -8
  67. angr/engines/engine.py +3 -138
  68. angr/engines/failure.py +2 -2
  69. angr/engines/hook.py +2 -2
  70. angr/engines/light/engine.py +5 -10
  71. angr/engines/pcode/emulate.py +2 -2
  72. angr/engines/pcode/engine.py +2 -14
  73. angr/engines/pcode/lifter.py +2 -2
  74. angr/engines/procedure.py +2 -2
  75. angr/engines/soot/engine.py +2 -2
  76. angr/engines/soot/statements/switch.py +1 -1
  77. angr/engines/successors.py +123 -17
  78. angr/engines/syscall.py +2 -2
  79. angr/engines/unicorn.py +3 -3
  80. angr/engines/vex/heavy/heavy.py +3 -15
  81. angr/engines/vex/lifter.py +2 -2
  82. angr/engines/vex/light/light.py +2 -2
  83. angr/factory.py +4 -19
  84. angr/knowledge_plugins/cfg/cfg_model.py +3 -2
  85. angr/knowledge_plugins/key_definitions/atoms.py +8 -4
  86. angr/knowledge_plugins/key_definitions/live_definitions.py +41 -103
  87. angr/knowledge_plugins/labels.py +2 -2
  88. angr/knowledge_plugins/obfuscations.py +1 -0
  89. angr/knowledge_plugins/xrefs/xref_manager.py +4 -0
  90. angr/sim_type.py +19 -17
  91. angr/state_plugins/plugin.py +19 -4
  92. angr/storage/memory_mixins/memory_mixin.py +1 -1
  93. angr/storage/memory_mixins/paged_memory/pages/multi_values.py +10 -5
  94. angr/utils/ssa/__init__.py +119 -4
  95. {angr-9.2.138.dist-info → angr-9.2.140.dist-info}/METADATA +6 -6
  96. {angr-9.2.138.dist-info → angr-9.2.140.dist-info}/RECORD +100 -98
  97. {angr-9.2.138.dist-info → angr-9.2.140.dist-info}/LICENSE +0 -0
  98. {angr-9.2.138.dist-info → angr-9.2.140.dist-info}/WHEEL +0 -0
  99. {angr-9.2.138.dist-info → angr-9.2.140.dist-info}/entry_points.txt +0 -0
  100. {angr-9.2.138.dist-info → angr-9.2.140.dist-info}/top_level.txt +0 -0
@@ -12,7 +12,8 @@ from angr.engines.light import SimEngineNostmtVEX, SpOffset
12
12
  from angr.engines.vex.claripy.datalayer import value as claripy_value
13
13
  from angr.errors import SimEngineError, SimMemoryMissingError
14
14
  from angr.utils.constants import DEFAULT_STATEMENT
15
- from angr.knowledge_plugins.key_definitions.live_definitions import Definition, LiveDefinitions
15
+ from angr.knowledge_plugins.key_definitions.definition import Definition
16
+ from angr.knowledge_plugins.key_definitions.live_definitions import LiveDefinitions
16
17
  from angr.knowledge_plugins.key_definitions.tag import LocalVariableTag, ParameterTag, Tag
17
18
  from angr.knowledge_plugins.key_definitions.atoms import Atom, Register, MemoryLocation, Tmp
18
19
  from angr.knowledge_plugins.key_definitions.constants import OP_BEFORE, OP_AFTER
@@ -78,11 +79,15 @@ class SimEngineRDVEX(
78
79
  self._set_codeloc()
79
80
  if self.block.vex.jumpkind == "Ijk_Call":
80
81
  # it has to be a function
81
- addr = self._expr_bv(self.block.vex.next)
82
+ block_next = self.block.vex.next
83
+ assert isinstance(block_next, pyvex.expr.IRExpr)
84
+ addr = self._expr_bv(block_next)
82
85
  self._handle_function(addr)
83
86
  elif self.block.vex.jumpkind == "Ijk_Boring":
84
87
  # test if the target addr is a function or not
85
- addr = self._expr_bv(self.block.vex.next)
88
+ block_next = self.block.vex.next
89
+ assert isinstance(block_next, pyvex.expr.IRExpr)
90
+ addr = self._expr_bv(block_next)
86
91
  addr_v = addr.one_value()
87
92
  if addr_v is not None and addr_v.concrete:
88
93
  addr_int = addr_v.concrete_value
@@ -550,7 +555,7 @@ class SimEngineRDVEX(
550
555
  return r
551
556
 
552
557
  @unop_handler
553
- def _handle_unop_Not(self, expr):
558
+ def _handle_unop_Not(self, expr: pyvex.expr.Unop) -> MultiValues:
554
559
  arg0 = expr.args[0]
555
560
  expr_0 = self._expr_bv(arg0)
556
561
  bits = expr.result_size(self.tyenv)
@@ -563,7 +568,7 @@ class SimEngineRDVEX(
563
568
  return MultiValues(self.state.top(bits))
564
569
 
565
570
  @unop_handler
566
- def _handle_unop_Clz(self, expr):
571
+ def _handle_unop_Clz(self, expr: pyvex.expr.Unop) -> MultiValues:
567
572
  arg0 = expr.args[0]
568
573
  _ = self._expr(arg0)
569
574
  bits = expr.result_size(self.tyenv)
@@ -571,7 +576,7 @@ class SimEngineRDVEX(
571
576
  return MultiValues(self.state.top(bits))
572
577
 
573
578
  @unop_handler
574
- def _handle_unop_Ctz(self, expr):
579
+ def _handle_unop_Ctz(self, expr: pyvex.expr.Unop) -> MultiValues:
575
580
  arg0 = expr.args[0]
576
581
  _ = self._expr(arg0)
577
582
  bits = expr.result_size(self.tyenv)
@@ -582,19 +587,19 @@ class SimEngineRDVEX(
582
587
  # Binary operation handlers
583
588
  #
584
589
  @binop_handler
585
- def _handle_binop_ExpCmpNE64(self, expr):
590
+ def _handle_binop_ExpCmpNE64(self, expr: pyvex.expr.Binop) -> MultiValues:
586
591
  _, _ = self._expr(expr.args[0]), self._expr(expr.args[1])
587
592
  bits = expr.result_size(self.tyenv)
588
593
  # Need to actually implement this later
589
594
  return MultiValues(self.state.top(bits))
590
595
 
591
596
  @binop_handler
592
- def _handle_binop_16HLto32(self, expr):
597
+ def _handle_binop_16HLto32(self, expr: pyvex.expr.Binop) -> MultiValues:
593
598
  expr0, expr1 = self._expr_bv(expr.args[0]), self._expr_bv(expr.args[1])
594
599
  return expr0.concat(expr1)
595
600
 
596
601
  @binop_handler
597
- def _handle_binop_Add(self, expr):
602
+ def _handle_binop_Add(self, expr: pyvex.expr.Binop) -> MultiValues:
598
603
  expr0, expr1 = self._expr_bv(expr.args[0]), self._expr_bv(expr.args[1])
599
604
  bits = expr.result_size(self.tyenv)
600
605
 
@@ -625,7 +630,7 @@ class SimEngineRDVEX(
625
630
  return r
626
631
 
627
632
  @binop_handler
628
- def _handle_binop_Sub(self, expr):
633
+ def _handle_binop_Sub(self, expr: pyvex.expr.Binop) -> MultiValues:
629
634
  expr0, expr1 = self._expr_bv(expr.args[0]), self._expr_bv(expr.args[1])
630
635
  bits = expr.result_size(self.tyenv)
631
636
 
@@ -656,7 +661,7 @@ class SimEngineRDVEX(
656
661
  return r
657
662
 
658
663
  @binop_handler
659
- def _handle_binop_Mul(self, expr):
664
+ def _handle_binop_Mul(self, expr: pyvex.expr.Binop) -> MultiValues:
660
665
  expr0, expr1 = self._expr_pair(expr.args[0], expr.args[1])
661
666
  bits = expr.result_size(self.tyenv)
662
667
 
@@ -687,13 +692,13 @@ class SimEngineRDVEX(
687
692
  return r
688
693
 
689
694
  @binop_handler
690
- def _handle_binop_Mull(self, expr):
695
+ def _handle_binop_Mull(self, expr: pyvex.expr.Binop) -> MultiValues:
691
696
  _, _ = self._expr(expr.args[0]), self._expr(expr.args[1])
692
697
  bits = expr.result_size(self.tyenv)
693
698
  return MultiValues(self.state.top(bits))
694
699
 
695
700
  @binop_handler
696
- def _handle_binop_Div(self, expr):
701
+ def _handle_binop_Div(self, expr: pyvex.expr.Binop) -> MultiValues:
697
702
  expr0, expr1 = self._expr_pair(expr.args[0], expr.args[1])
698
703
  bits = expr.result_size(self.tyenv)
699
704
 
@@ -727,19 +732,20 @@ class SimEngineRDVEX(
727
732
  return r
728
733
 
729
734
  @binop_handler
730
- def _handle_binop_DivMod(self, expr):
735
+ def _handle_binop_DivMod(self, expr: pyvex.expr.Binop) -> MultiValues:
731
736
  _, _ = self._expr(expr.args[0]), self._expr(expr.args[1])
732
737
  bits = expr.result_size(self.tyenv)
733
738
 
734
739
  return MultiValues(self.state.top(bits))
735
740
 
736
- def _handle_Mod(self, expr):
741
+ @binop_handler
742
+ def _handle_Mod(self, expr: pyvex.expr.Binop) -> MultiValues:
737
743
  _, _ = self._expr(expr.args[0]), self._expr(expr.args[1])
738
744
  bits = expr.result_size(self.tyenv)
739
745
  return MultiValues(self.state.top(bits))
740
746
 
741
747
  @binop_handler
742
- def _handle_binop_And(self, expr):
748
+ def _handle_binop_And(self, expr: pyvex.expr.Binop) -> MultiValues:
743
749
  expr0, expr1 = self._expr_bv(expr.args[0]), self._expr_bv(expr.args[1])
744
750
  bits = expr.result_size(self.tyenv)
745
751
 
@@ -748,9 +754,8 @@ class SimEngineRDVEX(
748
754
  expr1_v = expr1.one_value()
749
755
 
750
756
  if expr0_v is not None and expr1_v is not None:
751
- if expr0_v.concrete and expr1_v.concrete:
752
- # bitwise-and two single values together
753
- r = MultiValues(expr0_v & expr1_v)
757
+ # bitwise-and two single values together
758
+ r = MultiValues(expr0_v & expr1_v)
754
759
  elif expr0_v is None and expr1_v is not None:
755
760
  # bitwise-and a single value with a multivalue
756
761
  if expr0.count() == 1 and 0 in expr0:
@@ -771,7 +776,7 @@ class SimEngineRDVEX(
771
776
  return r
772
777
 
773
778
  @binop_handler
774
- def _handle_binop_Xor(self, expr):
779
+ def _handle_binop_Xor(self, expr: pyvex.expr.Binop) -> MultiValues:
775
780
  expr0, expr1 = self._expr_bv(expr.args[0]), self._expr_bv(expr.args[1])
776
781
  bits = expr.result_size(self.tyenv)
777
782
 
@@ -803,7 +808,7 @@ class SimEngineRDVEX(
803
808
  return r
804
809
 
805
810
  @binop_handler
806
- def _handle_binop_Or(self, expr):
811
+ def _handle_binop_Or(self, expr: pyvex.expr.Binop) -> MultiValues:
807
812
  expr0, expr1 = self._expr_bv(expr.args[0]), self._expr_bv(expr.args[1])
808
813
  bits = expr.result_size(self.tyenv)
809
814
 
@@ -834,7 +839,7 @@ class SimEngineRDVEX(
834
839
  return r
835
840
 
836
841
  @binop_handler
837
- def _handle_binop_Sar(self, expr):
842
+ def _handle_binop_Sar(self, expr: pyvex.expr.Binop) -> MultiValues:
838
843
  expr0, expr1 = self._expr_bv(expr.args[0]), self._expr_bv(expr.args[1])
839
844
  bits = expr.result_size(self.tyenv)
840
845
 
@@ -877,7 +882,7 @@ class SimEngineRDVEX(
877
882
  return r
878
883
 
879
884
  @binop_handler
880
- def _handle_binop_Shr(self, expr):
885
+ def _handle_binop_Shr(self, expr: pyvex.expr.Binop) -> MultiValues:
881
886
  expr0, expr1 = self._expr_bv(expr.args[0]), self._expr_bv(expr.args[1])
882
887
  bits = expr.result_size(self.tyenv)
883
888
 
@@ -918,7 +923,7 @@ class SimEngineRDVEX(
918
923
  return r
919
924
 
920
925
  @binop_handler
921
- def _handle_binop_Shl(self, expr):
926
+ def _handle_binop_Shl(self, expr: pyvex.expr.Binop) -> MultiValues:
922
927
  expr0, expr1 = self._expr(expr.args[0]), self._expr(expr.args[1])
923
928
  bits = expr.result_size(self.tyenv)
924
929
 
@@ -956,7 +961,7 @@ class SimEngineRDVEX(
956
961
  return r
957
962
 
958
963
  @binop_handler
959
- def _handle_binop_CmpEQ(self, expr):
964
+ def _handle_binop_CmpEQ(self, expr: pyvex.expr.Binop) -> MultiValues:
960
965
  arg0, arg1 = expr.args
961
966
  expr_0 = self._expr(arg0)
962
967
  expr_1 = self._expr(arg1)
@@ -974,7 +979,7 @@ class SimEngineRDVEX(
974
979
  return MultiValues(self.state.top(1))
975
980
 
976
981
  @binop_handler
977
- def _handle_binop_CmpNE(self, expr):
982
+ def _handle_binop_CmpNE(self, expr: pyvex.expr.Binop) -> MultiValues:
978
983
  arg0, arg1 = expr.args
979
984
  expr_0 = self._expr(arg0)
980
985
  expr_1 = self._expr(arg1)
@@ -989,7 +994,7 @@ class SimEngineRDVEX(
989
994
  return MultiValues(self.state.top(1))
990
995
 
991
996
  @binop_handler
992
- def _handle_binop_CmpLT(self, expr):
997
+ def _handle_binop_CmpLT(self, expr: pyvex.expr.Binop) -> MultiValues:
993
998
  arg0, arg1 = expr.args
994
999
  expr_0, expr_1 = self._expr_pair(arg0, arg1)
995
1000
 
@@ -1004,7 +1009,7 @@ class SimEngineRDVEX(
1004
1009
  return MultiValues(self.state.top(1))
1005
1010
 
1006
1011
  @binop_handler
1007
- def _handle_binop_CmpLE(self, expr):
1012
+ def _handle_binop_CmpLE(self, expr: pyvex.expr.Binop) -> MultiValues:
1008
1013
  arg0, arg1 = expr.args
1009
1014
  expr_0, expr_1 = self._expr_pair(arg0, arg1)
1010
1015
 
@@ -1019,7 +1024,7 @@ class SimEngineRDVEX(
1019
1024
  return MultiValues(self.state.top(1))
1020
1025
 
1021
1026
  @binop_handler
1022
- def _handle_binop_CmpGT(self, expr):
1027
+ def _handle_binop_CmpGT(self, expr: pyvex.expr.Binop) -> MultiValues:
1023
1028
  arg0, arg1 = expr.args
1024
1029
  expr_0, expr_1 = self._expr_pair(arg0, arg1)
1025
1030
 
@@ -1034,7 +1039,7 @@ class SimEngineRDVEX(
1034
1039
  return MultiValues(self.state.top(1))
1035
1040
 
1036
1041
  @binop_handler
1037
- def _handle_binop_CmpGE(self, expr):
1042
+ def _handle_binop_CmpGE(self, expr: pyvex.expr.Binop) -> MultiValues:
1038
1043
  arg0, arg1 = expr.args
1039
1044
  expr_0, expr_1 = self._expr_pair(arg0, arg1)
1040
1045
 
@@ -1050,7 +1055,7 @@ class SimEngineRDVEX(
1050
1055
 
1051
1056
  # ppc only
1052
1057
  @binop_handler
1053
- def _handle_binop_CmpORD(self, expr):
1058
+ def _handle_binop_CmpORD(self, expr: pyvex.expr.Binop) -> MultiValues:
1054
1059
  arg0, arg1 = expr.args
1055
1060
  expr_0, expr_1 = self._expr_pair(arg0, arg1)
1056
1061
 
@@ -16,7 +16,6 @@ from angr.calling_conventions import SimCC
16
16
  from angr.sim_type import SimTypeFunction
17
17
  from angr.knowledge_plugins.key_definitions.definition import Definition
18
18
  from angr.knowledge_plugins.functions import Function
19
- from angr.analyses.reaching_definitions.dep_graph import FunctionCallRelationships
20
19
  from angr.code_location import CodeLocation, ExternalCodeLocation
21
20
  from angr.knowledge_plugins.key_definitions.constants import ObservationPointType
22
21
  from angr import SIM_LIBRARIES, SIM_TYPE_COLLECTIONS
@@ -246,7 +245,7 @@ class FunctionCallDataUnwrapped(FunctionCallData):
246
245
  @staticmethod
247
246
  @wraps
248
247
  def decorate(
249
- f: Callable[[FunctionHandler, ReachingDefinitionsState, FunctionCallDataUnwrapped], None]
248
+ f: Callable[[FunctionHandler, ReachingDefinitionsState, FunctionCallDataUnwrapped], None],
250
249
  ) -> Callable[[FunctionHandler, ReachingDefinitionsState, FunctionCallData], None]:
251
250
  """
252
251
  Decorate a function handler method with this to make it take a FunctionCallDataUnwrapped instead of a
@@ -263,6 +262,20 @@ def _mk_wrapper(func, iself):
263
262
  return lambda *args, **kwargs: func(iself, *args, **kwargs)
264
263
 
265
264
 
265
+ @dataclass
266
+ class FunctionCallRelationships:
267
+ """
268
+ Produced by the function handler, provides associated callsite info and function input/output definitions.
269
+ """
270
+
271
+ callsite: CodeLocation
272
+ target: int | None
273
+ args_defns: list[set[Definition]]
274
+ other_input_defns: set[Definition]
275
+ ret_defns: set[Definition]
276
+ other_output_defns: set[Definition]
277
+
278
+
266
279
  # pylint: disable=unused-argument, no-self-use
267
280
  class FunctionHandler:
268
281
  """
@@ -1,5 +1,5 @@
1
1
  from __future__ import annotations
2
- from typing import Any, TYPE_CHECKING, cast, overload
2
+ from typing import Any, TYPE_CHECKING, overload
3
3
  from collections.abc import Iterable, Iterator
4
4
  import logging
5
5
  from typing_extensions import Self
@@ -7,7 +7,6 @@ from typing_extensions import Self
7
7
  import archinfo
8
8
  import claripy
9
9
 
10
- from angr.misc.ux import deprecated
11
10
  from angr.knowledge_plugins.key_definitions.environment import Environment
12
11
  from angr.knowledge_plugins.key_definitions.tag import Tag
13
12
  from angr.knowledge_plugins.key_definitions.heap_address import HeapAddress
@@ -541,41 +540,6 @@ class ReachingDefinitionsState:
541
540
  self.all_definitions = set()
542
541
  self.live_definitions.reset_uses()
543
542
 
544
- @deprecated("deref")
545
- def pointer_to_atoms(self, pointer: MultiValues, size: int, endness: str) -> set[MemoryLocation]:
546
- """
547
- Given a MultiValues, return the set of atoms that loading or storing to the pointer with that value
548
- could define or use.
549
- """
550
- result = set()
551
- for vs in pointer.values():
552
- for value in vs:
553
- atom = self.pointer_to_atom(value, size, endness)
554
- if atom is not None:
555
- result.add(atom)
556
-
557
- return result
558
-
559
- @deprecated("deref")
560
- def pointer_to_atom(self, value: claripy.ast.BV, size: int, endness: str) -> MemoryLocation | None:
561
- if self.is_top(value):
562
- return None
563
-
564
- stack_offset = self.get_stack_offset(value)
565
- if stack_offset is not None:
566
- addr = SpOffset(len(value), stack_offset)
567
- else:
568
- heap_offset = self.get_heap_offset(value)
569
- if heap_offset is not None:
570
- addr = HeapAddress(heap_offset)
571
- elif value.op == "BVV":
572
- addr = cast(int, value.args[0])
573
- else:
574
- # cannot resolve
575
- return None
576
-
577
- return MemoryLocation(addr, size, endness)
578
-
579
543
  @overload
580
544
  def deref(
581
545
  self,
@@ -16,7 +16,6 @@ from angr.knowledge_plugins.functions import Function
16
16
  from angr.knowledge_plugins.key_definitions import ReachingDefinitionsModel, LiveDefinitions
17
17
  from angr.knowledge_plugins.key_definitions.constants import OP_BEFORE, OP_AFTER, ObservationPointType, ObservationPoint
18
18
  from angr.code_location import CodeLocation, ExternalCodeLocation
19
- from angr.misc.ux import deprecated
20
19
  from angr.analyses.forward_analysis.visitors.graph import NodeType
21
20
  from angr.analyses.analysis import Analysis
22
21
  from .engine_ail import SimEngineRDAIL
@@ -50,13 +49,13 @@ class ReachingDefinitionsAnalysis(
50
49
 
51
50
  def __init__(
52
51
  self,
53
- subject: Subject | ailment.Block | Block | Function | str = None,
52
+ subject: Subject | ailment.Block | Block | Function | str,
54
53
  func_graph=None,
55
54
  max_iterations=30,
56
55
  track_tmps=False,
57
56
  track_consts=True,
58
57
  observation_points: Iterable[ObservationPoint] | None = None,
59
- init_state: ReachingDefinitionsState = None,
58
+ init_state: ReachingDefinitionsState | None = None,
60
59
  init_context=None,
61
60
  state_initializer: RDAStateInitializer | None = None,
62
61
  cc=None,
@@ -242,10 +241,6 @@ class ReachingDefinitionsAnalysis(
242
241
  def visited_blocks(self):
243
242
  return self._visited_blocks
244
243
 
245
- @deprecated(replacement="get_reaching_definitions_by_insn")
246
- def get_reaching_definitions(self, ins_addr, op_type):
247
- return self.get_reaching_definitions_by_insn(ins_addr, op_type)
248
-
249
244
  def get_reaching_definitions_by_insn(self, ins_addr, op_type):
250
245
  key = "insn", ins_addr, op_type
251
246
  if key not in self.observed_results:
@@ -280,29 +275,22 @@ class ReachingDefinitionsAnalysis(
280
275
  :param node_idx: ID of the node. Used in AIL to differentiate blocks with the same address.
281
276
  """
282
277
 
283
- key = None
284
-
278
+ key: ObservationPoint | None = None
285
279
  observe = False
286
280
 
287
281
  if self._observe_all:
288
282
  observe = True
289
- key: ObservationPoint = (
290
- ("node", node_addr, op_type) if node_idx is None else ("node", (node_addr, node_idx), op_type)
291
- )
283
+ key = ("node", node_addr, op_type) if node_idx is None else ("node", (node_addr, node_idx), op_type)
292
284
  elif self._observation_points is not None:
293
- key: ObservationPoint = (
294
- ("node", node_addr, op_type) if node_idx is None else ("node", (node_addr, node_idx), op_type)
295
- )
285
+ key = ("node", node_addr, op_type) if node_idx is None else ("node", (node_addr, node_idx), op_type)
296
286
  if key in self._observation_points:
297
287
  observe = True
298
288
  elif self._observe_callback is not None:
299
289
  observe = self._observe_callback("node", addr=node_addr, state=state, op_type=op_type, node_idx=node_idx)
300
290
  if observe:
301
- key: ObservationPoint = (
302
- ("node", node_addr, op_type) if node_idx is None else ("node", (node_addr, node_idx), op_type)
303
- )
291
+ key = ("node", node_addr, op_type) if node_idx is None else ("node", (node_addr, node_idx), op_type)
304
292
 
305
- if observe:
293
+ if observe and key:
306
294
  self.observed_results[key] = state.live_definitions
307
295
 
308
296
  def insn_observe(
@@ -321,14 +309,14 @@ class ReachingDefinitionsAnalysis(
321
309
  :param op_type: Type of the observation point. Must be one of the following: OP_BEORE, OP_AFTER.
322
310
  """
323
311
 
324
- key = None
312
+ key: ObservationPoint | None = None
325
313
  observe = False
326
314
 
327
315
  if self._observe_all:
328
316
  observe = True
329
- key: ObservationPoint = ("insn", insn_addr, op_type)
317
+ key = ("insn", insn_addr, op_type)
330
318
  elif self._observation_points is not None:
331
- key: ObservationPoint = ("insn", insn_addr, op_type)
319
+ key = ("insn", insn_addr, op_type)
332
320
  if key in self._observation_points:
333
321
  observe = True
334
322
  elif self._observe_callback is not None:
@@ -336,9 +324,9 @@ class ReachingDefinitionsAnalysis(
336
324
  "insn", addr=insn_addr, stmt=stmt, block=block, state=state, op_type=op_type
337
325
  )
338
326
  if observe:
339
- key: ObservationPoint = ("insn", insn_addr, op_type)
327
+ key = ("insn", insn_addr, op_type)
340
328
 
341
- if not observe:
329
+ if not (observe and key):
342
330
  return
343
331
 
344
332
  if isinstance(stmt, pyvex.stmt.IRStmt):
@@ -533,6 +521,7 @@ class ReachingDefinitionsAnalysis(
533
521
  ]
534
522
  if node.addr == self.subject.content.addr:
535
523
  node_parents += [ExternalCodeLocation()]
524
+ assert block is not None
536
525
  self.model.at_new_block(
537
526
  CodeLocation(block.addr, 0, block_idx=block.idx if isinstance(block, ailment.Block) else None),
538
527
  node_parents,