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.
- angr/__init__.py +1 -1
- angr/analyses/analysis.py +7 -6
- angr/analyses/calling_convention.py +33 -35
- angr/analyses/cdg.py +2 -4
- angr/analyses/cfg/cfb.py +4 -3
- angr/analyses/cfg/cfg_base.py +14 -14
- angr/analyses/cfg/cfg_emulated.py +3 -4
- angr/analyses/cfg/cfg_fast.py +46 -46
- angr/analyses/cfg/cfg_fast_soot.py +1 -2
- angr/analyses/cfg/cfg_job_base.py +2 -2
- angr/analyses/cfg/indirect_jump_resolvers/jumptable.py +14 -13
- angr/analyses/cfg/indirect_jump_resolvers/mips_elf_fast.py +5 -5
- angr/analyses/cfg_slice_to_sink/cfg_slice_to_sink.py +3 -3
- angr/analyses/complete_calling_conventions.py +13 -12
- angr/analyses/data_dep/data_dependency_analysis.py +24 -24
- angr/analyses/data_dep/dep_nodes.py +3 -3
- angr/analyses/ddg.py +1 -2
- angr/analyses/decompiler/ail_simplifier.py +35 -34
- angr/analyses/decompiler/block_io_finder.py +20 -20
- angr/analyses/decompiler/block_similarity.py +4 -6
- angr/analyses/decompiler/block_simplifier.py +17 -16
- angr/analyses/decompiler/callsite_maker.py +25 -10
- angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py +1 -3
- angr/analyses/decompiler/ccall_rewriters/rewriter_base.py +2 -4
- angr/analyses/decompiler/clinic.py +250 -45
- angr/analyses/decompiler/condition_processor.py +15 -8
- angr/analyses/decompiler/decompilation_cache.py +7 -7
- angr/analyses/decompiler/decompilation_options.py +4 -4
- angr/analyses/decompiler/decompiler.py +19 -15
- angr/analyses/decompiler/expression_counters.py +10 -9
- angr/analyses/decompiler/goto_manager.py +2 -4
- angr/analyses/decompiler/graph_region.py +9 -9
- angr/analyses/decompiler/jump_target_collector.py +1 -2
- angr/analyses/decompiler/optimization_passes/__init__.py +4 -3
- angr/analyses/decompiler/optimization_passes/code_motion.py +5 -6
- angr/analyses/decompiler/optimization_passes/const_derefs.py +4 -4
- angr/analyses/decompiler/optimization_passes/deadblock_remover.py +73 -0
- angr/analyses/decompiler/optimization_passes/engine_base.py +25 -3
- angr/analyses/decompiler/optimization_passes/expr_op_swapper.py +6 -5
- angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py +2 -2
- angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py +3 -0
- angr/analyses/decompiler/optimization_passes/ite_expr_converter.py +2 -2
- angr/analyses/decompiler/optimization_passes/lowered_switch_simplifier.py +17 -17
- angr/analyses/decompiler/optimization_passes/optimization_pass.py +12 -13
- angr/analyses/decompiler/optimization_passes/register_save_area_simplifier.py +25 -21
- angr/analyses/decompiler/optimization_passes/ret_addr_save_simplifier.py +3 -3
- angr/analyses/decompiler/optimization_passes/ret_deduplicator.py +1 -2
- angr/analyses/decompiler/optimization_passes/return_duplicator_base.py +7 -7
- angr/analyses/decompiler/optimization_passes/spilled_register_finder.py +18 -0
- angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py +2 -3
- angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py +1 -2
- angr/analyses/decompiler/optimization_passes/x86_gcc_getpc_simplifier.py +2 -2
- angr/analyses/decompiler/peephole_optimizations/__init__.py +4 -3
- angr/analyses/decompiler/peephole_optimizations/base.py +13 -15
- angr/analyses/decompiler/peephole_optimizations/bswap.py +1 -3
- angr/analyses/decompiler/peephole_optimizations/cmpord_rewriter.py +72 -0
- angr/analyses/decompiler/peephole_optimizations/const_mull_a_shift.py +1 -2
- angr/analyses/decompiler/peephole_optimizations/eager_eval.py +1 -1
- angr/analyses/decompiler/peephole_optimizations/inlined_strcpy.py +5 -10
- angr/analyses/decompiler/peephole_optimizations/inlined_strcpy_consolidation.py +3 -4
- angr/analyses/decompiler/peephole_optimizations/inlined_wstrcpy.py +7 -10
- angr/analyses/decompiler/peephole_optimizations/rewrite_bit_extractions.py +2 -3
- angr/analyses/decompiler/peephole_optimizations/sar_to_signed_div.py +1 -2
- angr/analyses/decompiler/peephole_optimizations/tidy_stack_addr.py +4 -4
- angr/analyses/decompiler/redundant_label_remover.py +4 -5
- angr/analyses/decompiler/region_identifier.py +4 -5
- angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py +1 -2
- angr/analyses/decompiler/region_simplifiers/expr_folding.py +19 -20
- angr/analyses/decompiler/region_simplifiers/goto.py +2 -3
- angr/analyses/decompiler/region_simplifiers/loop.py +1 -2
- angr/analyses/decompiler/region_simplifiers/node_address_finder.py +1 -2
- angr/analyses/decompiler/region_simplifiers/region_simplifier.py +1 -3
- angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py +19 -19
- angr/analyses/decompiler/return_maker.py +1 -2
- angr/analyses/decompiler/structured_codegen/base.py +5 -6
- angr/analyses/decompiler/structured_codegen/c.py +39 -38
- angr/analyses/decompiler/structuring/__init__.py +1 -1
- angr/analyses/decompiler/structuring/dream.py +17 -16
- angr/analyses/decompiler/structuring/phoenix.py +45 -46
- angr/analyses/decompiler/structuring/recursive_structurer.py +4 -4
- angr/analyses/decompiler/structuring/structurer_base.py +16 -15
- angr/analyses/decompiler/structuring/structurer_nodes.py +10 -9
- angr/analyses/decompiler/utils.py +17 -16
- angr/analyses/disassembly.py +7 -6
- angr/analyses/flirt.py +9 -9
- angr/analyses/forward_analysis/forward_analysis.py +15 -14
- angr/analyses/forward_analysis/visitors/function_graph.py +1 -2
- angr/analyses/forward_analysis/visitors/graph.py +16 -15
- angr/analyses/propagator/engine_ail.py +30 -26
- angr/analyses/propagator/outdated_definition_walker.py +8 -7
- angr/analyses/propagator/propagator.py +11 -13
- angr/analyses/proximity_graph.py +21 -21
- angr/analyses/reaching_definitions/__init__.py +3 -3
- angr/analyses/reaching_definitions/call_trace.py +3 -6
- angr/analyses/reaching_definitions/dep_graph.py +41 -48
- angr/analyses/reaching_definitions/engine_ail.py +11 -5
- angr/analyses/reaching_definitions/engine_vex.py +9 -8
- angr/analyses/reaching_definitions/function_handler.py +51 -34
- angr/analyses/reaching_definitions/heap_allocator.py +3 -4
- angr/analyses/reaching_definitions/rd_initializer.py +8 -8
- angr/analyses/reaching_definitions/rd_state.py +57 -58
- angr/analyses/reaching_definitions/reaching_definitions.py +18 -17
- angr/analyses/reaching_definitions/subject.py +2 -3
- angr/analyses/stack_pointer_tracker.py +15 -6
- angr/analyses/typehoon/dfa.py +4 -4
- angr/analyses/typehoon/simple_solver.py +48 -52
- angr/analyses/typehoon/translator.py +3 -6
- angr/analyses/typehoon/typeconsts.py +13 -14
- angr/analyses/typehoon/typehoon.py +9 -9
- angr/analyses/typehoon/typevars.py +18 -17
- angr/analyses/variable_recovery/engine_ail.py +5 -5
- angr/analyses/variable_recovery/engine_base.py +25 -21
- angr/analyses/variable_recovery/irsb_scanner.py +8 -9
- angr/analyses/variable_recovery/variable_recovery.py +1 -2
- angr/analyses/variable_recovery/variable_recovery_base.py +14 -13
- angr/analyses/variable_recovery/variable_recovery_fast.py +8 -8
- angr/analyses/veritesting.py +1 -2
- angr/analyses/vfg.py +57 -56
- angr/analyses/xrefs.py +1 -2
- angr/angrdb/db.py +7 -7
- angr/angrdb/serializers/kb.py +16 -13
- angr/angrdb/serializers/loader.py +1 -2
- angr/angrdb/serializers/structured_code.py +2 -2
- angr/annocfg.py +1 -2
- angr/block.py +16 -6
- angr/calling_conventions.py +27 -27
- angr/code_location.py +8 -8
- angr/codenode.py +1 -2
- angr/concretization_strategies/max.py +1 -3
- angr/distributed/server.py +1 -3
- angr/distributed/worker.py +1 -2
- angr/engines/engine.py +2 -3
- angr/engines/light/engine.py +4 -4
- angr/engines/pcode/behavior.py +20 -2
- angr/engines/pcode/emulate.py +1 -1
- angr/engines/pcode/engine.py +7 -7
- angr/engines/pcode/lifter.py +78 -77
- angr/engines/vex/claripy/ccall.py +1 -2
- angr/engines/vex/claripy/datalayer.py +1 -2
- angr/engines/vex/light/light.py +1 -2
- angr/exploration_techniques/tracer.py +4 -4
- angr/factory.py +12 -15
- angr/flirt/__init__.py +8 -8
- angr/flirt/build_sig.py +2 -3
- angr/keyed_region.py +2 -2
- angr/knowledge_base/knowledge_base.py +3 -3
- angr/knowledge_plugins/callsite_prototypes.py +4 -6
- angr/knowledge_plugins/cfg/cfg_manager.py +19 -6
- angr/knowledge_plugins/cfg/cfg_model.py +26 -27
- angr/knowledge_plugins/cfg/cfg_node.py +2 -2
- angr/knowledge_plugins/cfg/indirect_jump.py +6 -8
- angr/knowledge_plugins/cfg/memory_data.py +8 -9
- angr/knowledge_plugins/custom_strings.py +1 -3
- angr/knowledge_plugins/debug_variables.py +2 -2
- angr/knowledge_plugins/functions/function.py +21 -22
- angr/knowledge_plugins/functions/function_manager.py +5 -5
- angr/knowledge_plugins/indirect_jumps.py +1 -3
- angr/knowledge_plugins/key_definitions/atoms.py +7 -7
- angr/knowledge_plugins/key_definitions/definition.py +14 -14
- angr/knowledge_plugins/key_definitions/environment.py +5 -7
- angr/knowledge_plugins/key_definitions/heap_address.py +1 -3
- angr/knowledge_plugins/key_definitions/key_definition_manager.py +3 -2
- angr/knowledge_plugins/key_definitions/live_definitions.py +60 -59
- angr/knowledge_plugins/key_definitions/liveness.py +16 -16
- angr/knowledge_plugins/key_definitions/rd_model.py +15 -15
- angr/knowledge_plugins/key_definitions/uses.py +11 -11
- angr/knowledge_plugins/patches.py +4 -8
- angr/knowledge_plugins/propagations/prop_value.py +10 -9
- angr/knowledge_plugins/propagations/propagation_manager.py +3 -5
- angr/knowledge_plugins/propagations/propagation_model.py +9 -9
- angr/knowledge_plugins/propagations/states.py +52 -22
- angr/knowledge_plugins/structured_code/manager.py +2 -2
- angr/knowledge_plugins/sync/sync_controller.py +3 -3
- angr/knowledge_plugins/variables/variable_access.py +4 -4
- angr/knowledge_plugins/variables/variable_manager.py +39 -39
- angr/knowledge_plugins/xrefs/xref.py +9 -11
- angr/knowledge_plugins/xrefs/xref_manager.py +3 -4
- angr/lib/angr_native.dll +0 -0
- angr/misc/ansi.py +1 -2
- angr/misc/autoimport.py +3 -3
- angr/misc/plugins.py +9 -9
- angr/procedures/definitions/__init__.py +16 -16
- angr/procedures/definitions/linux_kernel.py +1 -1
- angr/procedures/definitions/parse_win32json.py +1 -1
- angr/procedures/java_jni/__init__.py +1 -1
- angr/procedures/java_jni/array_operations.py +1 -2
- angr/procedures/java_jni/method_calls.py +1 -2
- angr/procedures/posix/inet_ntoa.py +1 -2
- angr/procedures/stubs/format_parser.py +3 -3
- angr/project.py +13 -11
- angr/sim_manager.py +12 -12
- angr/sim_procedure.py +7 -3
- angr/sim_state.py +2 -2
- angr/sim_type.py +60 -45
- angr/sim_variable.py +5 -5
- angr/simos/simos.py +1 -2
- angr/simos/userland.py +1 -2
- angr/state_plugins/callstack.py +3 -2
- angr/state_plugins/history.py +1 -2
- angr/state_plugins/solver.py +34 -34
- angr/storage/memory_mixins/__init__.py +4 -3
- angr/storage/memory_mixins/actions_mixin.py +1 -3
- angr/storage/memory_mixins/address_concretization_mixin.py +1 -3
- angr/storage/memory_mixins/convenient_mappings_mixin.py +3 -4
- angr/storage/memory_mixins/default_filler_mixin.py +1 -1
- angr/storage/memory_mixins/label_merger_mixin.py +2 -2
- angr/storage/memory_mixins/multi_value_merger_mixin.py +4 -3
- angr/storage/memory_mixins/paged_memory/page_backer_mixins.py +9 -8
- angr/storage/memory_mixins/paged_memory/paged_memory_mixin.py +12 -11
- angr/storage/memory_mixins/paged_memory/pages/cooperation.py +8 -8
- angr/storage/memory_mixins/paged_memory/pages/history_tracking_mixin.py +2 -3
- angr/storage/memory_mixins/paged_memory/pages/list_page.py +10 -11
- angr/storage/memory_mixins/paged_memory/pages/multi_values.py +11 -10
- angr/storage/memory_mixins/paged_memory/pages/mv_list_page.py +18 -17
- angr/storage/memory_mixins/paged_memory/pages/ultra_page.py +12 -11
- angr/storage/memory_mixins/regioned_memory/abstract_address_descriptor.py +3 -3
- angr/storage/memory_mixins/regioned_memory/abstract_merger_mixin.py +3 -2
- angr/storage/memory_mixins/regioned_memory/region_data.py +1 -2
- angr/storage/memory_mixins/regioned_memory/region_meta_mixin.py +2 -2
- angr/storage/memory_mixins/regioned_memory/regioned_address_concretization_mixin.py +3 -3
- angr/storage/memory_mixins/regioned_memory/regioned_memory_mixin.py +18 -21
- angr/storage/memory_mixins/size_resolution_mixin.py +1 -2
- angr/storage/memory_mixins/symbolic_merger_mixin.py +3 -2
- angr/storage/memory_mixins/top_merger_mixin.py +3 -2
- angr/storage/memory_object.py +2 -4
- angr/utils/algo.py +3 -2
- angr/utils/dynamic_dictlist.py +5 -5
- angr/utils/formatting.py +4 -4
- angr/utils/funcid.py +1 -2
- angr/utils/graph.py +5 -6
- angr/utils/library.py +5 -5
- angr/utils/mp.py +5 -4
- angr/utils/segment_list.py +3 -4
- angr/utils/typing.py +3 -2
- {angr-9.2.102.dist-info → angr-9.2.103.dist-info}/METADATA +9 -11
- {angr-9.2.102.dist-info → angr-9.2.103.dist-info}/RECORD +240 -237
- {angr-9.2.102.dist-info → angr-9.2.103.dist-info}/LICENSE +0 -0
- {angr-9.2.102.dist-info → angr-9.2.103.dist-info}/WHEEL +0 -0
- {angr-9.2.102.dist-info → angr-9.2.103.dist-info}/entry_points.txt +0 -0
- {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
|
|
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:
|
|
23
|
-
_values:
|
|
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,
|
|
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) ->
|
|
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) ->
|
|
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) ->
|
|
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[
|
|
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[
|
|
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) ->
|
|
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
|
|
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[
|
|
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:
|
|
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[
|
|
40
|
+
self.content: DynamicDictList[_MOTYPE | set[_MOTYPE] | None] = DynamicDictList(
|
|
40
41
|
max_size=memory.page_size
|
|
41
42
|
)
|
|
42
43
|
|
|
43
|
-
self.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
|
-
) ->
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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) ->
|
|
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) ->
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
224
|
-
concretes:
|
|
225
|
-
unconstrained_in:
|
|
226
|
-
our_mo:
|
|
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) ->
|
|
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:
|
|
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) ->
|
|
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
|
|
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:
|
|
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[
|
|
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
|
|
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[
|
|
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:
|
|
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
|
|
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:
|
|
24
|
+
self.alocs: dict[tuple[Any, int], AbstractLocation] = {}
|
|
25
25
|
|
|
26
26
|
self._is_stack = None
|
|
27
27
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from
|
|
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:
|
|
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:
|
|
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
|
|
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:
|
|
49
|
-
generic_region_map:
|
|
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:
|
|
53
|
-
regioned_memory_cls:
|
|
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:
|
|
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:
|
|
71
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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[
|
|
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
|
|
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[
|
|
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
|
|
angr/storage/memory_object.py
CHANGED
|
@@ -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:
|
|
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) ->
|
|
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
|
|
1
|
+
from typing import Any
|
|
2
|
+
from collections.abc import Callable
|
|
2
3
|
|
|
3
4
|
|
|
4
|
-
def binary_insert(lst:
|
|
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
|
|
angr/utils/dynamic_dictlist.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import platform
|
|
2
|
-
from typing import
|
|
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:
|
|
30
|
-
content:
|
|
29
|
+
max_size: int | None = None,
|
|
30
|
+
content: Union["DynamicDictList", dict[int, VT], list[VT]] | None = None,
|
|
31
31
|
):
|
|
32
|
-
self.list_content:
|
|
33
|
-
self.dict_content:
|
|
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
|
|
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:
|
|
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:
|
|
65
|
+
formatter: Callable[[str], str] | None = None,
|
|
66
66
|
dashed: bool = False,
|
|
67
|
-
ascii_only:
|
|
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:
|
|
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
|