angr 9.2.192__cp311-cp311-macosx_10_12_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.
- angr/__init__.py +366 -0
- angr/__main__.py +182 -0
- angr/ail_callable.py +79 -0
- angr/ailment/__init__.py +83 -0
- angr/ailment/block.py +88 -0
- angr/ailment/block_walker.py +856 -0
- angr/ailment/constant.py +3 -0
- angr/ailment/converter_common.py +11 -0
- angr/ailment/converter_pcode.py +648 -0
- angr/ailment/converter_vex.py +829 -0
- angr/ailment/expression.py +1655 -0
- angr/ailment/manager.py +34 -0
- angr/ailment/statement.py +973 -0
- angr/ailment/tagged_object.py +58 -0
- angr/ailment/utils.py +114 -0
- angr/analyses/__init__.py +117 -0
- angr/analyses/analysis.py +429 -0
- angr/analyses/backward_slice.py +686 -0
- angr/analyses/binary_optimizer.py +670 -0
- angr/analyses/bindiff.py +1512 -0
- angr/analyses/boyscout.py +76 -0
- angr/analyses/callee_cleanup_finder.py +74 -0
- angr/analyses/calling_convention/__init__.py +6 -0
- angr/analyses/calling_convention/calling_convention.py +1113 -0
- angr/analyses/calling_convention/fact_collector.py +647 -0
- angr/analyses/calling_convention/utils.py +60 -0
- angr/analyses/cdg.py +189 -0
- angr/analyses/cfg/__init__.py +23 -0
- angr/analyses/cfg/cfb.py +451 -0
- angr/analyses/cfg/cfg.py +74 -0
- angr/analyses/cfg/cfg_arch_options.py +95 -0
- angr/analyses/cfg/cfg_base.py +2954 -0
- angr/analyses/cfg/cfg_emulated.py +3451 -0
- angr/analyses/cfg/cfg_fast.py +5431 -0
- angr/analyses/cfg/cfg_fast_soot.py +662 -0
- angr/analyses/cfg/cfg_job_base.py +203 -0
- angr/analyses/cfg/indirect_jump_resolvers/__init__.py +30 -0
- angr/analyses/cfg/indirect_jump_resolvers/aarch64_macho_got.py +77 -0
- angr/analyses/cfg/indirect_jump_resolvers/amd64_elf_got.py +62 -0
- angr/analyses/cfg/indirect_jump_resolvers/amd64_pe_iat.py +51 -0
- angr/analyses/cfg/indirect_jump_resolvers/arm_elf_fast.py +159 -0
- angr/analyses/cfg/indirect_jump_resolvers/const_resolver.py +339 -0
- angr/analyses/cfg/indirect_jump_resolvers/constant_value_manager.py +107 -0
- angr/analyses/cfg/indirect_jump_resolvers/default_resolvers.py +82 -0
- angr/analyses/cfg/indirect_jump_resolvers/jumptable.py +2490 -0
- angr/analyses/cfg/indirect_jump_resolvers/memload_resolver.py +81 -0
- angr/analyses/cfg/indirect_jump_resolvers/mips_elf_fast.py +286 -0
- angr/analyses/cfg/indirect_jump_resolvers/mips_elf_got.py +148 -0
- angr/analyses/cfg/indirect_jump_resolvers/propagator_utils.py +46 -0
- angr/analyses/cfg/indirect_jump_resolvers/resolver.py +74 -0
- angr/analyses/cfg/indirect_jump_resolvers/syscall_resolver.py +92 -0
- angr/analyses/cfg/indirect_jump_resolvers/x86_elf_pic_plt.py +88 -0
- angr/analyses/cfg/indirect_jump_resolvers/x86_pe_iat.py +47 -0
- angr/analyses/cfg_slice_to_sink/__init__.py +11 -0
- angr/analyses/cfg_slice_to_sink/cfg_slice_to_sink.py +117 -0
- angr/analyses/cfg_slice_to_sink/graph.py +87 -0
- angr/analyses/cfg_slice_to_sink/transitions.py +27 -0
- angr/analyses/class_identifier.py +63 -0
- angr/analyses/code_tagging.py +123 -0
- angr/analyses/codecave.py +77 -0
- angr/analyses/complete_calling_conventions.py +475 -0
- angr/analyses/congruency_check.py +377 -0
- angr/analyses/data_dep/__init__.py +16 -0
- angr/analyses/data_dep/data_dependency_analysis.py +595 -0
- angr/analyses/data_dep/dep_nodes.py +171 -0
- angr/analyses/data_dep/sim_act_location.py +49 -0
- angr/analyses/datagraph_meta.py +105 -0
- angr/analyses/ddg.py +1670 -0
- angr/analyses/decompiler/__init__.py +41 -0
- angr/analyses/decompiler/ail_simplifier.py +2246 -0
- angr/analyses/decompiler/ailgraph_walker.py +49 -0
- angr/analyses/decompiler/block_io_finder.py +302 -0
- angr/analyses/decompiler/block_similarity.py +199 -0
- angr/analyses/decompiler/block_simplifier.py +397 -0
- angr/analyses/decompiler/callsite_maker.py +579 -0
- angr/analyses/decompiler/ccall_rewriters/__init__.py +9 -0
- angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py +618 -0
- angr/analyses/decompiler/ccall_rewriters/rewriter_base.py +24 -0
- angr/analyses/decompiler/ccall_rewriters/x86_ccalls.py +354 -0
- angr/analyses/decompiler/clinic.py +3662 -0
- angr/analyses/decompiler/condition_processor.py +1323 -0
- angr/analyses/decompiler/counters/__init__.py +16 -0
- angr/analyses/decompiler/counters/boolean_counter.py +27 -0
- angr/analyses/decompiler/counters/call_counter.py +77 -0
- angr/analyses/decompiler/counters/expression_counters.py +77 -0
- angr/analyses/decompiler/counters/seq_cf_structure_counter.py +63 -0
- angr/analyses/decompiler/decompilation_cache.py +54 -0
- angr/analyses/decompiler/decompilation_options.py +317 -0
- angr/analyses/decompiler/decompiler.py +796 -0
- angr/analyses/decompiler/dephication/__init__.py +6 -0
- angr/analyses/decompiler/dephication/dephication_base.py +100 -0
- angr/analyses/decompiler/dephication/graph_dephication.py +70 -0
- angr/analyses/decompiler/dephication/graph_rewriting.py +112 -0
- angr/analyses/decompiler/dephication/graph_vvar_mapping.py +357 -0
- angr/analyses/decompiler/dephication/rewriting_engine.py +528 -0
- angr/analyses/decompiler/dephication/seqnode_dephication.py +156 -0
- angr/analyses/decompiler/dirty_rewriters/__init__.py +7 -0
- angr/analyses/decompiler/dirty_rewriters/amd64_dirty.py +74 -0
- angr/analyses/decompiler/dirty_rewriters/rewriter_base.py +27 -0
- angr/analyses/decompiler/empty_node_remover.py +212 -0
- angr/analyses/decompiler/expression_narrower.py +290 -0
- angr/analyses/decompiler/goto_manager.py +112 -0
- angr/analyses/decompiler/graph_region.py +441 -0
- angr/analyses/decompiler/jump_target_collector.py +37 -0
- angr/analyses/decompiler/jumptable_entry_condition_rewriter.py +67 -0
- angr/analyses/decompiler/label_collector.py +32 -0
- angr/analyses/decompiler/node_replacer.py +42 -0
- angr/analyses/decompiler/notes/__init__.py +9 -0
- angr/analyses/decompiler/notes/decompilation_note.py +48 -0
- angr/analyses/decompiler/notes/deobfuscated_strings.py +56 -0
- angr/analyses/decompiler/optimization_passes/__init__.py +164 -0
- angr/analyses/decompiler/optimization_passes/base_ptr_save_simplifier.py +157 -0
- angr/analyses/decompiler/optimization_passes/call_stmt_rewriter.py +46 -0
- angr/analyses/decompiler/optimization_passes/code_motion.py +362 -0
- angr/analyses/decompiler/optimization_passes/condition_constprop.py +211 -0
- angr/analyses/decompiler/optimization_passes/const_derefs.py +127 -0
- angr/analyses/decompiler/optimization_passes/const_prop_reverter.py +365 -0
- angr/analyses/decompiler/optimization_passes/cross_jump_reverter.py +106 -0
- angr/analyses/decompiler/optimization_passes/deadblock_remover.py +82 -0
- angr/analyses/decompiler/optimization_passes/determine_load_sizes.py +64 -0
- angr/analyses/decompiler/optimization_passes/div_simplifier.py +425 -0
- angr/analyses/decompiler/optimization_passes/duplication_reverter/__init__.py +5 -0
- angr/analyses/decompiler/optimization_passes/duplication_reverter/ail_merge_graph.py +503 -0
- angr/analyses/decompiler/optimization_passes/duplication_reverter/duplication_reverter.py +1221 -0
- angr/analyses/decompiler/optimization_passes/duplication_reverter/errors.py +16 -0
- angr/analyses/decompiler/optimization_passes/duplication_reverter/similarity.py +126 -0
- angr/analyses/decompiler/optimization_passes/duplication_reverter/utils.py +167 -0
- angr/analyses/decompiler/optimization_passes/eager_std_string_concatenation.py +236 -0
- angr/analyses/decompiler/optimization_passes/eager_std_string_eval.py +186 -0
- angr/analyses/decompiler/optimization_passes/engine_base.py +502 -0
- angr/analyses/decompiler/optimization_passes/expr_op_swapper.py +138 -0
- angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py +113 -0
- angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py +618 -0
- angr/analyses/decompiler/optimization_passes/inlined_strlen_simplifier.py +274 -0
- angr/analyses/decompiler/optimization_passes/ite_expr_converter.py +224 -0
- angr/analyses/decompiler/optimization_passes/ite_region_converter.py +337 -0
- angr/analyses/decompiler/optimization_passes/lowered_switch_simplifier.py +939 -0
- angr/analyses/decompiler/optimization_passes/mod_simplifier.py +99 -0
- angr/analyses/decompiler/optimization_passes/optimization_pass.py +710 -0
- angr/analyses/decompiler/optimization_passes/peephole_simplifier.py +75 -0
- angr/analyses/decompiler/optimization_passes/register_save_area_simplifier.py +263 -0
- angr/analyses/decompiler/optimization_passes/register_save_area_simplifier_adv.py +198 -0
- angr/analyses/decompiler/optimization_passes/ret_addr_save_simplifier.py +171 -0
- angr/analyses/decompiler/optimization_passes/ret_deduplicator.py +222 -0
- angr/analyses/decompiler/optimization_passes/return_duplicator_base.py +632 -0
- angr/analyses/decompiler/optimization_passes/return_duplicator_high.py +61 -0
- angr/analyses/decompiler/optimization_passes/return_duplicator_low.py +166 -0
- angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py +333 -0
- angr/analyses/decompiler/optimization_passes/static_vvar_rewriter.py +336 -0
- angr/analyses/decompiler/optimization_passes/switch_default_case_duplicator.py +166 -0
- angr/analyses/decompiler/optimization_passes/switch_reused_entry_rewriter.py +102 -0
- angr/analyses/decompiler/optimization_passes/tag_slicer.py +41 -0
- angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py +477 -0
- angr/analyses/decompiler/optimization_passes/x86_gcc_getpc_simplifier.py +88 -0
- angr/analyses/decompiler/peephole_optimizations/__init__.py +136 -0
- angr/analyses/decompiler/peephole_optimizations/a_div_const_add_a_mul_n_div_const.py +42 -0
- angr/analyses/decompiler/peephole_optimizations/a_mul_const_div_shr_const.py +38 -0
- angr/analyses/decompiler/peephole_optimizations/a_mul_const_sub_a.py +34 -0
- angr/analyses/decompiler/peephole_optimizations/a_shl_const_sub_a.py +34 -0
- angr/analyses/decompiler/peephole_optimizations/a_sub_a_div.py +25 -0
- angr/analyses/decompiler/peephole_optimizations/a_sub_a_shr_const_shr_const.py +37 -0
- angr/analyses/decompiler/peephole_optimizations/a_sub_a_sub_n.py +23 -0
- angr/analyses/decompiler/peephole_optimizations/arm_cmpf.py +236 -0
- angr/analyses/decompiler/peephole_optimizations/base.py +157 -0
- angr/analyses/decompiler/peephole_optimizations/basepointeroffset_add_n.py +34 -0
- angr/analyses/decompiler/peephole_optimizations/basepointeroffset_and_mask.py +36 -0
- angr/analyses/decompiler/peephole_optimizations/bitwise_or_to_logical_or.py +34 -0
- angr/analyses/decompiler/peephole_optimizations/bool_expr_xor_1.py +27 -0
- angr/analyses/decompiler/peephole_optimizations/bswap.py +142 -0
- angr/analyses/decompiler/peephole_optimizations/cas_intrinsics.py +182 -0
- angr/analyses/decompiler/peephole_optimizations/cmpord_rewriter.py +71 -0
- angr/analyses/decompiler/peephole_optimizations/coalesce_adjacent_shrs.py +39 -0
- angr/analyses/decompiler/peephole_optimizations/coalesce_same_cascading_ifs.py +28 -0
- angr/analyses/decompiler/peephole_optimizations/constant_derefs.py +44 -0
- angr/analyses/decompiler/peephole_optimizations/conv_a_sub0_shr_and.py +69 -0
- angr/analyses/decompiler/peephole_optimizations/conv_shl_shr.py +52 -0
- angr/analyses/decompiler/peephole_optimizations/eager_eval.py +436 -0
- angr/analyses/decompiler/peephole_optimizations/extended_byte_and_mask.py +56 -0
- angr/analyses/decompiler/peephole_optimizations/inlined_memcpy.py +78 -0
- angr/analyses/decompiler/peephole_optimizations/inlined_memset.py +262 -0
- angr/analyses/decompiler/peephole_optimizations/inlined_strcpy.py +217 -0
- angr/analyses/decompiler/peephole_optimizations/inlined_strcpy_consolidation.py +106 -0
- angr/analyses/decompiler/peephole_optimizations/inlined_wcscpy.py +256 -0
- angr/analyses/decompiler/peephole_optimizations/inlined_wcscpy_consolidation.py +296 -0
- angr/analyses/decompiler/peephole_optimizations/invert_negated_logical_conjuction_disjunction.py +50 -0
- angr/analyses/decompiler/peephole_optimizations/modulo_simplifier.py +89 -0
- angr/analyses/decompiler/peephole_optimizations/one_sub_bool.py +33 -0
- angr/analyses/decompiler/peephole_optimizations/optimized_div_simplifier.py +356 -0
- angr/analyses/decompiler/peephole_optimizations/remove_cascading_conversions.py +45 -0
- angr/analyses/decompiler/peephole_optimizations/remove_cxx_destructor_calls.py +32 -0
- angr/analyses/decompiler/peephole_optimizations/remove_empty_if_body.py +46 -0
- angr/analyses/decompiler/peephole_optimizations/remove_noop_conversions.py +47 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_bitmasks.py +125 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_conversions.py +273 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_derefs.py +21 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_branch.py +30 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_comparisons.py +54 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_nots.py +36 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_reinterprets.py +44 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts.py +95 -0
- angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts_around_comparators.py +115 -0
- angr/analyses/decompiler/peephole_optimizations/rewrite_bit_extractions.py +85 -0
- angr/analyses/decompiler/peephole_optimizations/rewrite_conv_mul.py +40 -0
- angr/analyses/decompiler/peephole_optimizations/rewrite_cxx_operator_calls.py +90 -0
- angr/analyses/decompiler/peephole_optimizations/rewrite_mips_gp_loads.py +49 -0
- angr/analyses/decompiler/peephole_optimizations/rol_ror.py +130 -0
- angr/analyses/decompiler/peephole_optimizations/sar_to_signed_div.py +143 -0
- angr/analyses/decompiler/peephole_optimizations/shl_to_mul.py +25 -0
- angr/analyses/decompiler/peephole_optimizations/simplify_pc_relative_loads.py +51 -0
- angr/analyses/decompiler/peephole_optimizations/single_bit_cond_to_boolexpr.py +28 -0
- angr/analyses/decompiler/peephole_optimizations/single_bit_xor.py +29 -0
- angr/analyses/decompiler/peephole_optimizations/tidy_stack_addr.py +131 -0
- angr/analyses/decompiler/peephole_optimizations/utils.py +18 -0
- angr/analyses/decompiler/presets/__init__.py +22 -0
- angr/analyses/decompiler/presets/basic.py +36 -0
- angr/analyses/decompiler/presets/fast.py +66 -0
- angr/analyses/decompiler/presets/full.py +76 -0
- angr/analyses/decompiler/presets/malware.py +70 -0
- angr/analyses/decompiler/presets/preset.py +37 -0
- angr/analyses/decompiler/redundant_label_remover.py +141 -0
- angr/analyses/decompiler/region_identifier.py +1319 -0
- angr/analyses/decompiler/region_simplifiers/__init__.py +5 -0
- angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py +95 -0
- angr/analyses/decompiler/region_simplifiers/cascading_ifs.py +82 -0
- angr/analyses/decompiler/region_simplifiers/expr_folding.py +838 -0
- angr/analyses/decompiler/region_simplifiers/goto.py +178 -0
- angr/analyses/decompiler/region_simplifiers/if_.py +135 -0
- angr/analyses/decompiler/region_simplifiers/ifelse.py +91 -0
- angr/analyses/decompiler/region_simplifiers/loop.py +143 -0
- angr/analyses/decompiler/region_simplifiers/node_address_finder.py +24 -0
- angr/analyses/decompiler/region_simplifiers/region_simplifier.py +270 -0
- angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py +654 -0
- angr/analyses/decompiler/region_simplifiers/switch_expr_simplifier.py +87 -0
- angr/analyses/decompiler/region_walker.py +24 -0
- angr/analyses/decompiler/return_maker.py +72 -0
- angr/analyses/decompiler/semantic_naming/__init__.py +37 -0
- angr/analyses/decompiler/semantic_naming/array_index_naming.py +196 -0
- angr/analyses/decompiler/semantic_naming/boolean_naming.py +264 -0
- angr/analyses/decompiler/semantic_naming/call_result_naming.py +220 -0
- angr/analyses/decompiler/semantic_naming/naming_base.py +166 -0
- angr/analyses/decompiler/semantic_naming/orchestrator.py +107 -0
- angr/analyses/decompiler/semantic_naming/pointer_naming.py +334 -0
- angr/analyses/decompiler/semantic_naming/region_loop_counter_naming.py +246 -0
- angr/analyses/decompiler/semantic_naming/size_naming.py +137 -0
- angr/analyses/decompiler/seq_to_blocks.py +20 -0
- angr/analyses/decompiler/sequence_walker.py +261 -0
- angr/analyses/decompiler/ssailification/__init__.py +4 -0
- angr/analyses/decompiler/ssailification/rewriting.py +451 -0
- angr/analyses/decompiler/ssailification/rewriting_engine.py +1091 -0
- angr/analyses/decompiler/ssailification/rewriting_state.py +61 -0
- angr/analyses/decompiler/ssailification/ssailification.py +283 -0
- angr/analyses/decompiler/ssailification/traversal.py +127 -0
- angr/analyses/decompiler/ssailification/traversal_engine.py +323 -0
- angr/analyses/decompiler/ssailification/traversal_state.py +48 -0
- angr/analyses/decompiler/stack_item.py +36 -0
- angr/analyses/decompiler/structured_codegen/__init__.py +25 -0
- angr/analyses/decompiler/structured_codegen/base.py +193 -0
- angr/analyses/decompiler/structured_codegen/c.py +4257 -0
- angr/analyses/decompiler/structured_codegen/dummy.py +15 -0
- angr/analyses/decompiler/structured_codegen/dwarf_import.py +190 -0
- angr/analyses/decompiler/structuring/__init__.py +30 -0
- angr/analyses/decompiler/structuring/dream.py +1217 -0
- angr/analyses/decompiler/structuring/phoenix.py +3636 -0
- angr/analyses/decompiler/structuring/recursive_structurer.py +187 -0
- angr/analyses/decompiler/structuring/sailr.py +120 -0
- angr/analyses/decompiler/structuring/structurer_base.py +1140 -0
- angr/analyses/decompiler/structuring/structurer_nodes.py +442 -0
- angr/analyses/decompiler/utils.py +1224 -0
- angr/analyses/deobfuscator/__init__.py +23 -0
- angr/analyses/deobfuscator/api_obf_finder.py +333 -0
- angr/analyses/deobfuscator/api_obf_peephole_optimizer.py +80 -0
- angr/analyses/deobfuscator/api_obf_type2_finder.py +166 -0
- angr/analyses/deobfuscator/data_transformation_embedder.py +633 -0
- angr/analyses/deobfuscator/hash_lookup_api_deobfuscator.py +156 -0
- angr/analyses/deobfuscator/irsb_reg_collector.py +54 -0
- angr/analyses/deobfuscator/scope_ops_analyzer.py +68 -0
- angr/analyses/deobfuscator/string_obf_finder.py +983 -0
- angr/analyses/deobfuscator/string_obf_opt_passes.py +136 -0
- angr/analyses/deobfuscator/string_obf_peephole_optimizer.py +47 -0
- angr/analyses/disassembly.py +1351 -0
- angr/analyses/disassembly_utils.py +101 -0
- angr/analyses/dominance_frontier.py +57 -0
- angr/analyses/fcp/__init__.py +4 -0
- angr/analyses/fcp/fcp.py +427 -0
- angr/analyses/find_objects_static.py +205 -0
- angr/analyses/flirt/__init__.py +47 -0
- angr/analyses/flirt/consts.py +160 -0
- angr/analyses/flirt/flirt.py +249 -0
- angr/analyses/flirt/flirt_function.py +20 -0
- angr/analyses/flirt/flirt_matcher.py +352 -0
- angr/analyses/flirt/flirt_module.py +32 -0
- angr/analyses/flirt/flirt_node.py +23 -0
- angr/analyses/flirt/flirt_sig.py +359 -0
- angr/analyses/flirt/flirt_utils.py +31 -0
- angr/analyses/forward_analysis/__init__.py +12 -0
- angr/analyses/forward_analysis/forward_analysis.py +619 -0
- angr/analyses/forward_analysis/job_info.py +64 -0
- angr/analyses/forward_analysis/visitors/__init__.py +14 -0
- angr/analyses/forward_analysis/visitors/call_graph.py +29 -0
- angr/analyses/forward_analysis/visitors/function_graph.py +86 -0
- angr/analyses/forward_analysis/visitors/graph.py +242 -0
- angr/analyses/forward_analysis/visitors/loop.py +29 -0
- angr/analyses/forward_analysis/visitors/single_node_graph.py +38 -0
- angr/analyses/identifier/__init__.py +5 -0
- angr/analyses/identifier/custom_callable.py +137 -0
- angr/analyses/identifier/errors.py +10 -0
- angr/analyses/identifier/func.py +60 -0
- angr/analyses/identifier/functions/__init__.py +37 -0
- angr/analyses/identifier/functions/atoi.py +73 -0
- angr/analyses/identifier/functions/based_atoi.py +125 -0
- angr/analyses/identifier/functions/fdprintf.py +123 -0
- angr/analyses/identifier/functions/free.py +64 -0
- angr/analyses/identifier/functions/int2str.py +287 -0
- angr/analyses/identifier/functions/malloc.py +111 -0
- angr/analyses/identifier/functions/memcmp.py +67 -0
- angr/analyses/identifier/functions/memcpy.py +89 -0
- angr/analyses/identifier/functions/memset.py +43 -0
- angr/analyses/identifier/functions/printf.py +123 -0
- angr/analyses/identifier/functions/recv_until.py +312 -0
- angr/analyses/identifier/functions/skip_calloc.py +73 -0
- angr/analyses/identifier/functions/skip_realloc.py +97 -0
- angr/analyses/identifier/functions/skip_recv_n.py +105 -0
- angr/analyses/identifier/functions/snprintf.py +112 -0
- angr/analyses/identifier/functions/sprintf.py +116 -0
- angr/analyses/identifier/functions/strcasecmp.py +33 -0
- angr/analyses/identifier/functions/strcmp.py +113 -0
- angr/analyses/identifier/functions/strcpy.py +43 -0
- angr/analyses/identifier/functions/strlen.py +27 -0
- angr/analyses/identifier/functions/strncmp.py +104 -0
- angr/analyses/identifier/functions/strncpy.py +65 -0
- angr/analyses/identifier/functions/strtol.py +89 -0
- angr/analyses/identifier/identify.py +825 -0
- angr/analyses/identifier/runner.py +360 -0
- angr/analyses/init_finder.py +289 -0
- angr/analyses/loop_analysis/__init__.py +4 -0
- angr/analyses/loop_analysis/loop_analysis.py +464 -0
- angr/analyses/loop_analysis.py +349 -0
- angr/analyses/loop_unroller/__init__.py +4 -0
- angr/analyses/loop_unroller/loop_unroller.py +222 -0
- angr/analyses/loopfinder.py +171 -0
- angr/analyses/outliner/__init__.py +7 -0
- angr/analyses/outliner/outliner.py +402 -0
- angr/analyses/patchfinder.py +137 -0
- angr/analyses/pathfinder.py +282 -0
- angr/analyses/propagator/__init__.py +5 -0
- angr/analyses/propagator/engine_base.py +62 -0
- angr/analyses/propagator/engine_vex.py +297 -0
- angr/analyses/propagator/propagator.py +361 -0
- angr/analyses/propagator/top_checker_mixin.py +218 -0
- angr/analyses/propagator/values.py +117 -0
- angr/analyses/propagator/vex_vars.py +68 -0
- angr/analyses/proximity_graph.py +444 -0
- angr/analyses/purity/__init__.py +15 -0
- angr/analyses/purity/analysis.py +78 -0
- angr/analyses/purity/engine.py +593 -0
- angr/analyses/reaching_definitions/__init__.py +67 -0
- angr/analyses/reaching_definitions/call_trace.py +73 -0
- angr/analyses/reaching_definitions/dep_graph.py +433 -0
- angr/analyses/reaching_definitions/engine_ail.py +1128 -0
- angr/analyses/reaching_definitions/engine_vex.py +1128 -0
- angr/analyses/reaching_definitions/external_codeloc.py +0 -0
- angr/analyses/reaching_definitions/function_handler.py +639 -0
- angr/analyses/reaching_definitions/function_handler_library/__init__.py +12 -0
- angr/analyses/reaching_definitions/function_handler_library/stdio.py +269 -0
- angr/analyses/reaching_definitions/function_handler_library/stdlib.py +195 -0
- angr/analyses/reaching_definitions/function_handler_library/string.py +158 -0
- angr/analyses/reaching_definitions/function_handler_library/unistd.py +51 -0
- angr/analyses/reaching_definitions/heap_allocator.py +70 -0
- angr/analyses/reaching_definitions/rd_initializer.py +237 -0
- angr/analyses/reaching_definitions/rd_state.py +579 -0
- angr/analyses/reaching_definitions/reaching_definitions.py +581 -0
- angr/analyses/reaching_definitions/subject.py +65 -0
- angr/analyses/reassembler.py +2900 -0
- angr/analyses/s_liveness.py +254 -0
- angr/analyses/s_propagator.py +575 -0
- angr/analyses/s_reaching_definitions/__init__.py +12 -0
- angr/analyses/s_reaching_definitions/s_rda_model.py +145 -0
- angr/analyses/s_reaching_definitions/s_rda_view.py +344 -0
- angr/analyses/s_reaching_definitions/s_reaching_definitions.py +230 -0
- angr/analyses/smc.py +160 -0
- angr/analyses/soot_class_hierarchy.py +273 -0
- angr/analyses/stack_pointer_tracker.py +954 -0
- angr/analyses/static_hooker.py +53 -0
- angr/analyses/typehoon/__init__.py +5 -0
- angr/analyses/typehoon/dfa.py +118 -0
- angr/analyses/typehoon/lifter.py +133 -0
- angr/analyses/typehoon/simple_solver.py +2009 -0
- angr/analyses/typehoon/translator.py +283 -0
- angr/analyses/typehoon/typeconsts.py +439 -0
- angr/analyses/typehoon/typehoon.py +338 -0
- angr/analyses/typehoon/typevars.py +633 -0
- angr/analyses/typehoon/variance.py +11 -0
- angr/analyses/unpacker/__init__.py +6 -0
- angr/analyses/unpacker/obfuscation_detector.py +103 -0
- angr/analyses/unpacker/packing_detector.py +138 -0
- angr/analyses/variable_recovery/__init__.py +9 -0
- angr/analyses/variable_recovery/annotations.py +58 -0
- angr/analyses/variable_recovery/engine_ail.py +978 -0
- angr/analyses/variable_recovery/engine_base.py +1256 -0
- angr/analyses/variable_recovery/engine_vex.py +594 -0
- angr/analyses/variable_recovery/irsb_scanner.py +143 -0
- angr/analyses/variable_recovery/variable_recovery.py +574 -0
- angr/analyses/variable_recovery/variable_recovery_base.py +489 -0
- angr/analyses/variable_recovery/variable_recovery_fast.py +669 -0
- angr/analyses/veritesting.py +626 -0
- angr/analyses/vfg.py +1898 -0
- angr/analyses/vsa_ddg.py +420 -0
- angr/analyses/vtable.py +92 -0
- angr/analyses/xrefs.py +286 -0
- angr/angrdb/__init__.py +14 -0
- angr/angrdb/db.py +215 -0
- angr/angrdb/models.py +184 -0
- angr/angrdb/serializers/__init__.py +10 -0
- angr/angrdb/serializers/cfg_model.py +41 -0
- angr/angrdb/serializers/comments.py +60 -0
- angr/angrdb/serializers/funcs.py +61 -0
- angr/angrdb/serializers/kb.py +111 -0
- angr/angrdb/serializers/labels.py +59 -0
- angr/angrdb/serializers/loader.py +165 -0
- angr/angrdb/serializers/structured_code.py +167 -0
- angr/angrdb/serializers/variables.py +58 -0
- angr/angrdb/serializers/xrefs.py +48 -0
- angr/annocfg.py +317 -0
- angr/blade.py +431 -0
- angr/block.py +509 -0
- angr/callable.py +176 -0
- angr/calling_conventions.py +2613 -0
- angr/code_location.py +249 -0
- angr/codenode.py +145 -0
- angr/concretization_strategies/__init__.py +32 -0
- angr/concretization_strategies/any.py +17 -0
- angr/concretization_strategies/any_named.py +35 -0
- angr/concretization_strategies/base.py +81 -0
- angr/concretization_strategies/controlled_data.py +58 -0
- angr/concretization_strategies/eval.py +19 -0
- angr/concretization_strategies/logging.py +35 -0
- angr/concretization_strategies/max.py +25 -0
- angr/concretization_strategies/nonzero.py +16 -0
- angr/concretization_strategies/nonzero_range.py +22 -0
- angr/concretization_strategies/norepeats.py +37 -0
- angr/concretization_strategies/norepeats_range.py +37 -0
- angr/concretization_strategies/range.py +19 -0
- angr/concretization_strategies/signed_add.py +31 -0
- angr/concretization_strategies/single.py +15 -0
- angr/concretization_strategies/solutions.py +20 -0
- angr/concretization_strategies/unlimited_range.py +17 -0
- angr/distributed/__init__.py +9 -0
- angr/distributed/server.py +197 -0
- angr/distributed/worker.py +185 -0
- angr/emulator.py +144 -0
- angr/engines/__init__.py +69 -0
- angr/engines/ail/__init__.py +16 -0
- angr/engines/ail/callstack.py +58 -0
- angr/engines/ail/engine_light.py +903 -0
- angr/engines/ail/engine_successors.py +24 -0
- angr/engines/ail/setup.py +57 -0
- angr/engines/concrete.py +66 -0
- angr/engines/engine.py +29 -0
- angr/engines/failure.py +27 -0
- angr/engines/hook.py +93 -0
- angr/engines/icicle.py +294 -0
- angr/engines/light/__init__.py +23 -0
- angr/engines/light/data.py +681 -0
- angr/engines/light/engine.py +1297 -0
- angr/engines/pcode/__init__.py +9 -0
- angr/engines/pcode/behavior.py +998 -0
- angr/engines/pcode/cc.py +148 -0
- angr/engines/pcode/emulate.py +440 -0
- angr/engines/pcode/engine.py +242 -0
- angr/engines/pcode/lifter.py +1428 -0
- angr/engines/procedure.py +70 -0
- angr/engines/soot/__init__.py +5 -0
- angr/engines/soot/engine.py +410 -0
- angr/engines/soot/exceptions.py +17 -0
- angr/engines/soot/expressions/__init__.py +87 -0
- angr/engines/soot/expressions/arrayref.py +22 -0
- angr/engines/soot/expressions/base.py +21 -0
- angr/engines/soot/expressions/binop.py +28 -0
- angr/engines/soot/expressions/cast.py +22 -0
- angr/engines/soot/expressions/condition.py +35 -0
- angr/engines/soot/expressions/constants.py +47 -0
- angr/engines/soot/expressions/instanceOf.py +15 -0
- angr/engines/soot/expressions/instancefieldref.py +8 -0
- angr/engines/soot/expressions/invoke.py +114 -0
- angr/engines/soot/expressions/length.py +8 -0
- angr/engines/soot/expressions/local.py +8 -0
- angr/engines/soot/expressions/new.py +16 -0
- angr/engines/soot/expressions/newArray.py +54 -0
- angr/engines/soot/expressions/newMultiArray.py +86 -0
- angr/engines/soot/expressions/paramref.py +8 -0
- angr/engines/soot/expressions/phi.py +30 -0
- angr/engines/soot/expressions/staticfieldref.py +8 -0
- angr/engines/soot/expressions/thisref.py +7 -0
- angr/engines/soot/expressions/unsupported.py +7 -0
- angr/engines/soot/field_dispatcher.py +46 -0
- angr/engines/soot/method_dispatcher.py +46 -0
- angr/engines/soot/statements/__init__.py +44 -0
- angr/engines/soot/statements/assign.py +30 -0
- angr/engines/soot/statements/base.py +79 -0
- angr/engines/soot/statements/goto.py +14 -0
- angr/engines/soot/statements/identity.py +15 -0
- angr/engines/soot/statements/if_.py +19 -0
- angr/engines/soot/statements/invoke.py +12 -0
- angr/engines/soot/statements/return_.py +20 -0
- angr/engines/soot/statements/switch.py +41 -0
- angr/engines/soot/statements/throw.py +15 -0
- angr/engines/soot/values/__init__.py +38 -0
- angr/engines/soot/values/arrayref.py +122 -0
- angr/engines/soot/values/base.py +7 -0
- angr/engines/soot/values/constants.py +18 -0
- angr/engines/soot/values/instancefieldref.py +44 -0
- angr/engines/soot/values/local.py +18 -0
- angr/engines/soot/values/paramref.py +18 -0
- angr/engines/soot/values/staticfieldref.py +38 -0
- angr/engines/soot/values/strref.py +38 -0
- angr/engines/soot/values/thisref.py +149 -0
- angr/engines/successors.py +608 -0
- angr/engines/syscall.py +51 -0
- angr/engines/unicorn.py +490 -0
- angr/engines/vex/__init__.py +20 -0
- angr/engines/vex/claripy/__init__.py +5 -0
- angr/engines/vex/claripy/ccall.py +2097 -0
- angr/engines/vex/claripy/datalayer.py +141 -0
- angr/engines/vex/claripy/irop.py +1276 -0
- angr/engines/vex/heavy/__init__.py +16 -0
- angr/engines/vex/heavy/actions.py +231 -0
- angr/engines/vex/heavy/concretizers.py +403 -0
- angr/engines/vex/heavy/dirty.py +466 -0
- angr/engines/vex/heavy/heavy.py +370 -0
- angr/engines/vex/heavy/inspect.py +52 -0
- angr/engines/vex/heavy/resilience.py +85 -0
- angr/engines/vex/heavy/super_fastpath.py +34 -0
- angr/engines/vex/lifter.py +420 -0
- angr/engines/vex/light/__init__.py +11 -0
- angr/engines/vex/light/light.py +551 -0
- angr/engines/vex/light/resilience.py +74 -0
- angr/engines/vex/light/slicing.py +52 -0
- angr/errors.py +611 -0
- angr/exploration_techniques/__init__.py +53 -0
- angr/exploration_techniques/base.py +126 -0
- angr/exploration_techniques/bucketizer.py +94 -0
- angr/exploration_techniques/common.py +56 -0
- angr/exploration_techniques/dfs.py +37 -0
- angr/exploration_techniques/director.py +520 -0
- angr/exploration_techniques/driller_core.py +100 -0
- angr/exploration_techniques/explorer.py +152 -0
- angr/exploration_techniques/lengthlimiter.py +22 -0
- angr/exploration_techniques/local_loop_seer.py +65 -0
- angr/exploration_techniques/loop_seer.py +236 -0
- angr/exploration_techniques/manual_mergepoint.py +82 -0
- angr/exploration_techniques/memory_watcher.py +43 -0
- angr/exploration_techniques/oppologist.py +92 -0
- angr/exploration_techniques/slicecutor.py +118 -0
- angr/exploration_techniques/spiller.py +280 -0
- angr/exploration_techniques/spiller_db.py +27 -0
- angr/exploration_techniques/stochastic.py +56 -0
- angr/exploration_techniques/stub_stasher.py +19 -0
- angr/exploration_techniques/suggestions.py +159 -0
- angr/exploration_techniques/tech_builder.py +49 -0
- angr/exploration_techniques/threading.py +69 -0
- angr/exploration_techniques/timeout.py +34 -0
- angr/exploration_techniques/tracer.py +1098 -0
- angr/exploration_techniques/unique.py +106 -0
- angr/exploration_techniques/veritesting.py +37 -0
- angr/factory.py +413 -0
- angr/flirt/__init__.py +124 -0
- angr/flirt/build_sig.py +305 -0
- angr/graph_utils.py +0 -0
- angr/keyed_region.py +525 -0
- angr/knowledge_base.py +146 -0
- angr/knowledge_plugins/__init__.py +43 -0
- angr/knowledge_plugins/callsite_prototypes.py +95 -0
- angr/knowledge_plugins/cfg/__init__.py +18 -0
- angr/knowledge_plugins/cfg/cfg_manager.py +95 -0
- angr/knowledge_plugins/cfg/cfg_model.py +1043 -0
- angr/knowledge_plugins/cfg/cfg_node.py +536 -0
- angr/knowledge_plugins/cfg/indirect_jump.py +131 -0
- angr/knowledge_plugins/cfg/memory_data.py +156 -0
- angr/knowledge_plugins/comments.py +16 -0
- angr/knowledge_plugins/custom_strings.py +38 -0
- angr/knowledge_plugins/data.py +22 -0
- angr/knowledge_plugins/debug_variables.py +216 -0
- angr/knowledge_plugins/functions/__init__.py +9 -0
- angr/knowledge_plugins/functions/function.py +1830 -0
- angr/knowledge_plugins/functions/function_manager.py +621 -0
- angr/knowledge_plugins/functions/function_parser.py +360 -0
- angr/knowledge_plugins/functions/soot_function.py +128 -0
- angr/knowledge_plugins/indirect_jumps.py +35 -0
- angr/knowledge_plugins/key_definitions/__init__.py +17 -0
- angr/knowledge_plugins/key_definitions/atoms.py +374 -0
- angr/knowledge_plugins/key_definitions/constants.py +29 -0
- angr/knowledge_plugins/key_definitions/definition.py +216 -0
- angr/knowledge_plugins/key_definitions/environment.py +96 -0
- angr/knowledge_plugins/key_definitions/heap_address.py +33 -0
- angr/knowledge_plugins/key_definitions/key_definition_manager.py +82 -0
- angr/knowledge_plugins/key_definitions/live_definitions.py +1020 -0
- angr/knowledge_plugins/key_definitions/liveness.py +165 -0
- angr/knowledge_plugins/key_definitions/rd_model.py +171 -0
- angr/knowledge_plugins/key_definitions/tag.py +78 -0
- angr/knowledge_plugins/key_definitions/undefined.py +70 -0
- angr/knowledge_plugins/key_definitions/unknown_size.py +86 -0
- angr/knowledge_plugins/key_definitions/uses.py +178 -0
- angr/knowledge_plugins/labels.py +110 -0
- angr/knowledge_plugins/obfuscations.py +40 -0
- angr/knowledge_plugins/patches.py +126 -0
- angr/knowledge_plugins/plugin.py +24 -0
- angr/knowledge_plugins/propagations/__init__.py +10 -0
- angr/knowledge_plugins/propagations/prop_value.py +191 -0
- angr/knowledge_plugins/propagations/propagation_manager.py +60 -0
- angr/knowledge_plugins/propagations/propagation_model.py +80 -0
- angr/knowledge_plugins/propagations/states.py +552 -0
- angr/knowledge_plugins/structured_code.py +63 -0
- angr/knowledge_plugins/types.py +95 -0
- angr/knowledge_plugins/variables/__init__.py +8 -0
- angr/knowledge_plugins/variables/variable_access.py +113 -0
- angr/knowledge_plugins/variables/variable_manager.py +1375 -0
- angr/knowledge_plugins/xrefs/__init__.py +12 -0
- angr/knowledge_plugins/xrefs/xref.py +150 -0
- angr/knowledge_plugins/xrefs/xref_manager.py +127 -0
- angr/knowledge_plugins/xrefs/xref_types.py +16 -0
- angr/misc/__init__.py +19 -0
- angr/misc/ansi.py +47 -0
- angr/misc/autoimport.py +90 -0
- angr/misc/bug_report.py +126 -0
- angr/misc/hookset.py +106 -0
- angr/misc/loggers.py +130 -0
- angr/misc/picklable_lock.py +46 -0
- angr/misc/plugins.py +289 -0
- angr/misc/telemetry.py +54 -0
- angr/misc/testing.py +24 -0
- angr/misc/ux.py +31 -0
- angr/procedures/__init__.py +12 -0
- angr/procedures/advapi32/__init__.py +0 -0
- angr/procedures/cgc/__init__.py +3 -0
- angr/procedures/cgc/_terminate.py +11 -0
- angr/procedures/cgc/allocate.py +75 -0
- angr/procedures/cgc/deallocate.py +67 -0
- angr/procedures/cgc/fdwait.py +65 -0
- angr/procedures/cgc/random.py +67 -0
- angr/procedures/cgc/receive.py +93 -0
- angr/procedures/cgc/transmit.py +65 -0
- angr/procedures/definitions/__init__.py +1043 -0
- angr/procedures/definitions/cgc.py +23 -0
- angr/procedures/definitions/common/glibc.json +3516 -0
- angr/procedures/definitions/gnulib.py +41 -0
- angr/procedures/definitions/libstdcpp.py +25 -0
- angr/procedures/definitions/linux_kernel.py +8382 -0
- angr/procedures/definitions/linux_loader.py +7 -0
- angr/procedures/definitions/macho_libsystem.py +18 -0
- angr/procedures/definitions/msvcr.py +25 -0
- angr/procedures/definitions/parse_glibc.py +77 -0
- angr/procedures/definitions/parse_syscalls_from_local_system.py +54 -0
- angr/procedures/definitions/parse_win32json.py +2540 -0
- angr/procedures/definitions/types_stl.py +22 -0
- angr/procedures/definitions/wdk/api-ms-win-dx-d3dkmt-l1-1-4.json +24 -0
- angr/procedures/definitions/wdk/api-ms-win-dx-d3dkmt-l1-1-6.json +18 -0
- angr/procedures/definitions/wdk/clfs.json +189 -0
- angr/procedures/definitions/wdk/fltmgr.json +813 -0
- angr/procedures/definitions/wdk/fwpkclnt.json +24 -0
- angr/procedures/definitions/wdk/fwpuclnt.json +453 -0
- angr/procedures/definitions/wdk/gdi32.json +528 -0
- angr/procedures/definitions/wdk/hal.json +96 -0
- angr/procedures/definitions/wdk/ksecdd.json +72 -0
- angr/procedures/definitions/wdk/ndis.json +336 -0
- angr/procedures/definitions/wdk/ntoskrnl.json +5158 -0
- angr/procedures/definitions/wdk/offreg.json +87 -0
- angr/procedures/definitions/wdk/pshed.json +33 -0
- angr/procedures/definitions/wdk/secur32.json +39 -0
- angr/procedures/definitions/wdk/vhfum.json +30 -0
- angr/procedures/definitions/win32/_types_win32.json +34480 -0
- angr/procedures/definitions/win32/aclui.json +24 -0
- angr/procedures/definitions/win32/activeds.json +81 -0
- angr/procedures/definitions/win32/advapi32.json +2505 -0
- angr/procedures/definitions/win32/advpack.json +165 -0
- angr/procedures/definitions/win32/amsi.json +36 -0
- angr/procedures/definitions/win32/api-ms-win-appmodel-runtime-l1-1-1.json +45 -0
- angr/procedures/definitions/win32/api-ms-win-appmodel-runtime-l1-1-3.json +30 -0
- angr/procedures/definitions/win32/api-ms-win-appmodel-runtime-l1-1-6.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-apiquery-l2-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-backgroundtask-l1-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-comm-l1-1-1.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-comm-l1-1-2.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-enclave-l1-1-1.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-core-errorhandling-l1-1-3.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-featurestaging-l1-1-0.json +30 -0
- angr/procedures/definitions/win32/api-ms-win-core-featurestaging-l1-1-1.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-file-fromapp-l1-1-0.json +48 -0
- angr/procedures/definitions/win32/api-ms-win-core-handle-l1-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-ioring-l1-1-0.json +51 -0
- angr/procedures/definitions/win32/api-ms-win-core-marshal-l1-1-0.json +27 -0
- angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-3.json +27 -0
- angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-4.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-5.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-6.json +27 -0
- angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-7.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-core-memory-l1-1-8.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-core-path-l1-1-0.json +81 -0
- angr/procedures/definitions/win32/api-ms-win-core-psm-appnotify-l1-1-0.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-core-psm-appnotify-l1-1-1.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-core-realtime-l1-1-1.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-core-realtime-l1-1-2.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-core-slapi-l1-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-state-helpers-l1-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-synch-l1-2-0.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-core-sysinfo-l1-2-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-sysinfo-l1-2-3.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-core-sysinfo-l1-2-4.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-core-sysinfo-l1-2-6.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-core-util-l1-1-1.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-core-wow64-l1-1-1.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-devices-query-l1-1-0.json +42 -0
- angr/procedures/definitions/win32/api-ms-win-devices-query-l1-1-1.json +30 -0
- angr/procedures/definitions/win32/api-ms-win-dx-d3dkmt-l1-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-gaming-deviceinformation-l1-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-gaming-expandedresources-l1-1-0.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-gaming-tcui-l1-1-0.json +36 -0
- angr/procedures/definitions/win32/api-ms-win-gaming-tcui-l1-1-1.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-gaming-tcui-l1-1-2.json +36 -0
- angr/procedures/definitions/win32/api-ms-win-gaming-tcui-l1-1-3.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-gaming-tcui-l1-1-4.json +39 -0
- angr/procedures/definitions/win32/api-ms-win-mm-misc-l1-1-1.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-net-isolation-l1-1-0.json +39 -0
- angr/procedures/definitions/win32/api-ms-win-security-base-l1-2-2.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-security-isolatedcontainer-l1-1-0.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-security-isolatedcontainer-l1-1-1.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-service-core-l1-1-3.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-service-core-l1-1-4.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-service-core-l1-1-5.json +21 -0
- angr/procedures/definitions/win32/api-ms-win-shcore-scaling-l1-1-0.json +24 -0
- angr/procedures/definitions/win32/api-ms-win-shcore-scaling-l1-1-1.json +33 -0
- angr/procedures/definitions/win32/api-ms-win-shcore-scaling-l1-1-2.json +18 -0
- angr/procedures/definitions/win32/api-ms-win-wsl-api-l1-1-0.json +36 -0
- angr/procedures/definitions/win32/apphelp.json +18 -0
- angr/procedures/definitions/win32/authz.json +114 -0
- angr/procedures/definitions/win32/avicap32.json +27 -0
- angr/procedures/definitions/win32/avifil32.json +195 -0
- angr/procedures/definitions/win32/avrt.json +57 -0
- angr/procedures/definitions/win32/bcp47mrm.json +21 -0
- angr/procedures/definitions/win32/bcrypt.json +174 -0
- angr/procedures/definitions/win32/bcryptprimitives.json +21 -0
- angr/procedures/definitions/win32/bluetoothapis.json +138 -0
- angr/procedures/definitions/win32/bthprops_cpl.json +33 -0
- angr/procedures/definitions/win32/cabinet.json +81 -0
- angr/procedures/definitions/win32/certadm.json +69 -0
- angr/procedures/definitions/win32/certpoleng.json +39 -0
- angr/procedures/definitions/win32/cfgmgr32.json +732 -0
- angr/procedures/definitions/win32/chakra.json +270 -0
- angr/procedures/definitions/win32/cldapi.json +123 -0
- angr/procedures/definitions/win32/clfsw32.json +192 -0
- angr/procedures/definitions/win32/clusapi.json +855 -0
- angr/procedures/definitions/win32/comctl32.json +360 -0
- angr/procedures/definitions/win32/comdlg32.json +78 -0
- angr/procedures/definitions/win32/compstui.json +27 -0
- angr/procedures/definitions/win32/computecore.json +177 -0
- angr/procedures/definitions/win32/computenetwork.json +144 -0
- angr/procedures/definitions/win32/computestorage.json +51 -0
- angr/procedures/definitions/win32/comsvcs.json +36 -0
- angr/procedures/definitions/win32/credui.json +72 -0
- angr/procedures/definitions/win32/crypt32.json +702 -0
- angr/procedures/definitions/win32/cryptnet.json +30 -0
- angr/procedures/definitions/win32/cryptui.json +45 -0
- angr/procedures/definitions/win32/cryptxml.json +72 -0
- angr/procedures/definitions/win32/cscapi.json +27 -0
- angr/procedures/definitions/win32/d2d1.json +54 -0
- angr/procedures/definitions/win32/d3d10.json +96 -0
- angr/procedures/definitions/win32/d3d10_1.json +21 -0
- angr/procedures/definitions/win32/d3d11.json +24 -0
- angr/procedures/definitions/win32/d3d12.json +39 -0
- angr/procedures/definitions/win32/d3d9.json +48 -0
- angr/procedures/definitions/win32/d3dcompiler_47.json +93 -0
- angr/procedures/definitions/win32/d3dcsx.json +42 -0
- angr/procedures/definitions/win32/davclnt.json +69 -0
- angr/procedures/definitions/win32/dbgeng.json +27 -0
- angr/procedures/definitions/win32/dbghelp.json +663 -0
- angr/procedures/definitions/win32/dbgmodel.json +18 -0
- angr/procedures/definitions/win32/dciman32.json +75 -0
- angr/procedures/definitions/win32/dcomp.json +51 -0
- angr/procedures/definitions/win32/ddraw.json +36 -0
- angr/procedures/definitions/win32/deviceaccess.json +18 -0
- angr/procedures/definitions/win32/dflayout.json +18 -0
- angr/procedures/definitions/win32/dhcpcsvc.json +60 -0
- angr/procedures/definitions/win32/dhcpcsvc6.json +33 -0
- angr/procedures/definitions/win32/dhcpsapi.json +603 -0
- angr/procedures/definitions/win32/diagnosticdataquery.json +120 -0
- angr/procedures/definitions/win32/dinput8.json +18 -0
- angr/procedures/definitions/win32/directml.json +21 -0
- angr/procedures/definitions/win32/dmprocessxmlfiltered.json +18 -0
- angr/procedures/definitions/win32/dnsapi.json +207 -0
- angr/procedures/definitions/win32/drt.json +63 -0
- angr/procedures/definitions/win32/drtprov.json +42 -0
- angr/procedures/definitions/win32/drttransport.json +21 -0
- angr/procedures/definitions/win32/dsound.json +45 -0
- angr/procedures/definitions/win32/dsparse.json +72 -0
- angr/procedures/definitions/win32/dsprop.json +36 -0
- angr/procedures/definitions/win32/dssec.json +27 -0
- angr/procedures/definitions/win32/dsuiext.json +27 -0
- angr/procedures/definitions/win32/dwmapi.json +108 -0
- angr/procedures/definitions/win32/dwrite.json +18 -0
- angr/procedures/definitions/win32/dxcompiler.json +21 -0
- angr/procedures/definitions/win32/dxcore.json +18 -0
- angr/procedures/definitions/win32/dxgi.json +33 -0
- angr/procedures/definitions/win32/dxva2.json +129 -0
- angr/procedures/definitions/win32/eappcfg.json +57 -0
- angr/procedures/definitions/win32/eappprxy.json +69 -0
- angr/procedures/definitions/win32/efswrt.json +21 -0
- angr/procedures/definitions/win32/elscore.json +30 -0
- angr/procedures/definitions/win32/esent.json +702 -0
- angr/procedures/definitions/win32/evr.json +36 -0
- angr/procedures/definitions/win32/faultrep.json +27 -0
- angr/procedures/definitions/win32/fhsvcctl.json +36 -0
- angr/procedures/definitions/win32/firewallapi.json +24 -0
- angr/procedures/definitions/win32/fltlib.json +99 -0
- angr/procedures/definitions/win32/fontsub.json +21 -0
- angr/procedures/definitions/win32/forceinline.json +24 -0
- angr/procedures/definitions/win32/fwpuclnt.json +591 -0
- angr/procedures/definitions/win32/fxsutility.json +21 -0
- angr/procedures/definitions/win32/gdi32.json +1308 -0
- angr/procedures/definitions/win32/gdiplus.json +1902 -0
- angr/procedures/definitions/win32/glu32.json +171 -0
- angr/procedures/definitions/win32/gpedit.json +33 -0
- angr/procedures/definitions/win32/hhctrl_ocx.json +21 -0
- angr/procedures/definitions/win32/hid.json +150 -0
- angr/procedures/definitions/win32/hlink.json +99 -0
- angr/procedures/definitions/win32/hrtfapo.json +18 -0
- angr/procedures/definitions/win32/httpapi.json +144 -0
- angr/procedures/definitions/win32/icm32.json +78 -0
- angr/procedures/definitions/win32/icmui.json +21 -0
- angr/procedures/definitions/win32/icu.json +3090 -0
- angr/procedures/definitions/win32/ieframe.json +102 -0
- angr/procedures/definitions/win32/imagehlp.json +84 -0
- angr/procedures/definitions/win32/imgutil.json +42 -0
- angr/procedures/definitions/win32/imm32.json +261 -0
- angr/procedures/definitions/win32/infocardapi.json +66 -0
- angr/procedures/definitions/win32/inkobjcore.json +96 -0
- angr/procedures/definitions/win32/iphlpapi.json +618 -0
- angr/procedures/definitions/win32/iscsidsc.json +252 -0
- angr/procedures/definitions/win32/isolatedwindowsenvironmentutils.json +21 -0
- angr/procedures/definitions/win32/kernel32.json +4566 -0
- angr/procedures/definitions/win32/kernelbase.json +33 -0
- angr/procedures/definitions/win32/keycredmgr.json +27 -0
- angr/procedures/definitions/win32/ksproxy_ax.json +33 -0
- angr/procedures/definitions/win32/ksuser.json +39 -0
- angr/procedures/definitions/win32/ktmw32.json +132 -0
- angr/procedures/definitions/win32/licenseprotection.json +21 -0
- angr/procedures/definitions/win32/loadperf.json +51 -0
- angr/procedures/definitions/win32/magnification.json +72 -0
- angr/procedures/definitions/win32/mapi32.json +213 -0
- angr/procedures/definitions/win32/mdmlocalmanagement.json +24 -0
- angr/procedures/definitions/win32/mdmregistration.json +60 -0
- angr/procedures/definitions/win32/mf.json +201 -0
- angr/procedures/definitions/win32/mfcore.json +21 -0
- angr/procedures/definitions/win32/mfplat.json +450 -0
- angr/procedures/definitions/win32/mfplay.json +18 -0
- angr/procedures/definitions/win32/mfreadwrite.json +30 -0
- angr/procedures/definitions/win32/mfsensorgroup.json +45 -0
- angr/procedures/definitions/win32/mfsrcsnk.json +21 -0
- angr/procedures/definitions/win32/mgmtapi.json +42 -0
- angr/procedures/definitions/win32/mi.json +18 -0
- angr/procedures/definitions/win32/mmdevapi.json +18 -0
- angr/procedures/definitions/win32/mpr.json +156 -0
- angr/procedures/definitions/win32/mprapi.json +351 -0
- angr/procedures/definitions/win32/mqrt.json +117 -0
- angr/procedures/definitions/win32/mrmsupport.json +96 -0
- angr/procedures/definitions/win32/msacm32.json +141 -0
- angr/procedures/definitions/win32/msajapi.json +1656 -0
- angr/procedures/definitions/win32/mscms.json +252 -0
- angr/procedures/definitions/win32/mscoree.json +96 -0
- angr/procedures/definitions/win32/msctfmonitor.json +24 -0
- angr/procedures/definitions/win32/msdelta.json +63 -0
- angr/procedures/definitions/win32/msdmo.json +48 -0
- angr/procedures/definitions/win32/msdrm.json +267 -0
- angr/procedures/definitions/win32/msi.json +807 -0
- angr/procedures/definitions/win32/msimg32.json +24 -0
- angr/procedures/definitions/win32/mspatcha.json +63 -0
- angr/procedures/definitions/win32/mspatchc.json +42 -0
- angr/procedures/definitions/win32/msports.json +36 -0
- angr/procedures/definitions/win32/msrating.json +72 -0
- angr/procedures/definitions/win32/mssign32.json +45 -0
- angr/procedures/definitions/win32/mstask.json +21 -0
- angr/procedures/definitions/win32/msvfw32.json +144 -0
- angr/procedures/definitions/win32/mswsock.json +63 -0
- angr/procedures/definitions/win32/mtxdm.json +18 -0
- angr/procedures/definitions/win32/ncrypt.json +132 -0
- angr/procedures/definitions/win32/ndfapi.json +63 -0
- angr/procedures/definitions/win32/netapi32.json +633 -0
- angr/procedures/definitions/win32/netsh.json +39 -0
- angr/procedures/definitions/win32/netshell.json +21 -0
- angr/procedures/definitions/win32/newdev.json +48 -0
- angr/procedures/definitions/win32/ninput.json +105 -0
- angr/procedures/definitions/win32/normaliz.json +21 -0
- angr/procedures/definitions/win32/ntdll.json +234 -0
- angr/procedures/definitions/win32/ntdllk.json +18 -0
- angr/procedures/definitions/win32/ntdsapi.json +258 -0
- angr/procedures/definitions/win32/ntlanman.json +45 -0
- angr/procedures/definitions/win32/odbc32.json +477 -0
- angr/procedures/definitions/win32/odbcbcp.json +96 -0
- angr/procedures/definitions/win32/ole32.json +966 -0
- angr/procedures/definitions/win32/oleacc.json +66 -0
- angr/procedures/definitions/win32/oleaut32.json +1230 -0
- angr/procedures/definitions/win32/oledlg.json +84 -0
- angr/procedures/definitions/win32/ondemandconnroutehelper.json +30 -0
- angr/procedures/definitions/win32/opengl32.json +1080 -0
- angr/procedures/definitions/win32/opmxbox.json +24 -0
- angr/procedures/definitions/win32/p2p.json +339 -0
- angr/procedures/definitions/win32/p2pgraph.json +126 -0
- angr/procedures/definitions/win32/pdh.json +309 -0
- angr/procedures/definitions/win32/peerdist.json +99 -0
- angr/procedures/definitions/win32/powrprof.json +267 -0
- angr/procedures/definitions/win32/prntvpt.json +48 -0
- angr/procedures/definitions/win32/projectedfslib.json +72 -0
- angr/procedures/definitions/win32/propsys.json +669 -0
- angr/procedures/definitions/win32/psapi.json +96 -0
- angr/procedures/definitions/win32/quartz.json +21 -0
- angr/procedures/definitions/win32/query.json +27 -0
- angr/procedures/definitions/win32/qwave.json +48 -0
- angr/procedures/definitions/win32/rasapi32.json +267 -0
- angr/procedures/definitions/win32/rasdlg.json +33 -0
- angr/procedures/definitions/win32/resutils.json +375 -0
- angr/procedures/definitions/win32/rpcns4.json +198 -0
- angr/procedures/definitions/win32/rpcproxy.json +27 -0
- angr/procedures/definitions/win32/rpcrt4.json +1356 -0
- angr/procedures/definitions/win32/rstrtmgr.json +48 -0
- angr/procedures/definitions/win32/rtm.json +243 -0
- angr/procedures/definitions/win32/rtutils.json +138 -0
- angr/procedures/definitions/win32/rtworkq.json +114 -0
- angr/procedures/definitions/win32/sas.json +18 -0
- angr/procedures/definitions/win32/scarddlg.json +30 -0
- angr/procedures/definitions/win32/schannel.json +42 -0
- angr/procedures/definitions/win32/sechost.json +21 -0
- angr/procedures/definitions/win32/secur32.json +282 -0
- angr/procedures/definitions/win32/sensapi.json +24 -0
- angr/procedures/definitions/win32/sensorsutilsv2.json +135 -0
- angr/procedures/definitions/win32/setupapi.json +1017 -0
- angr/procedures/definitions/win32/sfc.json +33 -0
- angr/procedures/definitions/win32/shdocvw.json +24 -0
- angr/procedures/definitions/win32/shell32.json +747 -0
- angr/procedures/definitions/win32/shlwapi.json +1095 -0
- angr/procedures/definitions/win32/slc.json +111 -0
- angr/procedures/definitions/win32/slcext.json +27 -0
- angr/procedures/definitions/win32/slwga.json +18 -0
- angr/procedures/definitions/win32/snmpapi.json +93 -0
- angr/procedures/definitions/win32/spoolss.json +93 -0
- angr/procedures/definitions/win32/srclient.json +18 -0
- angr/procedures/definitions/win32/srpapi.json +48 -0
- angr/procedures/definitions/win32/sspicli.json +36 -0
- angr/procedures/definitions/win32/sti.json +18 -0
- angr/procedures/definitions/win32/t2embed.json +57 -0
- angr/procedures/definitions/win32/tapi32.json +762 -0
- angr/procedures/definitions/win32/tbs.json +57 -0
- angr/procedures/definitions/win32/tdh.json +96 -0
- angr/procedures/definitions/win32/tokenbinding.json +45 -0
- angr/procedures/definitions/win32/traffic.json +75 -0
- angr/procedures/definitions/win32/txfw32.json +42 -0
- angr/procedures/definitions/win32/ualapi.json +27 -0
- angr/procedures/definitions/win32/uiautomationcore.json +309 -0
- angr/procedures/definitions/win32/urlmon.json +246 -0
- angr/procedures/definitions/win32/user32.json +2298 -0
- angr/procedures/definitions/win32/userenv.json +147 -0
- angr/procedures/definitions/win32/usp10.json +135 -0
- angr/procedures/definitions/win32/uxtheme.json +246 -0
- angr/procedures/definitions/win32/verifier.json +18 -0
- angr/procedures/definitions/win32/version.json +57 -0
- angr/procedures/definitions/win32/vertdll.json +36 -0
- angr/procedures/definitions/win32/virtdisk.json +102 -0
- angr/procedures/definitions/win32/vmdevicehost.json +54 -0
- angr/procedures/definitions/win32/vmsavedstatedumpprovider.json +144 -0
- angr/procedures/definitions/win32/vssapi.json +18 -0
- angr/procedures/definitions/win32/wcmapi.json +30 -0
- angr/procedures/definitions/win32/wdsbp.json +36 -0
- angr/procedures/definitions/win32/wdsclientapi.json +126 -0
- angr/procedures/definitions/win32/wdsmc.json +33 -0
- angr/procedures/definitions/win32/wdspxe.json +108 -0
- angr/procedures/definitions/win32/wdstptc.json +54 -0
- angr/procedures/definitions/win32/webauthn.json +54 -0
- angr/procedures/definitions/win32/webservices.json +594 -0
- angr/procedures/definitions/win32/websocket.json +54 -0
- angr/procedures/definitions/win32/wecapi.json +60 -0
- angr/procedures/definitions/win32/wer.json +78 -0
- angr/procedures/definitions/win32/wevtapi.json +120 -0
- angr/procedures/definitions/win32/winbio.json +177 -0
- angr/procedures/definitions/win32/windows_ai_machinelearning.json +18 -0
- angr/procedures/definitions/win32/windows_media_mediacontrol.json +39 -0
- angr/procedures/definitions/win32/windows_networking.json +18 -0
- angr/procedures/definitions/win32/windows_ui_xaml.json +21 -0
- angr/procedures/definitions/win32/windowscodecs.json +42 -0
- angr/procedures/definitions/win32/winfax.json +183 -0
- angr/procedures/definitions/win32/winhttp.json +183 -0
- angr/procedures/definitions/win32/winhvemulation.json +27 -0
- angr/procedures/definitions/win32/winhvplatform.json +213 -0
- angr/procedures/definitions/win32/wininet.json +903 -0
- angr/procedures/definitions/win32/winml.json +18 -0
- angr/procedures/definitions/win32/winmm.json +543 -0
- angr/procedures/definitions/win32/winscard.json +225 -0
- angr/procedures/definitions/win32/winspool_drv.json +531 -0
- angr/procedures/definitions/win32/wintrust.json +195 -0
- angr/procedures/definitions/win32/winusb.json +117 -0
- angr/procedures/definitions/win32/wlanapi.json +195 -0
- angr/procedures/definitions/win32/wlanui.json +18 -0
- angr/procedures/definitions/win32/wldap32.json +744 -0
- angr/procedures/definitions/win32/wldp.json +42 -0
- angr/procedures/definitions/win32/wmvcore.json +48 -0
- angr/procedures/definitions/win32/wnvapi.json +21 -0
- angr/procedures/definitions/win32/wofutil.json +48 -0
- angr/procedures/definitions/win32/ws2_32.json +495 -0
- angr/procedures/definitions/win32/wscapi.json +33 -0
- angr/procedures/definitions/win32/wsclient.json +24 -0
- angr/procedures/definitions/win32/wsdapi.json +111 -0
- angr/procedures/definitions/win32/wsmsvc.json +114 -0
- angr/procedures/definitions/win32/wsnmp32.json +162 -0
- angr/procedures/definitions/win32/wtsapi32.json +204 -0
- angr/procedures/definitions/win32/xaudio2_8.json +27 -0
- angr/procedures/definitions/win32/xinput1_4.json +36 -0
- angr/procedures/definitions/win32/xmllite.json +33 -0
- angr/procedures/definitions/win32/xolehlp.json +27 -0
- angr/procedures/definitions/win32/xpsprint.json +21 -0
- angr/procedures/glibc/__ctype_b_loc.py +21 -0
- angr/procedures/glibc/__ctype_tolower_loc.py +21 -0
- angr/procedures/glibc/__ctype_toupper_loc.py +21 -0
- angr/procedures/glibc/__errno_location.py +7 -0
- angr/procedures/glibc/__init__.py +3 -0
- angr/procedures/glibc/__libc_init.py +37 -0
- angr/procedures/glibc/__libc_start_main.py +301 -0
- angr/procedures/glibc/dynamic_loading.py +20 -0
- angr/procedures/glibc/scanf.py +19 -0
- angr/procedures/glibc/sscanf.py +10 -0
- angr/procedures/gnulib/__init__.py +3 -0
- angr/procedures/gnulib/xalloc_die.py +14 -0
- angr/procedures/gnulib/xstrtol_fatal.py +14 -0
- angr/procedures/java/__init__.py +42 -0
- angr/procedures/java/unconstrained.py +65 -0
- angr/procedures/java_io/__init__.py +0 -0
- angr/procedures/java_io/read.py +12 -0
- angr/procedures/java_io/write.py +17 -0
- angr/procedures/java_jni/__init__.py +482 -0
- angr/procedures/java_jni/array_operations.py +312 -0
- angr/procedures/java_jni/class_and_interface_operations.py +31 -0
- angr/procedures/java_jni/field_access.py +173 -0
- angr/procedures/java_jni/global_and_local_refs.py +57 -0
- angr/procedures/java_jni/method_calls.py +365 -0
- angr/procedures/java_jni/not_implemented.py +26 -0
- angr/procedures/java_jni/object_operations.py +94 -0
- angr/procedures/java_jni/string_operations.py +87 -0
- angr/procedures/java_jni/version_information.py +12 -0
- angr/procedures/java_lang/__init__.py +0 -0
- angr/procedures/java_lang/character.py +30 -0
- angr/procedures/java_lang/double.py +24 -0
- angr/procedures/java_lang/exit.py +13 -0
- angr/procedures/java_lang/getsimplename.py +18 -0
- angr/procedures/java_lang/integer.py +43 -0
- angr/procedures/java_lang/load_library.py +9 -0
- angr/procedures/java_lang/math.py +15 -0
- angr/procedures/java_lang/string.py +78 -0
- angr/procedures/java_lang/stringbuilder.py +44 -0
- angr/procedures/java_lang/system.py +18 -0
- angr/procedures/java_util/__init__.py +0 -0
- angr/procedures/java_util/collection.py +35 -0
- angr/procedures/java_util/iterator.py +46 -0
- angr/procedures/java_util/list.py +99 -0
- angr/procedures/java_util/map.py +131 -0
- angr/procedures/java_util/random.py +14 -0
- angr/procedures/java_util/scanner_nextline.py +23 -0
- angr/procedures/libc/__init__.py +3 -0
- angr/procedures/libc/abort.py +9 -0
- angr/procedures/libc/access.py +13 -0
- angr/procedures/libc/atoi.py +14 -0
- angr/procedures/libc/atol.py +13 -0
- angr/procedures/libc/calloc.py +8 -0
- angr/procedures/libc/closelog.py +10 -0
- angr/procedures/libc/err.py +14 -0
- angr/procedures/libc/error.py +54 -0
- angr/procedures/libc/exit.py +11 -0
- angr/procedures/libc/fclose.py +19 -0
- angr/procedures/libc/feof.py +21 -0
- angr/procedures/libc/fflush.py +16 -0
- angr/procedures/libc/fgetc.py +27 -0
- angr/procedures/libc/fgets.py +69 -0
- angr/procedures/libc/fopen.py +63 -0
- angr/procedures/libc/fprintf.py +25 -0
- angr/procedures/libc/fputc.py +23 -0
- angr/procedures/libc/fputs.py +24 -0
- angr/procedures/libc/fread.py +24 -0
- angr/procedures/libc/free.py +9 -0
- angr/procedures/libc/fscanf.py +20 -0
- angr/procedures/libc/fseek.py +34 -0
- angr/procedures/libc/ftell.py +22 -0
- angr/procedures/libc/fwrite.py +19 -0
- angr/procedures/libc/getchar.py +13 -0
- angr/procedures/libc/getdelim.py +99 -0
- angr/procedures/libc/getegid.py +8 -0
- angr/procedures/libc/geteuid.py +8 -0
- angr/procedures/libc/getgid.py +8 -0
- angr/procedures/libc/gets.py +68 -0
- angr/procedures/libc/getuid.py +8 -0
- angr/procedures/libc/malloc.py +12 -0
- angr/procedures/libc/memcmp.py +69 -0
- angr/procedures/libc/memcpy.py +45 -0
- angr/procedures/libc/memset.py +72 -0
- angr/procedures/libc/openlog.py +10 -0
- angr/procedures/libc/perror.py +13 -0
- angr/procedures/libc/printf.py +34 -0
- angr/procedures/libc/putchar.py +13 -0
- angr/procedures/libc/puts.py +19 -0
- angr/procedures/libc/rand.py +8 -0
- angr/procedures/libc/realloc.py +8 -0
- angr/procedures/libc/rewind.py +12 -0
- angr/procedures/libc/scanf.py +20 -0
- angr/procedures/libc/setbuf.py +9 -0
- angr/procedures/libc/setvbuf.py +7 -0
- angr/procedures/libc/snprintf.py +36 -0
- angr/procedures/libc/sprintf.py +25 -0
- angr/procedures/libc/srand.py +7 -0
- angr/procedures/libc/sscanf.py +13 -0
- angr/procedures/libc/stpcpy.py +18 -0
- angr/procedures/libc/strcat.py +14 -0
- angr/procedures/libc/strchr.py +48 -0
- angr/procedures/libc/strcmp.py +31 -0
- angr/procedures/libc/strcpy.py +13 -0
- angr/procedures/libc/strlen.py +114 -0
- angr/procedures/libc/strncat.py +19 -0
- angr/procedures/libc/strncmp.py +183 -0
- angr/procedures/libc/strncpy.py +22 -0
- angr/procedures/libc/strnlen.py +13 -0
- angr/procedures/libc/strstr.py +101 -0
- angr/procedures/libc/strtol.py +261 -0
- angr/procedures/libc/strtoul.py +9 -0
- angr/procedures/libc/system.py +13 -0
- angr/procedures/libc/time.py +9 -0
- angr/procedures/libc/tmpnam.py +20 -0
- angr/procedures/libc/tolower.py +10 -0
- angr/procedures/libc/toupper.py +10 -0
- angr/procedures/libc/ungetc.py +20 -0
- angr/procedures/libc/vsnprintf.py +17 -0
- angr/procedures/libc/wchar.py +16 -0
- angr/procedures/libstdcpp/__init__.py +0 -0
- angr/procedures/libstdcpp/_unwind_resume.py +11 -0
- angr/procedures/libstdcpp/std____throw_bad_alloc.py +13 -0
- angr/procedures/libstdcpp/std____throw_bad_cast.py +13 -0
- angr/procedures/libstdcpp/std____throw_length_error.py +13 -0
- angr/procedures/libstdcpp/std____throw_logic_error.py +13 -0
- angr/procedures/libstdcpp/std__terminate.py +13 -0
- angr/procedures/linux_kernel/__init__.py +3 -0
- angr/procedures/linux_kernel/access.py +18 -0
- angr/procedures/linux_kernel/arch_prctl.py +34 -0
- angr/procedures/linux_kernel/arm_user_helpers.py +59 -0
- angr/procedures/linux_kernel/brk.py +18 -0
- angr/procedures/linux_kernel/cwd.py +28 -0
- angr/procedures/linux_kernel/fstat.py +138 -0
- angr/procedures/linux_kernel/fstat64.py +170 -0
- angr/procedures/linux_kernel/futex.py +17 -0
- angr/procedures/linux_kernel/getegid.py +17 -0
- angr/procedures/linux_kernel/geteuid.py +17 -0
- angr/procedures/linux_kernel/getgid.py +17 -0
- angr/procedures/linux_kernel/getpid.py +14 -0
- angr/procedures/linux_kernel/getrlimit.py +24 -0
- angr/procedures/linux_kernel/gettid.py +9 -0
- angr/procedures/linux_kernel/getuid.py +17 -0
- angr/procedures/linux_kernel/iovec.py +47 -0
- angr/procedures/linux_kernel/lseek.py +42 -0
- angr/procedures/linux_kernel/mmap.py +16 -0
- angr/procedures/linux_kernel/mprotect.py +42 -0
- angr/procedures/linux_kernel/munmap.py +8 -0
- angr/procedures/linux_kernel/openat.py +26 -0
- angr/procedures/linux_kernel/set_tid_address.py +8 -0
- angr/procedures/linux_kernel/sigaction.py +19 -0
- angr/procedures/linux_kernel/sigprocmask.py +23 -0
- angr/procedures/linux_kernel/stat.py +23 -0
- angr/procedures/linux_kernel/sysinfo.py +59 -0
- angr/procedures/linux_kernel/tgkill.py +10 -0
- angr/procedures/linux_kernel/time.py +34 -0
- angr/procedures/linux_kernel/uid.py +30 -0
- angr/procedures/linux_kernel/uname.py +29 -0
- angr/procedures/linux_kernel/unlink.py +22 -0
- angr/procedures/linux_kernel/vsyscall.py +16 -0
- angr/procedures/linux_loader/__init__.py +3 -0
- angr/procedures/linux_loader/_dl_initial_error_catch_tsd.py +7 -0
- angr/procedures/linux_loader/_dl_rtld_lock.py +15 -0
- angr/procedures/linux_loader/sim_loader.py +54 -0
- angr/procedures/linux_loader/tls.py +40 -0
- angr/procedures/msvcr/__getmainargs.py +16 -0
- angr/procedures/msvcr/__init__.py +4 -0
- angr/procedures/msvcr/_initterm.py +38 -0
- angr/procedures/msvcr/fmode.py +31 -0
- angr/procedures/ntdll/__init__.py +0 -0
- angr/procedures/ntdll/exceptions.py +60 -0
- angr/procedures/posix/__init__.py +3 -0
- angr/procedures/posix/accept.py +29 -0
- angr/procedures/posix/bind.py +13 -0
- angr/procedures/posix/bzero.py +9 -0
- angr/procedures/posix/chroot.py +27 -0
- angr/procedures/posix/close.py +9 -0
- angr/procedures/posix/closedir.py +7 -0
- angr/procedures/posix/dup.py +56 -0
- angr/procedures/posix/fcntl.py +10 -0
- angr/procedures/posix/fdopen.py +76 -0
- angr/procedures/posix/fileno.py +18 -0
- angr/procedures/posix/fork.py +13 -0
- angr/procedures/posix/getenv.py +35 -0
- angr/procedures/posix/gethostbyname.py +43 -0
- angr/procedures/posix/getpass.py +19 -0
- angr/procedures/posix/getsockopt.py +11 -0
- angr/procedures/posix/htonl.py +11 -0
- angr/procedures/posix/htons.py +11 -0
- angr/procedures/posix/inet_ntoa.py +59 -0
- angr/procedures/posix/listen.py +13 -0
- angr/procedures/posix/mmap.py +144 -0
- angr/procedures/posix/open.py +18 -0
- angr/procedures/posix/opendir.py +10 -0
- angr/procedures/posix/poll.py +55 -0
- angr/procedures/posix/pread64.py +46 -0
- angr/procedures/posix/pthread.py +87 -0
- angr/procedures/posix/pwrite64.py +46 -0
- angr/procedures/posix/read.py +13 -0
- angr/procedures/posix/readdir.py +62 -0
- angr/procedures/posix/recv.py +13 -0
- angr/procedures/posix/recvfrom.py +13 -0
- angr/procedures/posix/select.py +48 -0
- angr/procedures/posix/send.py +23 -0
- angr/procedures/posix/setsockopt.py +9 -0
- angr/procedures/posix/sigaction.py +23 -0
- angr/procedures/posix/sim_time.py +48 -0
- angr/procedures/posix/sleep.py +8 -0
- angr/procedures/posix/socket.py +18 -0
- angr/procedures/posix/strcasecmp.py +26 -0
- angr/procedures/posix/strdup.py +18 -0
- angr/procedures/posix/strtok_r.py +64 -0
- angr/procedures/posix/syslog.py +15 -0
- angr/procedures/posix/tz.py +9 -0
- angr/procedures/posix/unlink.py +11 -0
- angr/procedures/posix/usleep.py +8 -0
- angr/procedures/posix/write.py +13 -0
- angr/procedures/procedure_dict.py +50 -0
- angr/procedures/stubs/CallReturn.py +13 -0
- angr/procedures/stubs/NoReturnUnconstrained.py +13 -0
- angr/procedures/stubs/Nop.py +7 -0
- angr/procedures/stubs/PathTerminator.py +9 -0
- angr/procedures/stubs/Redirect.py +18 -0
- angr/procedures/stubs/ReturnChar.py +11 -0
- angr/procedures/stubs/ReturnUnconstrained.py +24 -0
- angr/procedures/stubs/UnresolvableCallTarget.py +9 -0
- angr/procedures/stubs/UnresolvableJumpTarget.py +9 -0
- angr/procedures/stubs/UserHook.py +18 -0
- angr/procedures/stubs/__init__.py +3 -0
- angr/procedures/stubs/b64_decode.py +15 -0
- angr/procedures/stubs/caller.py +14 -0
- angr/procedures/stubs/crazy_scanf.py +20 -0
- angr/procedures/stubs/format_parser.py +669 -0
- angr/procedures/stubs/syscall_stub.py +24 -0
- angr/procedures/testing/__init__.py +3 -0
- angr/procedures/testing/manyargs.py +9 -0
- angr/procedures/testing/retreg.py +8 -0
- angr/procedures/tracer/__init__.py +4 -0
- angr/procedures/tracer/random.py +9 -0
- angr/procedures/tracer/receive.py +23 -0
- angr/procedures/tracer/transmit.py +26 -0
- angr/procedures/uclibc/__init__.py +3 -0
- angr/procedures/uclibc/__uClibc_main.py +10 -0
- angr/procedures/win32/EncodePointer.py +7 -0
- angr/procedures/win32/ExitProcess.py +9 -0
- angr/procedures/win32/GetCommandLine.py +12 -0
- angr/procedures/win32/GetCurrentProcessId.py +7 -0
- angr/procedures/win32/GetCurrentThreadId.py +7 -0
- angr/procedures/win32/GetLastInputInfo.py +40 -0
- angr/procedures/win32/GetModuleHandle.py +29 -0
- angr/procedures/win32/GetProcessAffinityMask.py +37 -0
- angr/procedures/win32/InterlockedExchange.py +15 -0
- angr/procedures/win32/IsProcessorFeaturePresent.py +7 -0
- angr/procedures/win32/VirtualAlloc.py +114 -0
- angr/procedures/win32/VirtualProtect.py +60 -0
- angr/procedures/win32/__init__.py +3 -0
- angr/procedures/win32/critical_section.py +12 -0
- angr/procedures/win32/dynamic_loading.py +104 -0
- angr/procedures/win32/file_handles.py +47 -0
- angr/procedures/win32/gethostbyname.py +12 -0
- angr/procedures/win32/heap.py +45 -0
- angr/procedures/win32/is_bad_ptr.py +26 -0
- angr/procedures/win32/local_storage.py +88 -0
- angr/procedures/win32/mutex.py +11 -0
- angr/procedures/win32/sim_time.py +135 -0
- angr/procedures/win32/system_paths.py +35 -0
- angr/procedures/win32_kernel/ExAllocatePool.py +13 -0
- angr/procedures/win32_kernel/ExFreePoolWithTag.py +8 -0
- angr/procedures/win32_kernel/__fastfail.py +15 -0
- angr/procedures/win32_kernel/__init__.py +3 -0
- angr/procedures/win_user32/__init__.py +0 -0
- angr/procedures/win_user32/chars.py +15 -0
- angr/procedures/win_user32/keyboard.py +14 -0
- angr/procedures/win_user32/messagebox.py +49 -0
- angr/project.py +860 -0
- angr/protos/__init__.py +19 -0
- angr/protos/cfg_pb2.py +42 -0
- angr/protos/function_pb2.py +38 -0
- angr/protos/primitives_pb2.py +59 -0
- angr/protos/variables_pb2.py +55 -0
- angr/protos/xrefs_pb2.py +36 -0
- angr/py.typed +1 -0
- angr/rustylib.cpython-311-darwin.so +0 -0
- angr/serializable.py +66 -0
- angr/sim_manager.py +971 -0
- angr/sim_options.py +436 -0
- angr/sim_procedure.py +626 -0
- angr/sim_state.py +926 -0
- angr/sim_state_options.py +403 -0
- angr/sim_type.py +4026 -0
- angr/sim_variable.py +470 -0
- angr/simos/__init__.py +47 -0
- angr/simos/cgc.py +153 -0
- angr/simos/javavm.py +458 -0
- angr/simos/linux.py +509 -0
- angr/simos/simos.py +444 -0
- angr/simos/snimmuc_nxp.py +149 -0
- angr/simos/userland.py +163 -0
- angr/simos/windows.py +615 -0
- angr/simos/xbox.py +32 -0
- angr/slicer.py +352 -0
- angr/state_hierarchy.py +262 -0
- angr/state_plugins/__init__.py +84 -0
- angr/state_plugins/callstack.py +478 -0
- angr/state_plugins/cgc.py +155 -0
- angr/state_plugins/debug_variables.py +192 -0
- angr/state_plugins/filesystem.py +463 -0
- angr/state_plugins/gdb.py +148 -0
- angr/state_plugins/globals.py +65 -0
- angr/state_plugins/heap/__init__.py +15 -0
- angr/state_plugins/heap/heap_base.py +128 -0
- angr/state_plugins/heap/heap_brk.py +136 -0
- angr/state_plugins/heap/heap_freelist.py +213 -0
- angr/state_plugins/heap/heap_libc.py +46 -0
- angr/state_plugins/heap/heap_ptmalloc.py +620 -0
- angr/state_plugins/heap/utils.py +22 -0
- angr/state_plugins/history.py +564 -0
- angr/state_plugins/inspect.py +375 -0
- angr/state_plugins/javavm_classloader.py +134 -0
- angr/state_plugins/jni_references.py +95 -0
- angr/state_plugins/libc.py +1263 -0
- angr/state_plugins/light_registers.py +168 -0
- angr/state_plugins/log.py +84 -0
- angr/state_plugins/loop_data.py +92 -0
- angr/state_plugins/plugin.py +176 -0
- angr/state_plugins/posix.py +703 -0
- angr/state_plugins/preconstrainer.py +196 -0
- angr/state_plugins/scratch.py +173 -0
- angr/state_plugins/sim_action.py +326 -0
- angr/state_plugins/sim_action_object.py +271 -0
- angr/state_plugins/sim_event.py +59 -0
- angr/state_plugins/solver.py +1128 -0
- angr/state_plugins/symbolizer.py +291 -0
- angr/state_plugins/trace_additions.py +738 -0
- angr/state_plugins/uc_manager.py +94 -0
- angr/state_plugins/unicorn_engine.py +1920 -0
- angr/state_plugins/view.py +340 -0
- angr/storage/__init__.py +15 -0
- angr/storage/file.py +1210 -0
- angr/storage/memory_mixins/__init__.py +317 -0
- angr/storage/memory_mixins/actions_mixin.py +72 -0
- angr/storage/memory_mixins/address_concretization_mixin.py +384 -0
- angr/storage/memory_mixins/bvv_conversion_mixin.py +73 -0
- angr/storage/memory_mixins/clouseau_mixin.py +137 -0
- angr/storage/memory_mixins/conditional_store_mixin.py +25 -0
- angr/storage/memory_mixins/convenient_mappings_mixin.py +256 -0
- angr/storage/memory_mixins/default_filler_mixin.py +144 -0
- angr/storage/memory_mixins/dirty_addrs_mixin.py +11 -0
- angr/storage/memory_mixins/hex_dumper_mixin.py +82 -0
- angr/storage/memory_mixins/javavm_memory_mixin.py +392 -0
- angr/storage/memory_mixins/keyvalue_memory_mixin.py +43 -0
- angr/storage/memory_mixins/label_merger_mixin.py +31 -0
- angr/storage/memory_mixins/memory_mixin.py +175 -0
- angr/storage/memory_mixins/multi_value_merger_mixin.py +79 -0
- angr/storage/memory_mixins/name_resolution_mixin.py +67 -0
- angr/storage/memory_mixins/paged_memory/__init__.py +0 -0
- angr/storage/memory_mixins/paged_memory/page_backer_mixins.py +266 -0
- angr/storage/memory_mixins/paged_memory/paged_memory_mixin.py +743 -0
- angr/storage/memory_mixins/paged_memory/paged_memory_multivalue_mixin.py +65 -0
- angr/storage/memory_mixins/paged_memory/pages/__init__.py +26 -0
- angr/storage/memory_mixins/paged_memory/pages/base.py +31 -0
- angr/storage/memory_mixins/paged_memory/pages/cooperation.py +341 -0
- angr/storage/memory_mixins/paged_memory/pages/history_tracking_mixin.py +92 -0
- angr/storage/memory_mixins/paged_memory/pages/ispo_mixin.py +55 -0
- angr/storage/memory_mixins/paged_memory/pages/list_page.py +338 -0
- angr/storage/memory_mixins/paged_memory/pages/multi_values.py +324 -0
- angr/storage/memory_mixins/paged_memory/pages/mv_list_page.py +419 -0
- angr/storage/memory_mixins/paged_memory/pages/permissions_mixin.py +36 -0
- angr/storage/memory_mixins/paged_memory/pages/refcount_mixin.py +52 -0
- angr/storage/memory_mixins/paged_memory/pages/ultra_page.py +529 -0
- angr/storage/memory_mixins/paged_memory/privileged_mixin.py +36 -0
- angr/storage/memory_mixins/paged_memory/stack_allocation_mixin.py +74 -0
- angr/storage/memory_mixins/regioned_memory/__init__.py +17 -0
- angr/storage/memory_mixins/regioned_memory/abstract_address_descriptor.py +36 -0
- angr/storage/memory_mixins/regioned_memory/abstract_merger_mixin.py +31 -0
- angr/storage/memory_mixins/regioned_memory/region_category_mixin.py +9 -0
- angr/storage/memory_mixins/regioned_memory/region_data.py +246 -0
- angr/storage/memory_mixins/regioned_memory/region_meta_mixin.py +241 -0
- angr/storage/memory_mixins/regioned_memory/regioned_address_concretization_mixin.py +119 -0
- angr/storage/memory_mixins/regioned_memory/regioned_memory_mixin.py +442 -0
- angr/storage/memory_mixins/regioned_memory/static_find_mixin.py +69 -0
- angr/storage/memory_mixins/simple_interface_mixin.py +71 -0
- angr/storage/memory_mixins/simplification_mixin.py +15 -0
- angr/storage/memory_mixins/size_resolution_mixin.py +143 -0
- angr/storage/memory_mixins/slotted_memory.py +140 -0
- angr/storage/memory_mixins/smart_find_mixin.py +161 -0
- angr/storage/memory_mixins/symbolic_merger_mixin.py +16 -0
- angr/storage/memory_mixins/top_merger_mixin.py +25 -0
- angr/storage/memory_mixins/underconstrained_mixin.py +67 -0
- angr/storage/memory_mixins/unwrapper_mixin.py +26 -0
- angr/storage/memory_object.py +195 -0
- angr/tablespecs.py +91 -0
- angr/unicornlib.dylib +0 -0
- angr/utils/__init__.py +46 -0
- angr/utils/ail.py +176 -0
- angr/utils/algo.py +34 -0
- angr/utils/balancer.py +776 -0
- angr/utils/bits.py +46 -0
- angr/utils/constants.py +9 -0
- angr/utils/cowdict.py +63 -0
- angr/utils/cpp.py +17 -0
- angr/utils/doms.py +150 -0
- angr/utils/dynamic_dictlist.py +89 -0
- angr/utils/endness.py +18 -0
- angr/utils/enums_conv.py +97 -0
- angr/utils/env.py +12 -0
- angr/utils/formatting.py +128 -0
- angr/utils/funcid.py +244 -0
- angr/utils/graph.py +981 -0
- angr/utils/lazy_import.py +13 -0
- angr/utils/library.py +236 -0
- angr/utils/loader.py +55 -0
- angr/utils/mp.py +66 -0
- angr/utils/orderedset.py +74 -0
- angr/utils/ssa/__init__.py +455 -0
- angr/utils/ssa/tmp_uses_collector.py +23 -0
- angr/utils/ssa/vvar_uses_collector.py +36 -0
- angr/utils/strings.py +20 -0
- angr/utils/tagged_interval_map.py +112 -0
- angr/utils/timing.py +74 -0
- angr/utils/types.py +193 -0
- angr/utils/vex.py +11 -0
- angr/vaults.py +367 -0
- angr-9.2.192.dist-info/METADATA +112 -0
- angr-9.2.192.dist-info/RECORD +1442 -0
- angr-9.2.192.dist-info/WHEEL +6 -0
- angr-9.2.192.dist-info/entry_points.txt +2 -0
- angr-9.2.192.dist-info/licenses/LICENSE +27 -0
- angr-9.2.192.dist-info/top_level.txt +1 -0
angr/utils/graph.py
ADDED
|
@@ -0,0 +1,981 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import Any, TypeVar, Generic
|
|
3
|
+
from collections.abc import Iterable, Iterator
|
|
4
|
+
from collections import defaultdict, OrderedDict
|
|
5
|
+
import logging
|
|
6
|
+
|
|
7
|
+
import networkx
|
|
8
|
+
import networkx.algorithms
|
|
9
|
+
|
|
10
|
+
T = TypeVar("T")
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def shallow_reverse(g: networkx.DiGraph[T]) -> networkx.DiGraph[T]:
|
|
14
|
+
"""
|
|
15
|
+
Make a shallow copy of a directional graph and reverse the edges. This is a workaround to solve the issue that one
|
|
16
|
+
cannot easily make a shallow reversed copy of a graph in NetworkX 2, since networkx.reverse(copy=False) now returns
|
|
17
|
+
a GraphView, and GraphViews are always read-only.
|
|
18
|
+
|
|
19
|
+
:param networkx.DiGraph g: The graph to reverse.
|
|
20
|
+
:return: A new networkx.DiGraph that has all nodes and all edges of the original graph, with
|
|
21
|
+
edges reversed.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
new_g = networkx.DiGraph()
|
|
25
|
+
|
|
26
|
+
new_g.add_nodes_from(g.nodes())
|
|
27
|
+
for src, dst, data in g.edges(data=True):
|
|
28
|
+
new_g.add_edge(dst, src, **data)
|
|
29
|
+
|
|
30
|
+
return new_g
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def inverted_idoms(
|
|
34
|
+
graph: networkx.DiGraph[T], end_node: T | None = None
|
|
35
|
+
) -> tuple[networkx.DiGraph[T], dict[T, T] | None]:
|
|
36
|
+
"""
|
|
37
|
+
Invert the given graph and generate the immediate dominator tree on the inverted graph. This is useful for
|
|
38
|
+
computing post-dominators.
|
|
39
|
+
|
|
40
|
+
:param graph: The graph to invert and generate immediate dominator tree for.
|
|
41
|
+
:return: A tuple of the inverted graph and the immediate dominator tree.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
inverted_graph: networkx.DiGraph = shallow_reverse(graph)
|
|
45
|
+
end_nodes = {n for n in graph.nodes() if graph.out_degree(n) == 0} if end_node is None else {end_node}
|
|
46
|
+
if end_nodes:
|
|
47
|
+
if len(end_nodes) > 1:
|
|
48
|
+
# make sure there is only one end node
|
|
49
|
+
dummy_node = "DUMMY_NODE"
|
|
50
|
+
for end_node2 in end_nodes:
|
|
51
|
+
inverted_graph.add_edge(dummy_node, end_node2)
|
|
52
|
+
endnode = dummy_node
|
|
53
|
+
else:
|
|
54
|
+
endnode = next(iter(end_nodes)) # pick the end node
|
|
55
|
+
|
|
56
|
+
idoms = networkx.immediate_dominators(inverted_graph, endnode)
|
|
57
|
+
idoms[endnode] = endnode
|
|
58
|
+
else:
|
|
59
|
+
idoms = None
|
|
60
|
+
return inverted_graph, idoms
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def to_acyclic_graph(
|
|
64
|
+
graph: networkx.DiGraph[T], node_order: dict[T, int] | None = None, loop_heads: list[T] | None = None
|
|
65
|
+
) -> networkx.DiGraph[T]:
|
|
66
|
+
"""
|
|
67
|
+
Convert a given DiGraph into an acyclic graph.
|
|
68
|
+
|
|
69
|
+
:param graph: The graph to convert.
|
|
70
|
+
:param ordered_nodes: A list of nodes sorted in a topological order.
|
|
71
|
+
:param loop_heads: A list of known loop head nodes.
|
|
72
|
+
:return: The converted acyclic graph.
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
if node_order is None:
|
|
76
|
+
# take the quasi-topological order of the graph
|
|
77
|
+
ordered_nodes = GraphUtils.quasi_topological_sort_nodes(graph, loop_heads=loop_heads)
|
|
78
|
+
node_order = {n: i for i, n in enumerate(ordered_nodes)}
|
|
79
|
+
|
|
80
|
+
# add each node and its edge into the graph
|
|
81
|
+
edges_to_remove = []
|
|
82
|
+
for src, dst in graph.edges():
|
|
83
|
+
src_order = node_order[src]
|
|
84
|
+
dst_order = node_order[dst]
|
|
85
|
+
if src_order >= dst_order:
|
|
86
|
+
# this is a back edge, we need to remove it
|
|
87
|
+
edges_to_remove.append((src, dst))
|
|
88
|
+
|
|
89
|
+
acyclic_graph = graph.copy()
|
|
90
|
+
acyclic_graph.remove_edges_from(edges_to_remove)
|
|
91
|
+
return acyclic_graph
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def dfs_back_edges(
|
|
95
|
+
graph: networkx.DiGraph[T], start_node: T, *, visit_all_nodes: bool = False, visited: set[T] | None = None
|
|
96
|
+
) -> Iterator[tuple[T, T]]:
|
|
97
|
+
"""
|
|
98
|
+
Perform an iterative DFS traversal of the graph, returning back edges.
|
|
99
|
+
|
|
100
|
+
:param graph: The graph to traverse.
|
|
101
|
+
:param start_node: The node where to start the traversal.
|
|
102
|
+
:returns: An iterator of 'backward' edges.
|
|
103
|
+
"""
|
|
104
|
+
if start_node not in graph:
|
|
105
|
+
return # Ensures that the start node is in the graph
|
|
106
|
+
|
|
107
|
+
visited = set() if visited is None else visited # Tracks visited nodes
|
|
108
|
+
finished = set() # Tracks nodes whose descendants are fully explored
|
|
109
|
+
stack = [(start_node, iter(sorted(graph[start_node], key=GraphUtils._sort_node)))]
|
|
110
|
+
|
|
111
|
+
while stack:
|
|
112
|
+
node, children = stack[-1]
|
|
113
|
+
visited.add(node)
|
|
114
|
+
|
|
115
|
+
try:
|
|
116
|
+
child = next(children)
|
|
117
|
+
if child in visited:
|
|
118
|
+
if child not in finished:
|
|
119
|
+
yield node, child # Found a back edge
|
|
120
|
+
elif child not in finished: # Check if the child has not been finished
|
|
121
|
+
stack.append((child, iter(sorted(graph[child], key=GraphUtils._sort_node))))
|
|
122
|
+
except StopIteration:
|
|
123
|
+
stack.pop() # Done with this node's children
|
|
124
|
+
finished.add(node) # Mark this node as finished
|
|
125
|
+
|
|
126
|
+
if visit_all_nodes:
|
|
127
|
+
while len(visited) < len(graph):
|
|
128
|
+
# If we need to visit all nodes, we can start from unvisited nodes
|
|
129
|
+
node = sorted(set(graph) - visited, key=GraphUtils._sort_node)[0]
|
|
130
|
+
yield from dfs_back_edges(graph, node, visited=visited)
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def subgraph_between_nodes(
|
|
134
|
+
graph: networkx.DiGraph[T], source: T, frontier: Iterable[T], include_frontier: bool = False
|
|
135
|
+
) -> networkx.DiGraph[T]:
|
|
136
|
+
"""
|
|
137
|
+
For a directed graph, return a subgraph that includes all nodes going from a source node to a target node.
|
|
138
|
+
|
|
139
|
+
:param networkx.DiGraph graph: The directed graph.
|
|
140
|
+
:param source: The source node.
|
|
141
|
+
:param list frontier: A collection of target nodes.
|
|
142
|
+
:param bool include_frontier: Should nodes in frontier be included in the subgraph.
|
|
143
|
+
:return: A subgraph.
|
|
144
|
+
:rtype: networkx.DiGraph
|
|
145
|
+
"""
|
|
146
|
+
|
|
147
|
+
graph = networkx.DiGraph(graph) # make a copy
|
|
148
|
+
for pred in list(graph.predecessors(source)):
|
|
149
|
+
# make sure we cannot go from any other node to the source node
|
|
150
|
+
graph.remove_edge(pred, source)
|
|
151
|
+
|
|
152
|
+
g0 = networkx.DiGraph()
|
|
153
|
+
|
|
154
|
+
if source not in graph or any(node not in graph for node in frontier):
|
|
155
|
+
raise KeyError("Source node or frontier nodes are not in the source graph.")
|
|
156
|
+
|
|
157
|
+
# BFS on graph and add new nodes to g0
|
|
158
|
+
queue = [source]
|
|
159
|
+
traversed = set()
|
|
160
|
+
|
|
161
|
+
frontier = set(frontier)
|
|
162
|
+
|
|
163
|
+
while queue:
|
|
164
|
+
node = queue.pop(0)
|
|
165
|
+
traversed.add(node)
|
|
166
|
+
|
|
167
|
+
for _, succ, data in graph.out_edges(node, data=True):
|
|
168
|
+
if g0.has_edge(node, succ):
|
|
169
|
+
continue
|
|
170
|
+
|
|
171
|
+
g0.add_edge(node, succ, **data)
|
|
172
|
+
if succ in traversed or succ in frontier:
|
|
173
|
+
continue
|
|
174
|
+
for frontier_node in frontier:
|
|
175
|
+
if networkx.has_path(graph, succ, frontier_node):
|
|
176
|
+
queue.append(succ)
|
|
177
|
+
break
|
|
178
|
+
|
|
179
|
+
# recursively remove all nodes that have less than two neighbors
|
|
180
|
+
to_remove = [
|
|
181
|
+
n
|
|
182
|
+
for n in g0.nodes()
|
|
183
|
+
if n not in frontier and n is not source and (g0.out_degree[n] == 0 or g0.in_degree[n] == 0)
|
|
184
|
+
]
|
|
185
|
+
while to_remove:
|
|
186
|
+
g0.remove_nodes_from(to_remove)
|
|
187
|
+
to_remove = [
|
|
188
|
+
n
|
|
189
|
+
for n in g0.nodes()
|
|
190
|
+
if n not in frontier and n is not source and (g0.out_degree[n] == 0 or g0.in_degree[n] == 0)
|
|
191
|
+
]
|
|
192
|
+
|
|
193
|
+
if not include_frontier:
|
|
194
|
+
# remove the frontier nodes
|
|
195
|
+
g0.remove_nodes_from(frontier)
|
|
196
|
+
|
|
197
|
+
return g0
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def dominates(idom: dict[T, T], dominator_node: T, node: T) -> bool:
|
|
201
|
+
n = node
|
|
202
|
+
while n:
|
|
203
|
+
if n == dominator_node:
|
|
204
|
+
return True
|
|
205
|
+
n = idom[n] if n in idom and n != idom[n] else None
|
|
206
|
+
return False
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
#
|
|
210
|
+
# Dominance frontier
|
|
211
|
+
#
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def compute_dominance_frontier(graph: networkx.DiGraph[T], domtree: networkx.DiGraph[T]) -> dict[T, set[T]]:
|
|
215
|
+
"""
|
|
216
|
+
Compute a dominance frontier based on the given post-dominator tree.
|
|
217
|
+
|
|
218
|
+
This implementation is based on figure 2 of paper An Efficient Method of Computing Static Single Assignment
|
|
219
|
+
Form by Ron Cytron, etc.
|
|
220
|
+
|
|
221
|
+
:param graph: The graph where we want to compute the dominance frontier.
|
|
222
|
+
:param domtree: The dominator tree
|
|
223
|
+
:returns: A dict of dominance frontier
|
|
224
|
+
"""
|
|
225
|
+
|
|
226
|
+
df = {}
|
|
227
|
+
|
|
228
|
+
# Perform a post-order search on the dominator tree
|
|
229
|
+
for x in networkx.dfs_postorder_nodes(domtree):
|
|
230
|
+
if x not in graph:
|
|
231
|
+
# Skip nodes that are not in the graph
|
|
232
|
+
continue
|
|
233
|
+
|
|
234
|
+
df[x] = set()
|
|
235
|
+
|
|
236
|
+
# local set
|
|
237
|
+
for y in graph.successors(x):
|
|
238
|
+
if x not in domtree.predecessors(y):
|
|
239
|
+
df[x].add(y)
|
|
240
|
+
|
|
241
|
+
# up set
|
|
242
|
+
if x is None:
|
|
243
|
+
continue
|
|
244
|
+
|
|
245
|
+
for z in domtree.successors(x):
|
|
246
|
+
if z is x:
|
|
247
|
+
continue
|
|
248
|
+
if z not in df:
|
|
249
|
+
continue
|
|
250
|
+
for y in df[z]:
|
|
251
|
+
if x not in list(domtree.predecessors(y)):
|
|
252
|
+
df[x].add(y)
|
|
253
|
+
|
|
254
|
+
return df
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
#
|
|
258
|
+
# Dominators and post-dominators
|
|
259
|
+
#
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
class TemporaryNode:
|
|
263
|
+
"""
|
|
264
|
+
A temporary node.
|
|
265
|
+
|
|
266
|
+
Used as the start node and end node in post-dominator tree generation. Also used in some test cases.
|
|
267
|
+
"""
|
|
268
|
+
|
|
269
|
+
__slots__ = ["_label"]
|
|
270
|
+
|
|
271
|
+
def __init__(self, label):
|
|
272
|
+
self._label = label
|
|
273
|
+
|
|
274
|
+
def __repr__(self):
|
|
275
|
+
return f"TN[{self._label}]"
|
|
276
|
+
|
|
277
|
+
def __eq__(self, other):
|
|
278
|
+
return bool(isinstance(other, TemporaryNode) and other._label == self._label)
|
|
279
|
+
|
|
280
|
+
def __hash__(self):
|
|
281
|
+
return hash(("TemporaryNode", self._label))
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
class ContainerNode(Generic[T]):
|
|
285
|
+
"""
|
|
286
|
+
A container node.
|
|
287
|
+
|
|
288
|
+
Only used in dominator tree generation. We did this so we can set the index property without modifying the
|
|
289
|
+
original object.
|
|
290
|
+
"""
|
|
291
|
+
|
|
292
|
+
__slots__ = ["_obj", "index"]
|
|
293
|
+
|
|
294
|
+
def __init__(self, obj: T):
|
|
295
|
+
self._obj = obj
|
|
296
|
+
self.index: int | None = None
|
|
297
|
+
|
|
298
|
+
@property
|
|
299
|
+
def obj(self) -> T:
|
|
300
|
+
return self._obj
|
|
301
|
+
|
|
302
|
+
def __eq__(self, other: Any):
|
|
303
|
+
if isinstance(other, ContainerNode):
|
|
304
|
+
return self._obj is other._obj
|
|
305
|
+
return False
|
|
306
|
+
|
|
307
|
+
def __hash__(self):
|
|
308
|
+
return hash(("CN", self._obj))
|
|
309
|
+
|
|
310
|
+
def __repr__(self):
|
|
311
|
+
return f"CN[{self._obj!r}]"
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
class Dominators(Generic[T]):
|
|
315
|
+
"""
|
|
316
|
+
Describes dominators in a graph.
|
|
317
|
+
"""
|
|
318
|
+
|
|
319
|
+
dom: networkx.DiGraph[T]
|
|
320
|
+
|
|
321
|
+
def __init__(self, graph: networkx.DiGraph[T], entry_node: T, successors_func=None, reverse=False):
|
|
322
|
+
self._l = logging.getLogger("utils.graph.dominators")
|
|
323
|
+
self._graph_successors_func = successors_func
|
|
324
|
+
|
|
325
|
+
self._reverse = reverse # Set it to True to generate a post-dominator tree.
|
|
326
|
+
|
|
327
|
+
# Temporary variables
|
|
328
|
+
self._ancestor: list[ContainerNode | None] | None = None
|
|
329
|
+
self._semi: list[ContainerNode] | None = None
|
|
330
|
+
self._label = None
|
|
331
|
+
|
|
332
|
+
# Output
|
|
333
|
+
self.dom = None # type: ignore # this is guaranteed to be not null after the __init__ returns
|
|
334
|
+
self.prepared_graph = None
|
|
335
|
+
|
|
336
|
+
self._construct(graph, entry_node)
|
|
337
|
+
|
|
338
|
+
def _graph_successors(self, graph, node):
|
|
339
|
+
"""
|
|
340
|
+
Return the successors of a node in the graph.
|
|
341
|
+
This method can be overridden in case there are special requirements with the graph and the successors. For
|
|
342
|
+
example, when we are dealing with a control flow graph, we may not want to get the FakeRet successors.
|
|
343
|
+
|
|
344
|
+
:param graph: The graph.
|
|
345
|
+
:param node: The node of which we want to get the successors.
|
|
346
|
+
:return: An iterator of successors.
|
|
347
|
+
:rtype: iter
|
|
348
|
+
"""
|
|
349
|
+
|
|
350
|
+
if self._graph_successors_func is not None:
|
|
351
|
+
return self._graph_successors_func(graph, node)
|
|
352
|
+
|
|
353
|
+
return graph.successors(node)
|
|
354
|
+
|
|
355
|
+
def _construct(self, graph, entry_node):
|
|
356
|
+
"""
|
|
357
|
+
Find post-dominators for each node in the graph.
|
|
358
|
+
|
|
359
|
+
This implementation is based on paper A Fast Algorithm for Finding Dominators in a Flow Graph by Thomas
|
|
360
|
+
Lengauer and Robert E. Tarjan from Stanford University, ACM Transactions on Programming Languages and Systems,
|
|
361
|
+
Vol. 1, No. 1, July 1979
|
|
362
|
+
"""
|
|
363
|
+
|
|
364
|
+
# Step 1
|
|
365
|
+
|
|
366
|
+
_prepared_graph, vertices, parent = self._prepare_graph(graph, entry_node)
|
|
367
|
+
# vertices is a list of ContainerNode instances
|
|
368
|
+
# parent is a dict storing the mapping from ContainerNode to ContainerNode
|
|
369
|
+
# Each node in prepared_graph is a ContainerNode instance
|
|
370
|
+
|
|
371
|
+
assert self._semi is not None
|
|
372
|
+
|
|
373
|
+
bucket: dict[int, set[ContainerNode]] = defaultdict(set)
|
|
374
|
+
dom: list[None | ContainerNode] = [None] * (len(vertices))
|
|
375
|
+
self._ancestor = [None] * (len(vertices) + 1) # type: ignore
|
|
376
|
+
|
|
377
|
+
for i in range(len(vertices) - 1, 0, -1):
|
|
378
|
+
w = vertices[i]
|
|
379
|
+
|
|
380
|
+
# Step 2
|
|
381
|
+
if w not in parent:
|
|
382
|
+
# It's one of the start nodes
|
|
383
|
+
continue
|
|
384
|
+
|
|
385
|
+
predecessors = _prepared_graph.predecessors(w)
|
|
386
|
+
for v in predecessors:
|
|
387
|
+
u = self._pd_eval(v)
|
|
388
|
+
if self._semi[u.index].index < self._semi[w.index].index:
|
|
389
|
+
self._semi[w.index] = self._semi[u.index]
|
|
390
|
+
|
|
391
|
+
bucket[vertices[self._semi[w.index].index].index].add(w)
|
|
392
|
+
|
|
393
|
+
self._pd_link(parent[w], w)
|
|
394
|
+
|
|
395
|
+
# Step 3
|
|
396
|
+
for v in bucket[parent[w].index]:
|
|
397
|
+
u = self._pd_eval(v)
|
|
398
|
+
assert u.index is not None and v.index is not None
|
|
399
|
+
if self._semi[u.index].index < self._semi[v.index].index:
|
|
400
|
+
dom[v.index] = u
|
|
401
|
+
else:
|
|
402
|
+
dom[v.index] = parent[w]
|
|
403
|
+
|
|
404
|
+
bucket[parent[w].index].clear()
|
|
405
|
+
|
|
406
|
+
for i in range(1, len(vertices)):
|
|
407
|
+
w = vertices[i]
|
|
408
|
+
if w not in parent:
|
|
409
|
+
continue
|
|
410
|
+
if dom[w.index].index != vertices[self._semi[w.index].index].index:
|
|
411
|
+
dom[w.index] = dom[dom[w.index].index]
|
|
412
|
+
|
|
413
|
+
self.dom = networkx.DiGraph() # The post-dom tree described in a directional graph
|
|
414
|
+
for i in range(1, len(vertices)):
|
|
415
|
+
if dom[i] is not None and vertices[i] is not None:
|
|
416
|
+
self.dom.add_edge(dom[i].obj, vertices[i].obj) # type: ignore
|
|
417
|
+
|
|
418
|
+
# Output
|
|
419
|
+
self.prepared_graph = _prepared_graph
|
|
420
|
+
|
|
421
|
+
def _prepare_graph(self, graph, entry):
|
|
422
|
+
# We want to reverse the graph, and label each node according to its order in a DFS
|
|
423
|
+
new_graph = networkx.DiGraph()
|
|
424
|
+
|
|
425
|
+
n = entry
|
|
426
|
+
|
|
427
|
+
queue = [n]
|
|
428
|
+
start_node = TemporaryNode("start_node")
|
|
429
|
+
# Put the start_node into a Container as well
|
|
430
|
+
start_node = ContainerNode(start_node)
|
|
431
|
+
# Create the end_node, too
|
|
432
|
+
end_node = ContainerNode(TemporaryNode("end_node"))
|
|
433
|
+
|
|
434
|
+
container_nodes = {}
|
|
435
|
+
|
|
436
|
+
traversed_nodes = set()
|
|
437
|
+
endnode_encountered = False
|
|
438
|
+
while queue:
|
|
439
|
+
node = queue.pop()
|
|
440
|
+
|
|
441
|
+
successors = list(self._graph_successors(graph, node))
|
|
442
|
+
|
|
443
|
+
# Put it into a container
|
|
444
|
+
if node in container_nodes:
|
|
445
|
+
container_node = container_nodes[node]
|
|
446
|
+
else:
|
|
447
|
+
container_node = ContainerNode(node)
|
|
448
|
+
container_nodes[node] = container_node
|
|
449
|
+
|
|
450
|
+
traversed_nodes.add(container_node)
|
|
451
|
+
|
|
452
|
+
if len(successors) == 0:
|
|
453
|
+
# Note that this condition may never be satisfied if there is no real "end node" in the graph: the graph
|
|
454
|
+
# may end with a loop.
|
|
455
|
+
if self._reverse:
|
|
456
|
+
# Add an edge between the start node and this node
|
|
457
|
+
endnode_encountered = True
|
|
458
|
+
new_graph.add_edge(start_node, container_node)
|
|
459
|
+
else:
|
|
460
|
+
# Add an edge between our this node and end node
|
|
461
|
+
endnode_encountered = True
|
|
462
|
+
new_graph.add_edge(container_node, end_node)
|
|
463
|
+
|
|
464
|
+
for s in successors:
|
|
465
|
+
if s in container_nodes:
|
|
466
|
+
container_s = container_nodes[s]
|
|
467
|
+
else:
|
|
468
|
+
container_s = ContainerNode(s)
|
|
469
|
+
container_nodes[s] = container_s
|
|
470
|
+
if self._reverse:
|
|
471
|
+
new_graph.add_edge(container_s, container_node) # Reversed
|
|
472
|
+
else:
|
|
473
|
+
new_graph.add_edge(container_node, container_s) # Reversed
|
|
474
|
+
if container_s not in traversed_nodes:
|
|
475
|
+
queue.append(s)
|
|
476
|
+
|
|
477
|
+
if not endnode_encountered:
|
|
478
|
+
# the graph is a circle with no end node. we run it with DFS to identify an end node
|
|
479
|
+
nn = next((nn for nn in networkx.dfs_postorder_nodes(graph) if nn in container_nodes), None)
|
|
480
|
+
if nn is not None:
|
|
481
|
+
if self._reverse:
|
|
482
|
+
new_graph.add_edge(start_node, container_nodes[nn])
|
|
483
|
+
else:
|
|
484
|
+
new_graph.add_edge(container_nodes[nn], end_node)
|
|
485
|
+
else:
|
|
486
|
+
# the graph must be empty - totally unexpected!
|
|
487
|
+
raise RuntimeError("Cannot find any end node candidates in the graph. Is the graph empty?")
|
|
488
|
+
|
|
489
|
+
if self._reverse:
|
|
490
|
+
# Add the end node
|
|
491
|
+
new_graph.add_edge(container_nodes[n], end_node)
|
|
492
|
+
else:
|
|
493
|
+
# Add the start node
|
|
494
|
+
new_graph.add_edge(start_node, container_nodes[n])
|
|
495
|
+
|
|
496
|
+
all_nodes_count = new_graph.number_of_nodes()
|
|
497
|
+
self._l.debug("There should be %d nodes in all", all_nodes_count)
|
|
498
|
+
counter = 0
|
|
499
|
+
vertices: list[Any] = [ContainerNode("placeholder")]
|
|
500
|
+
scanned_nodes = set()
|
|
501
|
+
parent = {}
|
|
502
|
+
while True:
|
|
503
|
+
# DFS from the current start node
|
|
504
|
+
stack = [start_node]
|
|
505
|
+
while len(stack) > 0:
|
|
506
|
+
node = stack.pop()
|
|
507
|
+
if node in scanned_nodes:
|
|
508
|
+
continue
|
|
509
|
+
counter += 1
|
|
510
|
+
|
|
511
|
+
# Mark it as scanned
|
|
512
|
+
scanned_nodes.add(node)
|
|
513
|
+
|
|
514
|
+
# Put the container node into vertices list
|
|
515
|
+
vertices.append(node)
|
|
516
|
+
|
|
517
|
+
# Put each successors into the stack
|
|
518
|
+
successors = new_graph.successors(node)
|
|
519
|
+
|
|
520
|
+
# Set the index property of it
|
|
521
|
+
node.index = counter
|
|
522
|
+
|
|
523
|
+
for s in successors:
|
|
524
|
+
if s not in scanned_nodes:
|
|
525
|
+
stack.append(s)
|
|
526
|
+
parent[s] = node
|
|
527
|
+
|
|
528
|
+
if counter >= all_nodes_count:
|
|
529
|
+
break
|
|
530
|
+
|
|
531
|
+
self._l.debug(
|
|
532
|
+
"%d nodes are left out during the DFS. They must formed a cycle themselves.", all_nodes_count - counter
|
|
533
|
+
)
|
|
534
|
+
# Find those nodes
|
|
535
|
+
leftovers = [s for s in traversed_nodes if s not in scanned_nodes]
|
|
536
|
+
new_graph.add_edge(start_node, leftovers[0])
|
|
537
|
+
# We have to start over...
|
|
538
|
+
counter = 0
|
|
539
|
+
parent = {}
|
|
540
|
+
scanned_nodes = set()
|
|
541
|
+
vertices = [ContainerNode("placeholder")]
|
|
542
|
+
|
|
543
|
+
self._semi = vertices[::]
|
|
544
|
+
self._label = vertices[::]
|
|
545
|
+
|
|
546
|
+
return new_graph, vertices, parent
|
|
547
|
+
|
|
548
|
+
def _pd_link(self, v, w):
|
|
549
|
+
assert self._ancestor is not None
|
|
550
|
+
self._ancestor[w.index] = v
|
|
551
|
+
|
|
552
|
+
def _pd_eval(self, v):
|
|
553
|
+
assert self._ancestor is not None
|
|
554
|
+
assert self._semi is not None
|
|
555
|
+
assert self._label is not None
|
|
556
|
+
|
|
557
|
+
if self._ancestor[v.index] is None:
|
|
558
|
+
return v
|
|
559
|
+
|
|
560
|
+
# pd_compress without recursion
|
|
561
|
+
queue = []
|
|
562
|
+
current = v
|
|
563
|
+
ancestor = self._ancestor[current.index]
|
|
564
|
+
greater_ancestor = self._ancestor[ancestor.index]
|
|
565
|
+
while greater_ancestor is not None:
|
|
566
|
+
queue.append(current)
|
|
567
|
+
current, ancestor = ancestor, greater_ancestor
|
|
568
|
+
greater_ancestor = self._ancestor[ancestor.index]
|
|
569
|
+
|
|
570
|
+
for vv in reversed(queue):
|
|
571
|
+
if (
|
|
572
|
+
self._semi[self._label[self._ancestor[vv.index].index].index].index
|
|
573
|
+
< self._semi[self._label[vv.index].index].index
|
|
574
|
+
):
|
|
575
|
+
self._label[vv.index] = self._label[self._ancestor[vv.index].index]
|
|
576
|
+
self._ancestor[vv.index] = self._ancestor[self._ancestor[vv.index].index]
|
|
577
|
+
|
|
578
|
+
return self._label[v.index]
|
|
579
|
+
|
|
580
|
+
def _pd_compress(self, v):
|
|
581
|
+
assert self._ancestor is not None
|
|
582
|
+
assert self._semi is not None
|
|
583
|
+
assert self._label is not None
|
|
584
|
+
|
|
585
|
+
if self._ancestor[self._ancestor[v.index].index] is not None:
|
|
586
|
+
self._pd_compress(self._ancestor[v.index])
|
|
587
|
+
if (
|
|
588
|
+
self._semi[self._label[self._ancestor[v.index].index].index].index
|
|
589
|
+
< self._semi[self._label[v.index].index].index
|
|
590
|
+
):
|
|
591
|
+
self._label[v.index] = self._label[self._ancestor[v.index].index]
|
|
592
|
+
self._ancestor[v.index] = self._ancestor[self._ancestor[v.index].index]
|
|
593
|
+
|
|
594
|
+
|
|
595
|
+
class PostDominators(Generic[T], Dominators[T]):
|
|
596
|
+
"""
|
|
597
|
+
Describe post-dominators in a graph.
|
|
598
|
+
"""
|
|
599
|
+
|
|
600
|
+
def __init__(self, graph: networkx.DiGraph[T], entry_node: T, successors_func=None):
|
|
601
|
+
super().__init__(graph, entry_node, successors_func=successors_func, reverse=True)
|
|
602
|
+
|
|
603
|
+
@property
|
|
604
|
+
def post_dom(self) -> networkx.DiGraph[T]:
|
|
605
|
+
return self.dom
|
|
606
|
+
|
|
607
|
+
|
|
608
|
+
class SCCPlaceholder:
|
|
609
|
+
"""
|
|
610
|
+
Describes a placeholder for strongly-connected-components in a graph.
|
|
611
|
+
"""
|
|
612
|
+
|
|
613
|
+
__slots__ = (
|
|
614
|
+
"addr",
|
|
615
|
+
"scc_id",
|
|
616
|
+
)
|
|
617
|
+
|
|
618
|
+
def __init__(self, scc_id, addr):
|
|
619
|
+
self.scc_id = scc_id
|
|
620
|
+
self.addr = addr
|
|
621
|
+
|
|
622
|
+
def __eq__(self, other):
|
|
623
|
+
return isinstance(other, SCCPlaceholder) and other.scc_id == self.scc_id and other.addr == self.addr
|
|
624
|
+
|
|
625
|
+
def __hash__(self):
|
|
626
|
+
return hash(f"scc_placeholder_{self.scc_id}")
|
|
627
|
+
|
|
628
|
+
def __repr__(self):
|
|
629
|
+
return f"SCCPlaceholder({self.scc_id}, addr={self.addr:#x})"
|
|
630
|
+
|
|
631
|
+
|
|
632
|
+
class GraphUtils:
|
|
633
|
+
"""
|
|
634
|
+
A helper class with some static methods and algorithms implemented, that in fact, might take more than just normal
|
|
635
|
+
CFGs.
|
|
636
|
+
"""
|
|
637
|
+
|
|
638
|
+
@staticmethod
|
|
639
|
+
def find_merge_points(function_addr, function_endpoints, graph): # pylint:disable=unused-argument
|
|
640
|
+
"""
|
|
641
|
+
Given a local transition graph of a function, find all merge points inside, and then perform a
|
|
642
|
+
quasi-topological sort of those merge points.
|
|
643
|
+
|
|
644
|
+
A merge point might be one of the following cases:
|
|
645
|
+
- two or more paths come together, and ends at the same address.
|
|
646
|
+
- end of the current function
|
|
647
|
+
|
|
648
|
+
:param int function_addr: Address of the function.
|
|
649
|
+
:param list function_endpoints: Endpoints of the function. They typically come from Function.endpoints.
|
|
650
|
+
:param networkx.DiGraph graph: A local transition graph of a function. Normally it comes from Function.graph.
|
|
651
|
+
:return: A list of ordered addresses of merge points.
|
|
652
|
+
:rtype: list
|
|
653
|
+
"""
|
|
654
|
+
|
|
655
|
+
merge_points = set()
|
|
656
|
+
|
|
657
|
+
for node in graph.nodes():
|
|
658
|
+
if graph.in_degree(node) > 1:
|
|
659
|
+
merge_points.add(node)
|
|
660
|
+
|
|
661
|
+
ordered_merge_points = GraphUtils.quasi_topological_sort_nodes(graph, nodes=list(merge_points))
|
|
662
|
+
|
|
663
|
+
return [n.addr for n in ordered_merge_points]
|
|
664
|
+
|
|
665
|
+
@staticmethod
|
|
666
|
+
def find_widening_points(function_addr, function_endpoints, graph): # pylint: disable=unused-argument
|
|
667
|
+
"""
|
|
668
|
+
Given a local transition graph of a function, find all widening points inside.
|
|
669
|
+
|
|
670
|
+
Correctly choosing widening points is very important in order to not lose too much information during static
|
|
671
|
+
analysis. We mainly consider merge points that has at least one loop back edges coming in as widening points.
|
|
672
|
+
|
|
673
|
+
:param int function_addr: Address of the function.
|
|
674
|
+
:param list function_endpoints: Endpoints of the function, typically coming from Function.endpoints.
|
|
675
|
+
:param networkx.DiGraph graph: A local transition graph of a function, normally Function.graph.
|
|
676
|
+
:return: A list of addresses of widening points.
|
|
677
|
+
:rtype: list
|
|
678
|
+
"""
|
|
679
|
+
|
|
680
|
+
sccs = networkx.strongly_connected_components(graph)
|
|
681
|
+
|
|
682
|
+
widening_addrs = set()
|
|
683
|
+
|
|
684
|
+
for scc in sccs:
|
|
685
|
+
if len(scc) == 1:
|
|
686
|
+
node = next(iter(scc))
|
|
687
|
+
if graph.has_edge(node, node):
|
|
688
|
+
# self loop
|
|
689
|
+
widening_addrs.add(node.addr)
|
|
690
|
+
else:
|
|
691
|
+
for n in scc:
|
|
692
|
+
predecessors = graph.predecessors(n)
|
|
693
|
+
if any(p not in scc for p in predecessors):
|
|
694
|
+
widening_addrs.add(n.addr)
|
|
695
|
+
break
|
|
696
|
+
|
|
697
|
+
return list(widening_addrs)
|
|
698
|
+
|
|
699
|
+
@staticmethod
|
|
700
|
+
def dfs_postorder_nodes_deterministic(graph: networkx.DiGraph[T], source: T) -> Iterator[T]:
|
|
701
|
+
visited = set()
|
|
702
|
+
stack: list[tuple[Any, bool]] = [(source, True)] # NodeType, is_pre_visit
|
|
703
|
+
while stack:
|
|
704
|
+
node, pre_visit = stack.pop()
|
|
705
|
+
if pre_visit and node not in visited:
|
|
706
|
+
visited.add(node)
|
|
707
|
+
stack.append((node, False))
|
|
708
|
+
for succ in sorted(graph.successors(node), key=GraphUtils._sort_node):
|
|
709
|
+
if succ not in visited:
|
|
710
|
+
stack.append((succ, True))
|
|
711
|
+
elif not pre_visit:
|
|
712
|
+
yield node
|
|
713
|
+
|
|
714
|
+
@staticmethod
|
|
715
|
+
def reverse_post_order_sort_nodes(graph, nodes=None):
|
|
716
|
+
"""
|
|
717
|
+
Sort a given set of nodes in reverse post ordering.
|
|
718
|
+
|
|
719
|
+
:param networkx.DiGraph graph: A local transition graph of a function.
|
|
720
|
+
:param iterable nodes: A collection of nodes to sort.
|
|
721
|
+
:return: A list of sorted nodes.
|
|
722
|
+
:rtype: list
|
|
723
|
+
"""
|
|
724
|
+
|
|
725
|
+
post_order = networkx.dfs_postorder_nodes(graph)
|
|
726
|
+
|
|
727
|
+
if nodes is None:
|
|
728
|
+
return reversed(list(post_order))
|
|
729
|
+
|
|
730
|
+
addrs_to_index = {n.addr: i for (i, n) in enumerate(post_order)}
|
|
731
|
+
return sorted(nodes, key=lambda n: addrs_to_index[n.addr], reverse=True)
|
|
732
|
+
|
|
733
|
+
@staticmethod
|
|
734
|
+
def _sort_node(node):
|
|
735
|
+
"""
|
|
736
|
+
A sorter to make a deterministic order of nodes.
|
|
737
|
+
"""
|
|
738
|
+
if hasattr(node, "addr"):
|
|
739
|
+
return node.addr
|
|
740
|
+
return node
|
|
741
|
+
|
|
742
|
+
@staticmethod
|
|
743
|
+
def _sort_edge(edge):
|
|
744
|
+
"""
|
|
745
|
+
A sorter to make a deterministic order of edges.
|
|
746
|
+
"""
|
|
747
|
+
_src, _dst = edge
|
|
748
|
+
src_addr, dst_addr = 0, 0
|
|
749
|
+
if hasattr(_src, "addr"):
|
|
750
|
+
src_addr = _src.addr
|
|
751
|
+
elif isinstance(_src, int):
|
|
752
|
+
src_addr = _src
|
|
753
|
+
|
|
754
|
+
if hasattr(_dst, "addr"):
|
|
755
|
+
dst_addr = _dst.addr
|
|
756
|
+
elif isinstance(_dst, int):
|
|
757
|
+
dst_addr = _dst
|
|
758
|
+
|
|
759
|
+
return src_addr + dst_addr
|
|
760
|
+
|
|
761
|
+
@staticmethod
|
|
762
|
+
def quasi_topological_sort_nodes(
|
|
763
|
+
graph: networkx.DiGraph,
|
|
764
|
+
nodes: list | None = None,
|
|
765
|
+
loop_heads: list | None = None,
|
|
766
|
+
panic_mode_threshold: int = 3000,
|
|
767
|
+
) -> list:
|
|
768
|
+
"""
|
|
769
|
+
Sort a given set of nodes from a graph based on the following rules:
|
|
770
|
+
|
|
771
|
+
# - if A -> B and not B -> A, then we have A < B
|
|
772
|
+
# - if A -> B and B -> A, then the ordering is undefined
|
|
773
|
+
|
|
774
|
+
Following the above rules gives us a quasi-topological sorting of nodes in the graph. It also works for cyclic
|
|
775
|
+
graphs.
|
|
776
|
+
|
|
777
|
+
:param graph: A local transition graph of the function.
|
|
778
|
+
:param nodes: A list of nodes to sort. None if you want to sort all nodes inside the graph.
|
|
779
|
+
:param loop_heads: A list of nodes that should be treated loop heads.
|
|
780
|
+
:param panic_mode_threshold: Threshold of nodes in an SCC to begin aggressively removing edges.
|
|
781
|
+
:return: A list of ordered nodes.
|
|
782
|
+
"""
|
|
783
|
+
|
|
784
|
+
# fast path for single node graphs
|
|
785
|
+
number_of_nodes = graph.number_of_nodes()
|
|
786
|
+
if number_of_nodes == 0:
|
|
787
|
+
return []
|
|
788
|
+
if number_of_nodes == 1:
|
|
789
|
+
if nodes is None:
|
|
790
|
+
return list(graph.nodes)
|
|
791
|
+
return [n for n in graph.nodes() if n in nodes]
|
|
792
|
+
|
|
793
|
+
# make a copy to the graph since we are gonna modify it
|
|
794
|
+
graph_copy = networkx.DiGraph()
|
|
795
|
+
|
|
796
|
+
# find all strongly connected components in the graph
|
|
797
|
+
sccs = sorted(
|
|
798
|
+
(scc for scc in networkx.strongly_connected_components(graph) if len(scc) > 1),
|
|
799
|
+
key=lambda x: (len(x), min(node.addr if hasattr(node, "addr") else node for node in x)),
|
|
800
|
+
)
|
|
801
|
+
comp_indices = {}
|
|
802
|
+
for i, scc in enumerate(sccs):
|
|
803
|
+
scc_addr = min(node.addr if hasattr(node, "addr") else node for node in scc)
|
|
804
|
+
for node in scc:
|
|
805
|
+
if node not in comp_indices:
|
|
806
|
+
comp_indices[node] = (i, scc_addr)
|
|
807
|
+
|
|
808
|
+
# collapse all strongly connected components
|
|
809
|
+
for src, dst in sorted(graph.edges(), key=GraphUtils._sort_edge):
|
|
810
|
+
scc_index, scc_addr = comp_indices.get(src, (None, None))
|
|
811
|
+
if scc_index is not None:
|
|
812
|
+
src = SCCPlaceholder(scc_index, scc_addr)
|
|
813
|
+
scc_index, scc_addr = comp_indices.get(dst, (None, None))
|
|
814
|
+
if scc_index is not None:
|
|
815
|
+
dst = SCCPlaceholder(scc_index, scc_addr)
|
|
816
|
+
|
|
817
|
+
if isinstance(src, SCCPlaceholder) and isinstance(dst, SCCPlaceholder) and src == dst:
|
|
818
|
+
if src not in graph_copy:
|
|
819
|
+
graph_copy.add_node(src)
|
|
820
|
+
continue
|
|
821
|
+
if src == dst:
|
|
822
|
+
if src not in graph_copy:
|
|
823
|
+
graph_copy.add_node(src)
|
|
824
|
+
continue
|
|
825
|
+
|
|
826
|
+
graph_copy.add_edge(src, dst)
|
|
827
|
+
|
|
828
|
+
# add loners
|
|
829
|
+
out_degree_zero_nodes = [node for (node, degree) in graph.out_degree() if degree == 0] # type:ignore
|
|
830
|
+
for node in out_degree_zero_nodes:
|
|
831
|
+
if graph.in_degree(node) == 0:
|
|
832
|
+
graph_copy.add_node(node)
|
|
833
|
+
|
|
834
|
+
class NodeWithAddr:
|
|
835
|
+
"""
|
|
836
|
+
Temporary node class.
|
|
837
|
+
"""
|
|
838
|
+
|
|
839
|
+
def __init__(self, addr: int):
|
|
840
|
+
self.addr = addr
|
|
841
|
+
|
|
842
|
+
# topological sort on acyclic graph `graph_copy`
|
|
843
|
+
heads = [nn for nn in graph_copy if graph_copy.in_degree[nn] == 0]
|
|
844
|
+
if len(heads) > 1:
|
|
845
|
+
head = NodeWithAddr(-1)
|
|
846
|
+
for real_head in heads:
|
|
847
|
+
graph_copy.add_edge(head, real_head)
|
|
848
|
+
else:
|
|
849
|
+
assert heads
|
|
850
|
+
head = heads[0]
|
|
851
|
+
tmp_nodes = reversed(list(GraphUtils.dfs_postorder_nodes_deterministic(graph_copy, head)))
|
|
852
|
+
ordered_nodes = []
|
|
853
|
+
for n in tmp_nodes:
|
|
854
|
+
if isinstance(n, NodeWithAddr):
|
|
855
|
+
continue
|
|
856
|
+
if isinstance(n, SCCPlaceholder):
|
|
857
|
+
GraphUtils._append_scc(
|
|
858
|
+
graph,
|
|
859
|
+
ordered_nodes,
|
|
860
|
+
sccs[n.scc_id],
|
|
861
|
+
loop_head_candidates=loop_heads,
|
|
862
|
+
panic_mode_threshold=panic_mode_threshold,
|
|
863
|
+
)
|
|
864
|
+
else:
|
|
865
|
+
ordered_nodes.append(n)
|
|
866
|
+
|
|
867
|
+
if nodes is None:
|
|
868
|
+
return ordered_nodes
|
|
869
|
+
return [n for n in ordered_nodes if n in set(nodes)]
|
|
870
|
+
|
|
871
|
+
@staticmethod
|
|
872
|
+
def _append_scc(
|
|
873
|
+
graph: networkx.DiGraph,
|
|
874
|
+
ordered_nodes: list,
|
|
875
|
+
scc: set,
|
|
876
|
+
loop_head_candidates: list | None = None,
|
|
877
|
+
panic_mode_threshold: int = 3000,
|
|
878
|
+
) -> None:
|
|
879
|
+
"""
|
|
880
|
+
Append all nodes from a strongly connected component to a list of ordered nodes and ensure the topological
|
|
881
|
+
order.
|
|
882
|
+
|
|
883
|
+
:param graph: The graph where all nodes belong to.
|
|
884
|
+
:param ordered_nodes: Ordered nodes.
|
|
885
|
+
:param scc: A set of nodes that forms a strongly connected component in the graph.
|
|
886
|
+
:param panic_mode_threshold: Threshold of nodes in an SCC to begin aggressively removing edges.
|
|
887
|
+
"""
|
|
888
|
+
|
|
889
|
+
loop_head = None
|
|
890
|
+
|
|
891
|
+
if loop_head_candidates is not None:
|
|
892
|
+
# find the first node that appears in loop_heads
|
|
893
|
+
loop_head_candidates_set = set(loop_head_candidates)
|
|
894
|
+
for n in scc:
|
|
895
|
+
if n in loop_head_candidates_set:
|
|
896
|
+
loop_head = n
|
|
897
|
+
break
|
|
898
|
+
|
|
899
|
+
if loop_head is None:
|
|
900
|
+
for parent_node in reversed(ordered_nodes):
|
|
901
|
+
# find all successors to this node
|
|
902
|
+
succs = set(graph.successors(parent_node))
|
|
903
|
+
scc_succs = scc.intersection(succs)
|
|
904
|
+
if len(scc_succs) == 1:
|
|
905
|
+
loop_head = next(iter(scc_succs))
|
|
906
|
+
break
|
|
907
|
+
if len(scc_succs) > 1:
|
|
908
|
+
# calculate the distance between each pair of nodes within scc_succs, pick the one with the
|
|
909
|
+
# shortest total distance
|
|
910
|
+
sorted_scc_succs = sorted(scc_succs, key=GraphUtils._sort_node)
|
|
911
|
+
scc_node_distance = defaultdict(int)
|
|
912
|
+
for scc_succ in sorted_scc_succs:
|
|
913
|
+
for other_node in sorted_scc_succs:
|
|
914
|
+
if other_node is scc_succ:
|
|
915
|
+
continue
|
|
916
|
+
scc_node_distance[scc_succ] += networkx.algorithms.shortest_path_length(
|
|
917
|
+
graph, scc_succ, other_node
|
|
918
|
+
)
|
|
919
|
+
distance_to_node = {v: k for k, v in scc_node_distance.items()}
|
|
920
|
+
lowest_distance = min(distance_to_node)
|
|
921
|
+
loop_head = distance_to_node[lowest_distance]
|
|
922
|
+
break
|
|
923
|
+
|
|
924
|
+
if loop_head is None:
|
|
925
|
+
# pick the first one
|
|
926
|
+
loop_head = sorted(scc, key=GraphUtils._sort_node)[0]
|
|
927
|
+
|
|
928
|
+
subgraph: networkx.DiGraph = graph.subgraph(scc).copy() # type: ignore
|
|
929
|
+
for src, _ in list(subgraph.in_edges(loop_head)):
|
|
930
|
+
subgraph.remove_edge(src, loop_head)
|
|
931
|
+
|
|
932
|
+
# panic mode: if the strongly connected component has too many edges (imagine an almost complete graph), it
|
|
933
|
+
# will take too long to converge if we only remove one node out of the component each time. we introduce a
|
|
934
|
+
# panic mode that will aggressively remove edges
|
|
935
|
+
|
|
936
|
+
if len(subgraph) > panic_mode_threshold and len(subgraph.edges) > len(subgraph) * 1.4:
|
|
937
|
+
for n0, n1 in sorted(dfs_back_edges(subgraph, loop_head), key=GraphUtils._sort_edge):
|
|
938
|
+
subgraph.remove_edge(n0, n1)
|
|
939
|
+
if len(subgraph.edges) <= len(subgraph) * 1.4:
|
|
940
|
+
break
|
|
941
|
+
|
|
942
|
+
ordered_nodes.extend(GraphUtils.quasi_topological_sort_nodes(subgraph))
|
|
943
|
+
|
|
944
|
+
@staticmethod
|
|
945
|
+
def loop_nesting_forest(graph: networkx.DiGraph, start_node) -> OrderedDict[Any, networkx.DiGraph]:
|
|
946
|
+
"""
|
|
947
|
+
Generates the loop-nesting forest for the provided directional graph. This is *not* the algorithm proposed by
|
|
948
|
+
Ramalingam.
|
|
949
|
+
|
|
950
|
+
:param graph: the graph to generate the loop-nesting forest for.
|
|
951
|
+
:param start_node: the node to start traversing the graph from.
|
|
952
|
+
:return: An ordered dict of loop heads to their corresponding loop nodes.
|
|
953
|
+
"""
|
|
954
|
+
|
|
955
|
+
# TODO: Should we replace this function using dfs_back_edges()?
|
|
956
|
+
|
|
957
|
+
loop_head_to_loop_nodes = OrderedDict()
|
|
958
|
+
|
|
959
|
+
graph_copy = networkx.DiGraph(graph)
|
|
960
|
+
|
|
961
|
+
while True:
|
|
962
|
+
cycles_iter = networkx.simple_cycles(graph_copy)
|
|
963
|
+
try:
|
|
964
|
+
cycle = next(cycles_iter)
|
|
965
|
+
except StopIteration:
|
|
966
|
+
break
|
|
967
|
+
|
|
968
|
+
loop_backedge = (None, None)
|
|
969
|
+
|
|
970
|
+
for n in networkx.dfs_preorder_nodes(graph_copy, source=start_node):
|
|
971
|
+
if n in cycle:
|
|
972
|
+
idx = cycle.index(n)
|
|
973
|
+
loop_backedge = (cycle[-1], cycle[idx]) if idx == 0 else (cycle[idx - 1], cycle[idx])
|
|
974
|
+
break
|
|
975
|
+
|
|
976
|
+
loop_head = loop_backedge[1]
|
|
977
|
+
loop_head_to_loop_nodes[loop_head] = networkx.DiGraph(graph_copy.subgraph(cycle))
|
|
978
|
+
|
|
979
|
+
graph_copy.remove_edge(*loop_backedge)
|
|
980
|
+
|
|
981
|
+
return loop_head_to_loop_nodes
|