angr 9.2.166__cp310-abi3-manylinux_2_28_aarch64.whl

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

Potentially problematic release.


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

Files changed (1409) hide show
  1. angr/__init__.py +366 -0
  2. angr/__main__.py +152 -0
  3. angr/ailment/__init__.py +81 -0
  4. angr/ailment/block.py +81 -0
  5. angr/ailment/block_walker.py +845 -0
  6. angr/ailment/constant.py +3 -0
  7. angr/ailment/converter_common.py +11 -0
  8. angr/ailment/converter_pcode.py +623 -0
  9. angr/ailment/converter_vex.py +798 -0
  10. angr/ailment/expression.py +1655 -0
  11. angr/ailment/manager.py +33 -0
  12. angr/ailment/statement.py +978 -0
  13. angr/ailment/tagged_object.py +61 -0
  14. angr/ailment/utils.py +114 -0
  15. angr/analyses/__init__.py +113 -0
  16. angr/analyses/analysis.py +429 -0
  17. angr/analyses/backward_slice.py +686 -0
  18. angr/analyses/binary_optimizer.py +670 -0
  19. angr/analyses/bindiff.py +1512 -0
  20. angr/analyses/boyscout.py +76 -0
  21. angr/analyses/callee_cleanup_finder.py +74 -0
  22. angr/analyses/calling_convention/__init__.py +6 -0
  23. angr/analyses/calling_convention/calling_convention.py +1096 -0
  24. angr/analyses/calling_convention/fact_collector.py +636 -0
  25. angr/analyses/calling_convention/utils.py +60 -0
  26. angr/analyses/cdg.py +189 -0
  27. angr/analyses/cfg/__init__.py +23 -0
  28. angr/analyses/cfg/cfb.py +428 -0
  29. angr/analyses/cfg/cfg.py +74 -0
  30. angr/analyses/cfg/cfg_arch_options.py +95 -0
  31. angr/analyses/cfg/cfg_base.py +2909 -0
  32. angr/analyses/cfg/cfg_emulated.py +3451 -0
  33. angr/analyses/cfg/cfg_fast.py +5316 -0
  34. angr/analyses/cfg/cfg_fast_soot.py +662 -0
  35. angr/analyses/cfg/cfg_job_base.py +203 -0
  36. angr/analyses/cfg/indirect_jump_resolvers/__init__.py +28 -0
  37. angr/analyses/cfg/indirect_jump_resolvers/amd64_elf_got.py +62 -0
  38. angr/analyses/cfg/indirect_jump_resolvers/amd64_pe_iat.py +51 -0
  39. angr/analyses/cfg/indirect_jump_resolvers/arm_elf_fast.py +159 -0
  40. angr/analyses/cfg/indirect_jump_resolvers/const_resolver.py +339 -0
  41. angr/analyses/cfg/indirect_jump_resolvers/constant_value_manager.py +107 -0
  42. angr/analyses/cfg/indirect_jump_resolvers/default_resolvers.py +76 -0
  43. angr/analyses/cfg/indirect_jump_resolvers/jumptable.py +2367 -0
  44. angr/analyses/cfg/indirect_jump_resolvers/memload_resolver.py +81 -0
  45. angr/analyses/cfg/indirect_jump_resolvers/mips_elf_fast.py +286 -0
  46. angr/analyses/cfg/indirect_jump_resolvers/mips_elf_got.py +148 -0
  47. angr/analyses/cfg/indirect_jump_resolvers/propagator_utils.py +46 -0
  48. angr/analyses/cfg/indirect_jump_resolvers/resolver.py +74 -0
  49. angr/analyses/cfg/indirect_jump_resolvers/syscall_resolver.py +92 -0
  50. angr/analyses/cfg/indirect_jump_resolvers/x86_elf_pic_plt.py +88 -0
  51. angr/analyses/cfg/indirect_jump_resolvers/x86_pe_iat.py +47 -0
  52. angr/analyses/cfg_slice_to_sink/__init__.py +11 -0
  53. angr/analyses/cfg_slice_to_sink/cfg_slice_to_sink.py +117 -0
  54. angr/analyses/cfg_slice_to_sink/graph.py +87 -0
  55. angr/analyses/cfg_slice_to_sink/transitions.py +27 -0
  56. angr/analyses/class_identifier.py +63 -0
  57. angr/analyses/code_tagging.py +123 -0
  58. angr/analyses/codecave.py +77 -0
  59. angr/analyses/complete_calling_conventions.py +461 -0
  60. angr/analyses/congruency_check.py +377 -0
  61. angr/analyses/data_dep/__init__.py +16 -0
  62. angr/analyses/data_dep/data_dependency_analysis.py +595 -0
  63. angr/analyses/data_dep/dep_nodes.py +171 -0
  64. angr/analyses/data_dep/sim_act_location.py +49 -0
  65. angr/analyses/datagraph_meta.py +105 -0
  66. angr/analyses/ddg.py +1670 -0
  67. angr/analyses/decompiler/__init__.py +41 -0
  68. angr/analyses/decompiler/ail_simplifier.py +2085 -0
  69. angr/analyses/decompiler/ailgraph_walker.py +49 -0
  70. angr/analyses/decompiler/block_io_finder.py +302 -0
  71. angr/analyses/decompiler/block_similarity.py +196 -0
  72. angr/analyses/decompiler/block_simplifier.py +376 -0
  73. angr/analyses/decompiler/callsite_maker.py +571 -0
  74. angr/analyses/decompiler/ccall_rewriters/__init__.py +9 -0
  75. angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py +580 -0
  76. angr/analyses/decompiler/ccall_rewriters/rewriter_base.py +20 -0
  77. angr/analyses/decompiler/ccall_rewriters/x86_ccalls.py +313 -0
  78. angr/analyses/decompiler/clinic.py +3308 -0
  79. angr/analyses/decompiler/condition_processor.py +1281 -0
  80. angr/analyses/decompiler/counters/__init__.py +16 -0
  81. angr/analyses/decompiler/counters/boolean_counter.py +27 -0
  82. angr/analyses/decompiler/counters/call_counter.py +57 -0
  83. angr/analyses/decompiler/counters/expression_counters.py +77 -0
  84. angr/analyses/decompiler/counters/seq_cf_structure_counter.py +63 -0
  85. angr/analyses/decompiler/decompilation_cache.py +46 -0
  86. angr/analyses/decompiler/decompilation_options.py +275 -0
  87. angr/analyses/decompiler/decompiler.py +710 -0
  88. angr/analyses/decompiler/dephication/__init__.py +6 -0
  89. angr/analyses/decompiler/dephication/dephication_base.py +100 -0
  90. angr/analyses/decompiler/dephication/graph_dephication.py +70 -0
  91. angr/analyses/decompiler/dephication/graph_rewriting.py +112 -0
  92. angr/analyses/decompiler/dephication/graph_vvar_mapping.py +363 -0
  93. angr/analyses/decompiler/dephication/rewriting_engine.py +527 -0
  94. angr/analyses/decompiler/dephication/seqnode_dephication.py +156 -0
  95. angr/analyses/decompiler/empty_node_remover.py +212 -0
  96. angr/analyses/decompiler/expression_narrower.py +287 -0
  97. angr/analyses/decompiler/goto_manager.py +112 -0
  98. angr/analyses/decompiler/graph_region.py +426 -0
  99. angr/analyses/decompiler/jump_target_collector.py +37 -0
  100. angr/analyses/decompiler/jumptable_entry_condition_rewriter.py +67 -0
  101. angr/analyses/decompiler/label_collector.py +32 -0
  102. angr/analyses/decompiler/optimization_passes/__init__.py +151 -0
  103. angr/analyses/decompiler/optimization_passes/base_ptr_save_simplifier.py +157 -0
  104. angr/analyses/decompiler/optimization_passes/call_stmt_rewriter.py +46 -0
  105. angr/analyses/decompiler/optimization_passes/code_motion.py +362 -0
  106. angr/analyses/decompiler/optimization_passes/condition_constprop.py +219 -0
  107. angr/analyses/decompiler/optimization_passes/const_derefs.py +266 -0
  108. angr/analyses/decompiler/optimization_passes/const_prop_reverter.py +365 -0
  109. angr/analyses/decompiler/optimization_passes/cross_jump_reverter.py +106 -0
  110. angr/analyses/decompiler/optimization_passes/deadblock_remover.py +82 -0
  111. angr/analyses/decompiler/optimization_passes/determine_load_sizes.py +64 -0
  112. angr/analyses/decompiler/optimization_passes/div_simplifier.py +425 -0
  113. angr/analyses/decompiler/optimization_passes/duplication_reverter/__init__.py +5 -0
  114. angr/analyses/decompiler/optimization_passes/duplication_reverter/ail_merge_graph.py +503 -0
  115. angr/analyses/decompiler/optimization_passes/duplication_reverter/duplication_reverter.py +1218 -0
  116. angr/analyses/decompiler/optimization_passes/duplication_reverter/errors.py +16 -0
  117. angr/analyses/decompiler/optimization_passes/duplication_reverter/similarity.py +126 -0
  118. angr/analyses/decompiler/optimization_passes/duplication_reverter/utils.py +167 -0
  119. angr/analyses/decompiler/optimization_passes/eager_std_string_concatenation.py +165 -0
  120. angr/analyses/decompiler/optimization_passes/engine_base.py +500 -0
  121. angr/analyses/decompiler/optimization_passes/expr_op_swapper.py +135 -0
  122. angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py +113 -0
  123. angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py +615 -0
  124. angr/analyses/decompiler/optimization_passes/ite_expr_converter.py +224 -0
  125. angr/analyses/decompiler/optimization_passes/ite_region_converter.py +335 -0
  126. angr/analyses/decompiler/optimization_passes/lowered_switch_simplifier.py +923 -0
  127. angr/analyses/decompiler/optimization_passes/mod_simplifier.py +99 -0
  128. angr/analyses/decompiler/optimization_passes/optimization_pass.py +703 -0
  129. angr/analyses/decompiler/optimization_passes/register_save_area_simplifier.py +221 -0
  130. angr/analyses/decompiler/optimization_passes/ret_addr_save_simplifier.py +171 -0
  131. angr/analyses/decompiler/optimization_passes/ret_deduplicator.py +222 -0
  132. angr/analyses/decompiler/optimization_passes/return_duplicator_base.py +640 -0
  133. angr/analyses/decompiler/optimization_passes/return_duplicator_high.py +61 -0
  134. angr/analyses/decompiler/optimization_passes/return_duplicator_low.py +237 -0
  135. angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py +333 -0
  136. angr/analyses/decompiler/optimization_passes/switch_default_case_duplicator.py +149 -0
  137. angr/analyses/decompiler/optimization_passes/switch_reused_entry_rewriter.py +102 -0
  138. angr/analyses/decompiler/optimization_passes/tag_slicer.py +41 -0
  139. angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py +421 -0
  140. angr/analyses/decompiler/optimization_passes/x86_gcc_getpc_simplifier.py +88 -0
  141. angr/analyses/decompiler/peephole_optimizations/__init__.py +129 -0
  142. angr/analyses/decompiler/peephole_optimizations/a_div_const_add_a_mul_n_div_const.py +42 -0
  143. angr/analyses/decompiler/peephole_optimizations/a_mul_const_div_shr_const.py +38 -0
  144. angr/analyses/decompiler/peephole_optimizations/a_mul_const_sub_a.py +34 -0
  145. angr/analyses/decompiler/peephole_optimizations/a_shl_const_sub_a.py +34 -0
  146. angr/analyses/decompiler/peephole_optimizations/a_sub_a_div.py +25 -0
  147. angr/analyses/decompiler/peephole_optimizations/a_sub_a_shr_const_shr_const.py +37 -0
  148. angr/analyses/decompiler/peephole_optimizations/a_sub_a_sub_n.py +23 -0
  149. angr/analyses/decompiler/peephole_optimizations/arm_cmpf.py +236 -0
  150. angr/analyses/decompiler/peephole_optimizations/base.py +157 -0
  151. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_add_n.py +34 -0
  152. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_and_mask.py +36 -0
  153. angr/analyses/decompiler/peephole_optimizations/bitwise_or_to_logical_or.py +34 -0
  154. angr/analyses/decompiler/peephole_optimizations/bool_expr_xor_1.py +27 -0
  155. angr/analyses/decompiler/peephole_optimizations/bswap.py +142 -0
  156. angr/analyses/decompiler/peephole_optimizations/cas_intrinsics.py +115 -0
  157. angr/analyses/decompiler/peephole_optimizations/cmpord_rewriter.py +71 -0
  158. angr/analyses/decompiler/peephole_optimizations/coalesce_adjacent_shrs.py +39 -0
  159. angr/analyses/decompiler/peephole_optimizations/coalesce_same_cascading_ifs.py +28 -0
  160. angr/analyses/decompiler/peephole_optimizations/constant_derefs.py +44 -0
  161. angr/analyses/decompiler/peephole_optimizations/conv_a_sub0_shr_and.py +69 -0
  162. angr/analyses/decompiler/peephole_optimizations/conv_shl_shr.py +52 -0
  163. angr/analyses/decompiler/peephole_optimizations/eager_eval.py +447 -0
  164. angr/analyses/decompiler/peephole_optimizations/extended_byte_and_mask.py +56 -0
  165. angr/analyses/decompiler/peephole_optimizations/inlined_memcpy.py +78 -0
  166. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy.py +217 -0
  167. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy_consolidation.py +106 -0
  168. angr/analyses/decompiler/peephole_optimizations/inlined_wstrcpy.py +170 -0
  169. angr/analyses/decompiler/peephole_optimizations/invert_negated_logical_conjuction_disjunction.py +50 -0
  170. angr/analyses/decompiler/peephole_optimizations/modulo_simplifier.py +89 -0
  171. angr/analyses/decompiler/peephole_optimizations/one_sub_bool.py +33 -0
  172. angr/analyses/decompiler/peephole_optimizations/optimized_div_simplifier.py +356 -0
  173. angr/analyses/decompiler/peephole_optimizations/remove_cascading_conversions.py +45 -0
  174. angr/analyses/decompiler/peephole_optimizations/remove_cxx_destructor_calls.py +32 -0
  175. angr/analyses/decompiler/peephole_optimizations/remove_empty_if_body.py +46 -0
  176. angr/analyses/decompiler/peephole_optimizations/remove_noop_conversions.py +47 -0
  177. angr/analyses/decompiler/peephole_optimizations/remove_redundant_bitmasks.py +125 -0
  178. angr/analyses/decompiler/peephole_optimizations/remove_redundant_conversions.py +273 -0
  179. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_branch.py +30 -0
  180. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_comparisons.py +54 -0
  181. angr/analyses/decompiler/peephole_optimizations/remove_redundant_nots.py +36 -0
  182. angr/analyses/decompiler/peephole_optimizations/remove_redundant_reinterprets.py +44 -0
  183. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts.py +95 -0
  184. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts_around_comparators.py +44 -0
  185. angr/analyses/decompiler/peephole_optimizations/rewrite_bit_extractions.py +85 -0
  186. angr/analyses/decompiler/peephole_optimizations/rewrite_conv_mul.py +40 -0
  187. angr/analyses/decompiler/peephole_optimizations/rewrite_cxx_operator_calls.py +90 -0
  188. angr/analyses/decompiler/peephole_optimizations/rewrite_mips_gp_loads.py +49 -0
  189. angr/analyses/decompiler/peephole_optimizations/rol_ror.py +130 -0
  190. angr/analyses/decompiler/peephole_optimizations/sar_to_signed_div.py +143 -0
  191. angr/analyses/decompiler/peephole_optimizations/shl_to_mul.py +25 -0
  192. angr/analyses/decompiler/peephole_optimizations/simplify_pc_relative_loads.py +51 -0
  193. angr/analyses/decompiler/peephole_optimizations/single_bit_cond_to_boolexpr.py +82 -0
  194. angr/analyses/decompiler/peephole_optimizations/single_bit_xor.py +29 -0
  195. angr/analyses/decompiler/peephole_optimizations/tidy_stack_addr.py +131 -0
  196. angr/analyses/decompiler/peephole_optimizations/utils.py +18 -0
  197. angr/analyses/decompiler/presets/__init__.py +20 -0
  198. angr/analyses/decompiler/presets/basic.py +32 -0
  199. angr/analyses/decompiler/presets/fast.py +58 -0
  200. angr/analyses/decompiler/presets/full.py +68 -0
  201. angr/analyses/decompiler/presets/preset.py +37 -0
  202. angr/analyses/decompiler/redundant_label_remover.py +134 -0
  203. angr/analyses/decompiler/region_identifier.py +1239 -0
  204. angr/analyses/decompiler/region_simplifiers/__init__.py +5 -0
  205. angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py +95 -0
  206. angr/analyses/decompiler/region_simplifiers/cascading_ifs.py +82 -0
  207. angr/analyses/decompiler/region_simplifiers/expr_folding.py +818 -0
  208. angr/analyses/decompiler/region_simplifiers/goto.py +178 -0
  209. angr/analyses/decompiler/region_simplifiers/if_.py +135 -0
  210. angr/analyses/decompiler/region_simplifiers/ifelse.py +91 -0
  211. angr/analyses/decompiler/region_simplifiers/loop.py +143 -0
  212. angr/analyses/decompiler/region_simplifiers/node_address_finder.py +24 -0
  213. angr/analyses/decompiler/region_simplifiers/region_simplifier.py +246 -0
  214. angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py +654 -0
  215. angr/analyses/decompiler/region_simplifiers/switch_expr_simplifier.py +87 -0
  216. angr/analyses/decompiler/region_walker.py +24 -0
  217. angr/analyses/decompiler/return_maker.py +72 -0
  218. angr/analyses/decompiler/seq_to_blocks.py +20 -0
  219. angr/analyses/decompiler/sequence_walker.py +257 -0
  220. angr/analyses/decompiler/ssailification/__init__.py +4 -0
  221. angr/analyses/decompiler/ssailification/rewriting.py +379 -0
  222. angr/analyses/decompiler/ssailification/rewriting_engine.py +1053 -0
  223. angr/analyses/decompiler/ssailification/rewriting_state.py +61 -0
  224. angr/analyses/decompiler/ssailification/ssailification.py +276 -0
  225. angr/analyses/decompiler/ssailification/traversal.py +124 -0
  226. angr/analyses/decompiler/ssailification/traversal_engine.py +306 -0
  227. angr/analyses/decompiler/ssailification/traversal_state.py +48 -0
  228. angr/analyses/decompiler/stack_item.py +36 -0
  229. angr/analyses/decompiler/structured_codegen/__init__.py +25 -0
  230. angr/analyses/decompiler/structured_codegen/base.py +132 -0
  231. angr/analyses/decompiler/structured_codegen/c.py +4082 -0
  232. angr/analyses/decompiler/structured_codegen/dummy.py +15 -0
  233. angr/analyses/decompiler/structured_codegen/dwarf_import.py +190 -0
  234. angr/analyses/decompiler/structuring/__init__.py +30 -0
  235. angr/analyses/decompiler/structuring/dream.py +1217 -0
  236. angr/analyses/decompiler/structuring/phoenix.py +3090 -0
  237. angr/analyses/decompiler/structuring/recursive_structurer.py +187 -0
  238. angr/analyses/decompiler/structuring/sailr.py +120 -0
  239. angr/analyses/decompiler/structuring/structurer_base.py +1066 -0
  240. angr/analyses/decompiler/structuring/structurer_nodes.py +440 -0
  241. angr/analyses/decompiler/utils.py +1118 -0
  242. angr/analyses/deobfuscator/__init__.py +18 -0
  243. angr/analyses/deobfuscator/api_obf_finder.py +325 -0
  244. angr/analyses/deobfuscator/api_obf_peephole_optimizer.py +51 -0
  245. angr/analyses/deobfuscator/api_obf_type2_finder.py +166 -0
  246. angr/analyses/deobfuscator/irsb_reg_collector.py +54 -0
  247. angr/analyses/deobfuscator/string_obf_finder.py +959 -0
  248. angr/analyses/deobfuscator/string_obf_opt_passes.py +133 -0
  249. angr/analyses/deobfuscator/string_obf_peephole_optimizer.py +47 -0
  250. angr/analyses/disassembly.py +1295 -0
  251. angr/analyses/disassembly_utils.py +101 -0
  252. angr/analyses/dominance_frontier.py +57 -0
  253. angr/analyses/fcp/__init__.py +4 -0
  254. angr/analyses/fcp/fcp.py +427 -0
  255. angr/analyses/find_objects_static.py +205 -0
  256. angr/analyses/flirt/__init__.py +47 -0
  257. angr/analyses/flirt/consts.py +160 -0
  258. angr/analyses/flirt/flirt.py +244 -0
  259. angr/analyses/flirt/flirt_function.py +20 -0
  260. angr/analyses/flirt/flirt_matcher.py +351 -0
  261. angr/analyses/flirt/flirt_module.py +32 -0
  262. angr/analyses/flirt/flirt_node.py +23 -0
  263. angr/analyses/flirt/flirt_sig.py +359 -0
  264. angr/analyses/flirt/flirt_utils.py +31 -0
  265. angr/analyses/forward_analysis/__init__.py +12 -0
  266. angr/analyses/forward_analysis/forward_analysis.py +530 -0
  267. angr/analyses/forward_analysis/job_info.py +64 -0
  268. angr/analyses/forward_analysis/visitors/__init__.py +14 -0
  269. angr/analyses/forward_analysis/visitors/call_graph.py +29 -0
  270. angr/analyses/forward_analysis/visitors/function_graph.py +86 -0
  271. angr/analyses/forward_analysis/visitors/graph.py +242 -0
  272. angr/analyses/forward_analysis/visitors/loop.py +29 -0
  273. angr/analyses/forward_analysis/visitors/single_node_graph.py +38 -0
  274. angr/analyses/identifier/__init__.py +5 -0
  275. angr/analyses/identifier/custom_callable.py +137 -0
  276. angr/analyses/identifier/errors.py +10 -0
  277. angr/analyses/identifier/func.py +60 -0
  278. angr/analyses/identifier/functions/__init__.py +37 -0
  279. angr/analyses/identifier/functions/atoi.py +73 -0
  280. angr/analyses/identifier/functions/based_atoi.py +125 -0
  281. angr/analyses/identifier/functions/fdprintf.py +123 -0
  282. angr/analyses/identifier/functions/free.py +64 -0
  283. angr/analyses/identifier/functions/int2str.py +287 -0
  284. angr/analyses/identifier/functions/malloc.py +111 -0
  285. angr/analyses/identifier/functions/memcmp.py +67 -0
  286. angr/analyses/identifier/functions/memcpy.py +89 -0
  287. angr/analyses/identifier/functions/memset.py +43 -0
  288. angr/analyses/identifier/functions/printf.py +123 -0
  289. angr/analyses/identifier/functions/recv_until.py +312 -0
  290. angr/analyses/identifier/functions/skip_calloc.py +73 -0
  291. angr/analyses/identifier/functions/skip_realloc.py +97 -0
  292. angr/analyses/identifier/functions/skip_recv_n.py +105 -0
  293. angr/analyses/identifier/functions/snprintf.py +112 -0
  294. angr/analyses/identifier/functions/sprintf.py +116 -0
  295. angr/analyses/identifier/functions/strcasecmp.py +33 -0
  296. angr/analyses/identifier/functions/strcmp.py +113 -0
  297. angr/analyses/identifier/functions/strcpy.py +43 -0
  298. angr/analyses/identifier/functions/strlen.py +27 -0
  299. angr/analyses/identifier/functions/strncmp.py +104 -0
  300. angr/analyses/identifier/functions/strncpy.py +65 -0
  301. angr/analyses/identifier/functions/strtol.py +89 -0
  302. angr/analyses/identifier/identify.py +825 -0
  303. angr/analyses/identifier/runner.py +360 -0
  304. angr/analyses/init_finder.py +289 -0
  305. angr/analyses/loop_analysis.py +349 -0
  306. angr/analyses/loopfinder.py +171 -0
  307. angr/analyses/patchfinder.py +137 -0
  308. angr/analyses/pathfinder.py +282 -0
  309. angr/analyses/propagator/__init__.py +5 -0
  310. angr/analyses/propagator/engine_base.py +62 -0
  311. angr/analyses/propagator/engine_vex.py +297 -0
  312. angr/analyses/propagator/propagator.py +361 -0
  313. angr/analyses/propagator/top_checker_mixin.py +218 -0
  314. angr/analyses/propagator/values.py +117 -0
  315. angr/analyses/propagator/vex_vars.py +68 -0
  316. angr/analyses/proximity_graph.py +444 -0
  317. angr/analyses/reaching_definitions/__init__.py +67 -0
  318. angr/analyses/reaching_definitions/call_trace.py +73 -0
  319. angr/analyses/reaching_definitions/dep_graph.py +433 -0
  320. angr/analyses/reaching_definitions/engine_ail.py +1130 -0
  321. angr/analyses/reaching_definitions/engine_vex.py +1127 -0
  322. angr/analyses/reaching_definitions/external_codeloc.py +0 -0
  323. angr/analyses/reaching_definitions/function_handler.py +638 -0
  324. angr/analyses/reaching_definitions/function_handler_library/__init__.py +12 -0
  325. angr/analyses/reaching_definitions/function_handler_library/stdio.py +269 -0
  326. angr/analyses/reaching_definitions/function_handler_library/stdlib.py +195 -0
  327. angr/analyses/reaching_definitions/function_handler_library/string.py +158 -0
  328. angr/analyses/reaching_definitions/function_handler_library/unistd.py +51 -0
  329. angr/analyses/reaching_definitions/heap_allocator.py +70 -0
  330. angr/analyses/reaching_definitions/rd_initializer.py +237 -0
  331. angr/analyses/reaching_definitions/rd_state.py +579 -0
  332. angr/analyses/reaching_definitions/reaching_definitions.py +581 -0
  333. angr/analyses/reaching_definitions/subject.py +65 -0
  334. angr/analyses/reassembler.py +2900 -0
  335. angr/analyses/s_liveness.py +203 -0
  336. angr/analyses/s_propagator.py +542 -0
  337. angr/analyses/s_reaching_definitions/__init__.py +12 -0
  338. angr/analyses/s_reaching_definitions/s_rda_model.py +136 -0
  339. angr/analyses/s_reaching_definitions/s_rda_view.py +316 -0
  340. angr/analyses/s_reaching_definitions/s_reaching_definitions.py +177 -0
  341. angr/analyses/smc.py +161 -0
  342. angr/analyses/soot_class_hierarchy.py +273 -0
  343. angr/analyses/stack_pointer_tracker.py +953 -0
  344. angr/analyses/static_hooker.py +53 -0
  345. angr/analyses/typehoon/__init__.py +5 -0
  346. angr/analyses/typehoon/dfa.py +118 -0
  347. angr/analyses/typehoon/lifter.py +122 -0
  348. angr/analyses/typehoon/simple_solver.py +1666 -0
  349. angr/analyses/typehoon/translator.py +279 -0
  350. angr/analyses/typehoon/typeconsts.py +338 -0
  351. angr/analyses/typehoon/typehoon.py +319 -0
  352. angr/analyses/typehoon/typevars.py +622 -0
  353. angr/analyses/typehoon/variance.py +11 -0
  354. angr/analyses/unpacker/__init__.py +6 -0
  355. angr/analyses/unpacker/obfuscation_detector.py +103 -0
  356. angr/analyses/unpacker/packing_detector.py +138 -0
  357. angr/analyses/variable_recovery/__init__.py +9 -0
  358. angr/analyses/variable_recovery/annotations.py +58 -0
  359. angr/analyses/variable_recovery/engine_ail.py +885 -0
  360. angr/analyses/variable_recovery/engine_base.py +1197 -0
  361. angr/analyses/variable_recovery/engine_vex.py +593 -0
  362. angr/analyses/variable_recovery/irsb_scanner.py +143 -0
  363. angr/analyses/variable_recovery/variable_recovery.py +574 -0
  364. angr/analyses/variable_recovery/variable_recovery_base.py +489 -0
  365. angr/analyses/variable_recovery/variable_recovery_fast.py +661 -0
  366. angr/analyses/veritesting.py +626 -0
  367. angr/analyses/vfg.py +1898 -0
  368. angr/analyses/vsa_ddg.py +420 -0
  369. angr/analyses/vtable.py +92 -0
  370. angr/analyses/xrefs.py +286 -0
  371. angr/angrdb/__init__.py +14 -0
  372. angr/angrdb/db.py +206 -0
  373. angr/angrdb/models.py +184 -0
  374. angr/angrdb/serializers/__init__.py +10 -0
  375. angr/angrdb/serializers/cfg_model.py +41 -0
  376. angr/angrdb/serializers/comments.py +60 -0
  377. angr/angrdb/serializers/funcs.py +61 -0
  378. angr/angrdb/serializers/kb.py +111 -0
  379. angr/angrdb/serializers/labels.py +59 -0
  380. angr/angrdb/serializers/loader.py +165 -0
  381. angr/angrdb/serializers/structured_code.py +125 -0
  382. angr/angrdb/serializers/variables.py +58 -0
  383. angr/angrdb/serializers/xrefs.py +48 -0
  384. angr/annocfg.py +317 -0
  385. angr/blade.py +431 -0
  386. angr/block.py +509 -0
  387. angr/callable.py +168 -0
  388. angr/calling_conventions.py +2580 -0
  389. angr/code_location.py +163 -0
  390. angr/codenode.py +145 -0
  391. angr/concretization_strategies/__init__.py +32 -0
  392. angr/concretization_strategies/any.py +17 -0
  393. angr/concretization_strategies/any_named.py +35 -0
  394. angr/concretization_strategies/base.py +81 -0
  395. angr/concretization_strategies/controlled_data.py +58 -0
  396. angr/concretization_strategies/eval.py +19 -0
  397. angr/concretization_strategies/logging.py +35 -0
  398. angr/concretization_strategies/max.py +25 -0
  399. angr/concretization_strategies/nonzero.py +16 -0
  400. angr/concretization_strategies/nonzero_range.py +22 -0
  401. angr/concretization_strategies/norepeats.py +37 -0
  402. angr/concretization_strategies/norepeats_range.py +37 -0
  403. angr/concretization_strategies/range.py +19 -0
  404. angr/concretization_strategies/signed_add.py +31 -0
  405. angr/concretization_strategies/single.py +15 -0
  406. angr/concretization_strategies/solutions.py +20 -0
  407. angr/concretization_strategies/unlimited_range.py +17 -0
  408. angr/distributed/__init__.py +9 -0
  409. angr/distributed/server.py +197 -0
  410. angr/distributed/worker.py +185 -0
  411. angr/emulator.py +143 -0
  412. angr/engines/__init__.py +67 -0
  413. angr/engines/concrete.py +66 -0
  414. angr/engines/engine.py +29 -0
  415. angr/engines/failure.py +27 -0
  416. angr/engines/hook.py +68 -0
  417. angr/engines/icicle.py +278 -0
  418. angr/engines/light/__init__.py +23 -0
  419. angr/engines/light/data.py +681 -0
  420. angr/engines/light/engine.py +1285 -0
  421. angr/engines/pcode/__init__.py +9 -0
  422. angr/engines/pcode/behavior.py +994 -0
  423. angr/engines/pcode/cc.py +128 -0
  424. angr/engines/pcode/emulate.py +440 -0
  425. angr/engines/pcode/engine.py +242 -0
  426. angr/engines/pcode/lifter.py +1420 -0
  427. angr/engines/procedure.py +70 -0
  428. angr/engines/soot/__init__.py +5 -0
  429. angr/engines/soot/engine.py +410 -0
  430. angr/engines/soot/exceptions.py +17 -0
  431. angr/engines/soot/expressions/__init__.py +87 -0
  432. angr/engines/soot/expressions/arrayref.py +22 -0
  433. angr/engines/soot/expressions/base.py +21 -0
  434. angr/engines/soot/expressions/binop.py +28 -0
  435. angr/engines/soot/expressions/cast.py +22 -0
  436. angr/engines/soot/expressions/condition.py +35 -0
  437. angr/engines/soot/expressions/constants.py +47 -0
  438. angr/engines/soot/expressions/instanceOf.py +15 -0
  439. angr/engines/soot/expressions/instancefieldref.py +8 -0
  440. angr/engines/soot/expressions/invoke.py +114 -0
  441. angr/engines/soot/expressions/length.py +8 -0
  442. angr/engines/soot/expressions/local.py +8 -0
  443. angr/engines/soot/expressions/new.py +16 -0
  444. angr/engines/soot/expressions/newArray.py +54 -0
  445. angr/engines/soot/expressions/newMultiArray.py +86 -0
  446. angr/engines/soot/expressions/paramref.py +8 -0
  447. angr/engines/soot/expressions/phi.py +30 -0
  448. angr/engines/soot/expressions/staticfieldref.py +8 -0
  449. angr/engines/soot/expressions/thisref.py +7 -0
  450. angr/engines/soot/expressions/unsupported.py +7 -0
  451. angr/engines/soot/field_dispatcher.py +46 -0
  452. angr/engines/soot/method_dispatcher.py +46 -0
  453. angr/engines/soot/statements/__init__.py +44 -0
  454. angr/engines/soot/statements/assign.py +30 -0
  455. angr/engines/soot/statements/base.py +79 -0
  456. angr/engines/soot/statements/goto.py +14 -0
  457. angr/engines/soot/statements/identity.py +15 -0
  458. angr/engines/soot/statements/if_.py +19 -0
  459. angr/engines/soot/statements/invoke.py +12 -0
  460. angr/engines/soot/statements/return_.py +20 -0
  461. angr/engines/soot/statements/switch.py +41 -0
  462. angr/engines/soot/statements/throw.py +15 -0
  463. angr/engines/soot/values/__init__.py +38 -0
  464. angr/engines/soot/values/arrayref.py +122 -0
  465. angr/engines/soot/values/base.py +7 -0
  466. angr/engines/soot/values/constants.py +18 -0
  467. angr/engines/soot/values/instancefieldref.py +44 -0
  468. angr/engines/soot/values/local.py +18 -0
  469. angr/engines/soot/values/paramref.py +18 -0
  470. angr/engines/soot/values/staticfieldref.py +38 -0
  471. angr/engines/soot/values/strref.py +38 -0
  472. angr/engines/soot/values/thisref.py +149 -0
  473. angr/engines/successors.py +654 -0
  474. angr/engines/syscall.py +51 -0
  475. angr/engines/unicorn.py +490 -0
  476. angr/engines/vex/__init__.py +20 -0
  477. angr/engines/vex/claripy/__init__.py +5 -0
  478. angr/engines/vex/claripy/ccall.py +2097 -0
  479. angr/engines/vex/claripy/datalayer.py +141 -0
  480. angr/engines/vex/claripy/irop.py +1276 -0
  481. angr/engines/vex/heavy/__init__.py +16 -0
  482. angr/engines/vex/heavy/actions.py +231 -0
  483. angr/engines/vex/heavy/concretizers.py +403 -0
  484. angr/engines/vex/heavy/dirty.py +466 -0
  485. angr/engines/vex/heavy/heavy.py +370 -0
  486. angr/engines/vex/heavy/inspect.py +52 -0
  487. angr/engines/vex/heavy/resilience.py +85 -0
  488. angr/engines/vex/heavy/super_fastpath.py +34 -0
  489. angr/engines/vex/lifter.py +420 -0
  490. angr/engines/vex/light/__init__.py +11 -0
  491. angr/engines/vex/light/light.py +551 -0
  492. angr/engines/vex/light/resilience.py +74 -0
  493. angr/engines/vex/light/slicing.py +52 -0
  494. angr/errors.py +609 -0
  495. angr/exploration_techniques/__init__.py +53 -0
  496. angr/exploration_techniques/base.py +126 -0
  497. angr/exploration_techniques/bucketizer.py +94 -0
  498. angr/exploration_techniques/common.py +56 -0
  499. angr/exploration_techniques/dfs.py +37 -0
  500. angr/exploration_techniques/director.py +520 -0
  501. angr/exploration_techniques/driller_core.py +100 -0
  502. angr/exploration_techniques/explorer.py +152 -0
  503. angr/exploration_techniques/lengthlimiter.py +22 -0
  504. angr/exploration_techniques/local_loop_seer.py +65 -0
  505. angr/exploration_techniques/loop_seer.py +236 -0
  506. angr/exploration_techniques/manual_mergepoint.py +82 -0
  507. angr/exploration_techniques/memory_watcher.py +43 -0
  508. angr/exploration_techniques/oppologist.py +92 -0
  509. angr/exploration_techniques/slicecutor.py +118 -0
  510. angr/exploration_techniques/spiller.py +280 -0
  511. angr/exploration_techniques/spiller_db.py +27 -0
  512. angr/exploration_techniques/stochastic.py +56 -0
  513. angr/exploration_techniques/stub_stasher.py +19 -0
  514. angr/exploration_techniques/suggestions.py +159 -0
  515. angr/exploration_techniques/tech_builder.py +49 -0
  516. angr/exploration_techniques/threading.py +69 -0
  517. angr/exploration_techniques/timeout.py +34 -0
  518. angr/exploration_techniques/tracer.py +1098 -0
  519. angr/exploration_techniques/unique.py +106 -0
  520. angr/exploration_techniques/veritesting.py +37 -0
  521. angr/factory.py +404 -0
  522. angr/flirt/__init__.py +97 -0
  523. angr/flirt/build_sig.py +305 -0
  524. angr/graph_utils.py +0 -0
  525. angr/keyed_region.py +525 -0
  526. angr/knowledge_base.py +143 -0
  527. angr/knowledge_plugins/__init__.py +43 -0
  528. angr/knowledge_plugins/callsite_prototypes.py +53 -0
  529. angr/knowledge_plugins/cfg/__init__.py +18 -0
  530. angr/knowledge_plugins/cfg/cfg_manager.py +95 -0
  531. angr/knowledge_plugins/cfg/cfg_model.py +1045 -0
  532. angr/knowledge_plugins/cfg/cfg_node.py +536 -0
  533. angr/knowledge_plugins/cfg/indirect_jump.py +65 -0
  534. angr/knowledge_plugins/cfg/memory_data.py +156 -0
  535. angr/knowledge_plugins/comments.py +16 -0
  536. angr/knowledge_plugins/custom_strings.py +38 -0
  537. angr/knowledge_plugins/data.py +22 -0
  538. angr/knowledge_plugins/debug_variables.py +216 -0
  539. angr/knowledge_plugins/functions/__init__.py +9 -0
  540. angr/knowledge_plugins/functions/function.py +1780 -0
  541. angr/knowledge_plugins/functions/function_manager.py +588 -0
  542. angr/knowledge_plugins/functions/function_parser.py +299 -0
  543. angr/knowledge_plugins/functions/soot_function.py +128 -0
  544. angr/knowledge_plugins/indirect_jumps.py +35 -0
  545. angr/knowledge_plugins/key_definitions/__init__.py +17 -0
  546. angr/knowledge_plugins/key_definitions/atoms.py +374 -0
  547. angr/knowledge_plugins/key_definitions/constants.py +29 -0
  548. angr/knowledge_plugins/key_definitions/definition.py +214 -0
  549. angr/knowledge_plugins/key_definitions/environment.py +96 -0
  550. angr/knowledge_plugins/key_definitions/heap_address.py +33 -0
  551. angr/knowledge_plugins/key_definitions/key_definition_manager.py +82 -0
  552. angr/knowledge_plugins/key_definitions/live_definitions.py +1010 -0
  553. angr/knowledge_plugins/key_definitions/liveness.py +165 -0
  554. angr/knowledge_plugins/key_definitions/rd_model.py +171 -0
  555. angr/knowledge_plugins/key_definitions/tag.py +78 -0
  556. angr/knowledge_plugins/key_definitions/undefined.py +70 -0
  557. angr/knowledge_plugins/key_definitions/unknown_size.py +86 -0
  558. angr/knowledge_plugins/key_definitions/uses.py +178 -0
  559. angr/knowledge_plugins/labels.py +110 -0
  560. angr/knowledge_plugins/obfuscations.py +37 -0
  561. angr/knowledge_plugins/patches.py +126 -0
  562. angr/knowledge_plugins/plugin.py +24 -0
  563. angr/knowledge_plugins/propagations/__init__.py +10 -0
  564. angr/knowledge_plugins/propagations/prop_value.py +191 -0
  565. angr/knowledge_plugins/propagations/propagation_manager.py +60 -0
  566. angr/knowledge_plugins/propagations/propagation_model.py +80 -0
  567. angr/knowledge_plugins/propagations/states.py +552 -0
  568. angr/knowledge_plugins/structured_code.py +63 -0
  569. angr/knowledge_plugins/types.py +88 -0
  570. angr/knowledge_plugins/variables/__init__.py +8 -0
  571. angr/knowledge_plugins/variables/variable_access.py +113 -0
  572. angr/knowledge_plugins/variables/variable_manager.py +1380 -0
  573. angr/knowledge_plugins/xrefs/__init__.py +12 -0
  574. angr/knowledge_plugins/xrefs/xref.py +150 -0
  575. angr/knowledge_plugins/xrefs/xref_manager.py +127 -0
  576. angr/knowledge_plugins/xrefs/xref_types.py +16 -0
  577. angr/misc/__init__.py +19 -0
  578. angr/misc/ansi.py +47 -0
  579. angr/misc/autoimport.py +90 -0
  580. angr/misc/bug_report.py +117 -0
  581. angr/misc/hookset.py +106 -0
  582. angr/misc/loggers.py +130 -0
  583. angr/misc/picklable_lock.py +46 -0
  584. angr/misc/plugins.py +289 -0
  585. angr/misc/telemetry.py +54 -0
  586. angr/misc/testing.py +24 -0
  587. angr/misc/ux.py +31 -0
  588. angr/procedures/__init__.py +12 -0
  589. angr/procedures/advapi32/__init__.py +0 -0
  590. angr/procedures/cgc/__init__.py +3 -0
  591. angr/procedures/cgc/_terminate.py +11 -0
  592. angr/procedures/cgc/allocate.py +75 -0
  593. angr/procedures/cgc/deallocate.py +67 -0
  594. angr/procedures/cgc/fdwait.py +65 -0
  595. angr/procedures/cgc/random.py +67 -0
  596. angr/procedures/cgc/receive.py +93 -0
  597. angr/procedures/cgc/transmit.py +65 -0
  598. angr/procedures/definitions/__init__.py +779 -0
  599. angr/procedures/definitions/cgc.py +20 -0
  600. angr/procedures/definitions/glibc.py +8372 -0
  601. angr/procedures/definitions/gnulib.py +32 -0
  602. angr/procedures/definitions/libstdcpp.py +21 -0
  603. angr/procedures/definitions/linux_kernel.py +6171 -0
  604. angr/procedures/definitions/linux_loader.py +7 -0
  605. angr/procedures/definitions/msvcr.py +16 -0
  606. angr/procedures/definitions/parse_syscalls_from_local_system.py +50 -0
  607. angr/procedures/definitions/parse_win32json.py +2553 -0
  608. angr/procedures/definitions/types_stl.py +22 -0
  609. angr/procedures/definitions/types_win32.py +34482 -0
  610. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-4.py +30 -0
  611. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-6.py +26 -0
  612. angr/procedures/definitions/wdk_clfs.py +140 -0
  613. angr/procedures/definitions/wdk_fltmgr.py +556 -0
  614. angr/procedures/definitions/wdk_fwpkclnt.py +30 -0
  615. angr/procedures/definitions/wdk_fwpuclnt.py +316 -0
  616. angr/procedures/definitions/wdk_gdi32.py +366 -0
  617. angr/procedures/definitions/wdk_hal.py +78 -0
  618. angr/procedures/definitions/wdk_ksecdd.py +62 -0
  619. angr/procedures/definitions/wdk_ndis.py +238 -0
  620. angr/procedures/definitions/wdk_ntoskrnl.py +3451 -0
  621. angr/procedures/definitions/wdk_offreg.py +72 -0
  622. angr/procedures/definitions/wdk_pshed.py +36 -0
  623. angr/procedures/definitions/wdk_secur32.py +40 -0
  624. angr/procedures/definitions/wdk_vhfum.py +34 -0
  625. angr/procedures/definitions/win32_aclui.py +30 -0
  626. angr/procedures/definitions/win32_activeds.py +68 -0
  627. angr/procedures/definitions/win32_advapi32.py +1684 -0
  628. angr/procedures/definitions/win32_advpack.py +124 -0
  629. angr/procedures/definitions/win32_amsi.py +38 -0
  630. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-1.py +44 -0
  631. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-3.py +34 -0
  632. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-6.py +26 -0
  633. angr/procedures/definitions/win32_api-ms-win-core-apiquery-l2-1-0.py +26 -0
  634. angr/procedures/definitions/win32_api-ms-win-core-backgroundtask-l1-1-0.py +26 -0
  635. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-1.py +26 -0
  636. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-2.py +26 -0
  637. angr/procedures/definitions/win32_api-ms-win-core-enclave-l1-1-1.py +30 -0
  638. angr/procedures/definitions/win32_api-ms-win-core-errorhandling-l1-1-3.py +26 -0
  639. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-0.py +34 -0
  640. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-1.py +26 -0
  641. angr/procedures/definitions/win32_api-ms-win-core-file-fromapp-l1-1-0.py +46 -0
  642. angr/procedures/definitions/win32_api-ms-win-core-handle-l1-1-0.py +26 -0
  643. angr/procedures/definitions/win32_api-ms-win-core-ioring-l1-1-0.py +48 -0
  644. angr/procedures/definitions/win32_api-ms-win-core-marshal-l1-1-0.py +32 -0
  645. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-3.py +32 -0
  646. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-4.py +26 -0
  647. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-5.py +30 -0
  648. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-6.py +32 -0
  649. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-7.py +28 -0
  650. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-8.py +30 -0
  651. angr/procedures/definitions/win32_api-ms-win-core-path-l1-1-0.py +68 -0
  652. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-0.py +28 -0
  653. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-1.py +28 -0
  654. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-1.py +30 -0
  655. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-2.py +30 -0
  656. angr/procedures/definitions/win32_api-ms-win-core-slapi-l1-1-0.py +26 -0
  657. angr/procedures/definitions/win32_api-ms-win-core-state-helpers-l1-1-0.py +26 -0
  658. angr/procedures/definitions/win32_api-ms-win-core-synch-l1-2-0.py +30 -0
  659. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-0.py +26 -0
  660. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-3.py +28 -0
  661. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-4.py +28 -0
  662. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-6.py +26 -0
  663. angr/procedures/definitions/win32_api-ms-win-core-util-l1-1-1.py +28 -0
  664. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-0.py +44 -0
  665. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-1.py +38 -0
  666. angr/procedures/definitions/win32_api-ms-win-core-winrt-l1-1-0.py +40 -0
  667. angr/procedures/definitions/win32_api-ms-win-core-winrt-registration-l1-1-0.py +24 -0
  668. angr/procedures/definitions/win32_api-ms-win-core-winrt-robuffer-l1-1-0.py +24 -0
  669. angr/procedures/definitions/win32_api-ms-win-core-winrt-roparameterizediid-l1-1-0.py +28 -0
  670. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-0.py +76 -0
  671. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-1.py +24 -0
  672. angr/procedures/definitions/win32_api-ms-win-core-wow64-l1-1-1.py +30 -0
  673. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-0.py +42 -0
  674. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-1.py +34 -0
  675. angr/procedures/definitions/win32_api-ms-win-dx-d3dkmt-l1-1-0.py +26 -0
  676. angr/procedures/definitions/win32_api-ms-win-gaming-deviceinformation-l1-1-0.py +26 -0
  677. angr/procedures/definitions/win32_api-ms-win-gaming-expandedresources-l1-1-0.py +30 -0
  678. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-0.py +38 -0
  679. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-1.py +28 -0
  680. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-2.py +38 -0
  681. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-3.py +28 -0
  682. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-4.py +40 -0
  683. angr/procedures/definitions/win32_api-ms-win-mm-misc-l1-1-1.py +26 -0
  684. angr/procedures/definitions/win32_api-ms-win-net-isolation-l1-1-0.py +40 -0
  685. angr/procedures/definitions/win32_api-ms-win-security-base-l1-2-2.py +26 -0
  686. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-0.py +26 -0
  687. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-1.py +26 -0
  688. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-3.py +26 -0
  689. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-4.py +26 -0
  690. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-5.py +28 -0
  691. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-0.py +30 -0
  692. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-1.py +36 -0
  693. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-2.py +26 -0
  694. angr/procedures/definitions/win32_api-ms-win-shcore-stream-winrt-l1-1-0.py +28 -0
  695. angr/procedures/definitions/win32_api-ms-win-wsl-api-l1-1-0.py +38 -0
  696. angr/procedures/definitions/win32_apphelp.py +26 -0
  697. angr/procedures/definitions/win32_authz.py +90 -0
  698. angr/procedures/definitions/win32_avicap32.py +32 -0
  699. angr/procedures/definitions/win32_avifil32.py +144 -0
  700. angr/procedures/definitions/win32_avrt.py +52 -0
  701. angr/procedures/definitions/win32_bcp47mrm.py +28 -0
  702. angr/procedures/definitions/win32_bcrypt.py +130 -0
  703. angr/procedures/definitions/win32_bcryptprimitives.py +28 -0
  704. angr/procedures/definitions/win32_bluetoothapis.py +106 -0
  705. angr/procedures/definitions/win32_bthprops.py +34 -0
  706. angr/procedures/definitions/win32_bthprops_cpl.py +36 -0
  707. angr/procedures/definitions/win32_cabinet.py +68 -0
  708. angr/procedures/definitions/win32_certadm.py +60 -0
  709. angr/procedures/definitions/win32_certpoleng.py +40 -0
  710. angr/procedures/definitions/win32_cfgmgr32.py +502 -0
  711. angr/procedures/definitions/win32_chakra.py +198 -0
  712. angr/procedures/definitions/win32_cldapi.py +96 -0
  713. angr/procedures/definitions/win32_clfsw32.py +142 -0
  714. angr/procedures/definitions/win32_clusapi.py +584 -0
  715. angr/procedures/definitions/win32_comctl32.py +254 -0
  716. angr/procedures/definitions/win32_comdlg32.py +66 -0
  717. angr/procedures/definitions/win32_compstui.py +32 -0
  718. angr/procedures/definitions/win32_computecore.py +132 -0
  719. angr/procedures/definitions/win32_computenetwork.py +110 -0
  720. angr/procedures/definitions/win32_computestorage.py +48 -0
  721. angr/procedures/definitions/win32_comsvcs.py +38 -0
  722. angr/procedures/definitions/win32_coremessaging.py +24 -0
  723. angr/procedures/definitions/win32_credui.py +62 -0
  724. angr/procedures/definitions/win32_crypt32.py +482 -0
  725. angr/procedures/definitions/win32_cryptnet.py +34 -0
  726. angr/procedures/definitions/win32_cryptui.py +44 -0
  727. angr/procedures/definitions/win32_cryptxml.py +62 -0
  728. angr/procedures/definitions/win32_cscapi.py +32 -0
  729. angr/procedures/definitions/win32_d2d1.py +50 -0
  730. angr/procedures/definitions/win32_d3d10.py +78 -0
  731. angr/procedures/definitions/win32_d3d10_1.py +28 -0
  732. angr/procedures/definitions/win32_d3d11.py +30 -0
  733. angr/procedures/definitions/win32_d3d12.py +40 -0
  734. angr/procedures/definitions/win32_d3d9.py +46 -0
  735. angr/procedures/definitions/win32_d3dcompiler_47.py +76 -0
  736. angr/procedures/definitions/win32_d3dcsx.py +42 -0
  737. angr/procedures/definitions/win32_davclnt.py +60 -0
  738. angr/procedures/definitions/win32_dbgeng.py +32 -0
  739. angr/procedures/definitions/win32_dbghelp.py +462 -0
  740. angr/procedures/definitions/win32_dbgmodel.py +26 -0
  741. angr/procedures/definitions/win32_dciman32.py +64 -0
  742. angr/procedures/definitions/win32_dcomp.py +48 -0
  743. angr/procedures/definitions/win32_ddraw.py +38 -0
  744. angr/procedures/definitions/win32_deviceaccess.py +26 -0
  745. angr/procedures/definitions/win32_dflayout.py +26 -0
  746. angr/procedures/definitions/win32_dhcpcsvc.py +54 -0
  747. angr/procedures/definitions/win32_dhcpcsvc6.py +36 -0
  748. angr/procedures/definitions/win32_dhcpsapi.py +416 -0
  749. angr/procedures/definitions/win32_diagnosticdataquery.py +94 -0
  750. angr/procedures/definitions/win32_dinput8.py +26 -0
  751. angr/procedures/definitions/win32_directml.py +28 -0
  752. angr/procedures/definitions/win32_dmprocessxmlfiltered.py +26 -0
  753. angr/procedures/definitions/win32_dnsapi.py +152 -0
  754. angr/procedures/definitions/win32_drt.py +56 -0
  755. angr/procedures/definitions/win32_drtprov.py +42 -0
  756. angr/procedures/definitions/win32_drttransport.py +28 -0
  757. angr/procedures/definitions/win32_dsound.py +44 -0
  758. angr/procedures/definitions/win32_dsparse.py +62 -0
  759. angr/procedures/definitions/win32_dsprop.py +38 -0
  760. angr/procedures/definitions/win32_dssec.py +32 -0
  761. angr/procedures/definitions/win32_dsuiext.py +32 -0
  762. angr/procedures/definitions/win32_dwmapi.py +86 -0
  763. angr/procedures/definitions/win32_dwrite.py +26 -0
  764. angr/procedures/definitions/win32_dxcompiler.py +28 -0
  765. angr/procedures/definitions/win32_dxcore.py +26 -0
  766. angr/procedures/definitions/win32_dxgi.py +36 -0
  767. angr/procedures/definitions/win32_dxva2.py +100 -0
  768. angr/procedures/definitions/win32_eappcfg.py +52 -0
  769. angr/procedures/definitions/win32_eappprxy.py +60 -0
  770. angr/procedures/definitions/win32_efswrt.py +28 -0
  771. angr/procedures/definitions/win32_elscore.py +34 -0
  772. angr/procedures/definitions/win32_esent.py +482 -0
  773. angr/procedures/definitions/win32_evr.py +38 -0
  774. angr/procedures/definitions/win32_faultrep.py +32 -0
  775. angr/procedures/definitions/win32_fhsvcctl.py +38 -0
  776. angr/procedures/definitions/win32_firewallapi.py +30 -0
  777. angr/procedures/definitions/win32_fltlib.py +80 -0
  778. angr/procedures/definitions/win32_fontsub.py +28 -0
  779. angr/procedures/definitions/win32_forceinline.py +30 -0
  780. angr/procedures/definitions/win32_fwpuclnt.py +408 -0
  781. angr/procedures/definitions/win32_fxsutility.py +28 -0
  782. angr/procedures/definitions/win32_gdi32.py +886 -0
  783. angr/procedures/definitions/win32_gdiplus.py +1282 -0
  784. angr/procedures/definitions/win32_glu32.py +128 -0
  785. angr/procedures/definitions/win32_gpedit.py +36 -0
  786. angr/procedures/definitions/win32_hhctrl_ocx.py +28 -0
  787. angr/procedures/definitions/win32_hid.py +114 -0
  788. angr/procedures/definitions/win32_hlink.py +80 -0
  789. angr/procedures/definitions/win32_hrtfapo.py +26 -0
  790. angr/procedures/definitions/win32_httpapi.py +110 -0
  791. angr/procedures/definitions/win32_icm32.py +66 -0
  792. angr/procedures/definitions/win32_icmui.py +28 -0
  793. angr/procedures/definitions/win32_icu.py +2074 -0
  794. angr/procedures/definitions/win32_ieframe.py +82 -0
  795. angr/procedures/definitions/win32_imagehlp.py +76 -0
  796. angr/procedures/definitions/win32_imgutil.py +42 -0
  797. angr/procedures/definitions/win32_imm32.py +188 -0
  798. angr/procedures/definitions/win32_infocardapi.py +58 -0
  799. angr/procedures/definitions/win32_inkobjcore.py +78 -0
  800. angr/procedures/definitions/win32_iphlpapi.py +426 -0
  801. angr/procedures/definitions/win32_iscsidsc.py +182 -0
  802. angr/procedures/definitions/win32_isolatedwindowsenvironmentutils.py +28 -0
  803. angr/procedures/definitions/win32_kernel32.py +3185 -0
  804. angr/procedures/definitions/win32_kernelbase.py +36 -0
  805. angr/procedures/definitions/win32_keycredmgr.py +32 -0
  806. angr/procedures/definitions/win32_ksproxy_ax.py +36 -0
  807. angr/procedures/definitions/win32_ksuser.py +40 -0
  808. angr/procedures/definitions/win32_ktmw32.py +102 -0
  809. angr/procedures/definitions/win32_licenseprotection.py +28 -0
  810. angr/procedures/definitions/win32_loadperf.py +48 -0
  811. angr/procedures/definitions/win32_magnification.py +62 -0
  812. angr/procedures/definitions/win32_mapi32.py +156 -0
  813. angr/procedures/definitions/win32_mdmlocalmanagement.py +30 -0
  814. angr/procedures/definitions/win32_mdmregistration.py +54 -0
  815. angr/procedures/definitions/win32_mf.py +148 -0
  816. angr/procedures/definitions/win32_mfcore.py +28 -0
  817. angr/procedures/definitions/win32_mfplat.py +314 -0
  818. angr/procedures/definitions/win32_mfplay.py +26 -0
  819. angr/procedures/definitions/win32_mfreadwrite.py +34 -0
  820. angr/procedures/definitions/win32_mfsensorgroup.py +44 -0
  821. angr/procedures/definitions/win32_mfsrcsnk.py +28 -0
  822. angr/procedures/definitions/win32_mgmtapi.py +42 -0
  823. angr/procedures/definitions/win32_mi.py +26 -0
  824. angr/procedures/definitions/win32_mmdevapi.py +26 -0
  825. angr/procedures/definitions/win32_mpr.py +118 -0
  826. angr/procedures/definitions/win32_mprapi.py +248 -0
  827. angr/procedures/definitions/win32_mqrt.py +92 -0
  828. angr/procedures/definitions/win32_mrmsupport.py +78 -0
  829. angr/procedures/definitions/win32_msacm32.py +108 -0
  830. angr/procedures/definitions/win32_msajapi.py +1118 -0
  831. angr/procedures/definitions/win32_mscms.py +182 -0
  832. angr/procedures/definitions/win32_mscoree.py +78 -0
  833. angr/procedures/definitions/win32_msctfmonitor.py +30 -0
  834. angr/procedures/definitions/win32_msdelta.py +56 -0
  835. angr/procedures/definitions/win32_msdmo.py +46 -0
  836. angr/procedures/definitions/win32_msdrm.py +192 -0
  837. angr/procedures/definitions/win32_msi.py +552 -0
  838. angr/procedures/definitions/win32_msimg32.py +30 -0
  839. angr/procedures/definitions/win32_mspatcha.py +56 -0
  840. angr/procedures/definitions/win32_mspatchc.py +42 -0
  841. angr/procedures/definitions/win32_msports.py +38 -0
  842. angr/procedures/definitions/win32_msrating.py +62 -0
  843. angr/procedures/definitions/win32_mssign32.py +44 -0
  844. angr/procedures/definitions/win32_mstask.py +28 -0
  845. angr/procedures/definitions/win32_msvfw32.py +110 -0
  846. angr/procedures/definitions/win32_mswsock.py +56 -0
  847. angr/procedures/definitions/win32_mtxdm.py +26 -0
  848. angr/procedures/definitions/win32_ncrypt.py +102 -0
  849. angr/procedures/definitions/win32_ndfapi.py +56 -0
  850. angr/procedures/definitions/win32_netapi32.py +436 -0
  851. angr/procedures/definitions/win32_netsh.py +40 -0
  852. angr/procedures/definitions/win32_netshell.py +28 -0
  853. angr/procedures/definitions/win32_newdev.py +46 -0
  854. angr/procedures/definitions/win32_ninput.py +84 -0
  855. angr/procedures/definitions/win32_normaliz.py +28 -0
  856. angr/procedures/definitions/win32_ntdll.py +171 -0
  857. angr/procedures/definitions/win32_ntdllk.py +26 -0
  858. angr/procedures/definitions/win32_ntdsapi.py +186 -0
  859. angr/procedures/definitions/win32_ntlanman.py +44 -0
  860. angr/procedures/definitions/win32_odbc32.py +392 -0
  861. angr/procedures/definitions/win32_odbcbcp.py +78 -0
  862. angr/procedures/definitions/win32_ole32.py +658 -0
  863. angr/procedures/definitions/win32_oleacc.py +58 -0
  864. angr/procedures/definitions/win32_oleaut32.py +834 -0
  865. angr/procedures/definitions/win32_oledlg.py +70 -0
  866. angr/procedures/definitions/win32_ondemandconnroutehelper.py +34 -0
  867. angr/procedures/definitions/win32_opengl32.py +734 -0
  868. angr/procedures/definitions/win32_opmxbox.py +30 -0
  869. angr/procedures/definitions/win32_p2p.py +240 -0
  870. angr/procedures/definitions/win32_p2pgraph.py +98 -0
  871. angr/procedures/definitions/win32_pdh.py +220 -0
  872. angr/procedures/definitions/win32_peerdist.py +80 -0
  873. angr/procedures/definitions/win32_powrprof.py +192 -0
  874. angr/procedures/definitions/win32_prntvpt.py +46 -0
  875. angr/procedures/definitions/win32_projectedfslib.py +62 -0
  876. angr/procedures/definitions/win32_propsys.py +460 -0
  877. angr/procedures/definitions/win32_psapi.py +78 -0
  878. angr/procedures/definitions/win32_quartz.py +28 -0
  879. angr/procedures/definitions/win32_query.py +32 -0
  880. angr/procedures/definitions/win32_qwave.py +46 -0
  881. angr/procedures/definitions/win32_rasapi32.py +192 -0
  882. angr/procedures/definitions/win32_rasdlg.py +36 -0
  883. angr/procedures/definitions/win32_resutils.py +264 -0
  884. angr/procedures/definitions/win32_rometadata.py +24 -0
  885. angr/procedures/definitions/win32_rpcns4.py +146 -0
  886. angr/procedures/definitions/win32_rpcproxy.py +32 -0
  887. angr/procedures/definitions/win32_rpcrt4.py +918 -0
  888. angr/procedures/definitions/win32_rstrtmgr.py +46 -0
  889. angr/procedures/definitions/win32_rtm.py +176 -0
  890. angr/procedures/definitions/win32_rtutils.py +106 -0
  891. angr/procedures/definitions/win32_rtworkq.py +90 -0
  892. angr/procedures/definitions/win32_sas.py +26 -0
  893. angr/procedures/definitions/win32_scarddlg.py +34 -0
  894. angr/procedures/definitions/win32_schannel.py +42 -0
  895. angr/procedures/definitions/win32_sechost.py +28 -0
  896. angr/procedures/definitions/win32_secur32.py +202 -0
  897. angr/procedures/definitions/win32_sensapi.py +30 -0
  898. angr/procedures/definitions/win32_sensorsutilsv2.py +104 -0
  899. angr/procedures/definitions/win32_setupapi.py +692 -0
  900. angr/procedures/definitions/win32_sfc.py +36 -0
  901. angr/procedures/definitions/win32_shdocvw.py +30 -0
  902. angr/procedures/definitions/win32_shell32.py +512 -0
  903. angr/procedures/definitions/win32_shlwapi.py +744 -0
  904. angr/procedures/definitions/win32_slc.py +88 -0
  905. angr/procedures/definitions/win32_slcext.py +32 -0
  906. angr/procedures/definitions/win32_slwga.py +26 -0
  907. angr/procedures/definitions/win32_snmpapi.py +76 -0
  908. angr/procedures/definitions/win32_spoolss.py +76 -0
  909. angr/procedures/definitions/win32_srclient.py +26 -0
  910. angr/procedures/definitions/win32_srpapi.py +46 -0
  911. angr/procedures/definitions/win32_sspicli.py +38 -0
  912. angr/procedures/definitions/win32_sti.py +26 -0
  913. angr/procedures/definitions/win32_t2embed.py +52 -0
  914. angr/procedures/definitions/win32_tapi32.py +522 -0
  915. angr/procedures/definitions/win32_tbs.py +52 -0
  916. angr/procedures/definitions/win32_tdh.py +78 -0
  917. angr/procedures/definitions/win32_tokenbinding.py +44 -0
  918. angr/procedures/definitions/win32_traffic.py +64 -0
  919. angr/procedures/definitions/win32_txfw32.py +42 -0
  920. angr/procedures/definitions/win32_ualapi.py +32 -0
  921. angr/procedures/definitions/win32_uiautomationcore.py +220 -0
  922. angr/procedures/definitions/win32_urlmon.py +178 -0
  923. angr/procedures/definitions/win32_user32.py +1551 -0
  924. angr/procedures/definitions/win32_userenv.py +112 -0
  925. angr/procedures/definitions/win32_usp10.py +104 -0
  926. angr/procedures/definitions/win32_uxtheme.py +178 -0
  927. angr/procedures/definitions/win32_verifier.py +26 -0
  928. angr/procedures/definitions/win32_version.py +52 -0
  929. angr/procedures/definitions/win32_vertdll.py +38 -0
  930. angr/procedures/definitions/win32_virtdisk.py +82 -0
  931. angr/procedures/definitions/win32_vmdevicehost.py +50 -0
  932. angr/procedures/definitions/win32_vmsavedstatedumpprovider.py +110 -0
  933. angr/procedures/definitions/win32_vssapi.py +26 -0
  934. angr/procedures/definitions/win32_wcmapi.py +34 -0
  935. angr/procedures/definitions/win32_wdsbp.py +38 -0
  936. angr/procedures/definitions/win32_wdsclientapi.py +98 -0
  937. angr/procedures/definitions/win32_wdsmc.py +36 -0
  938. angr/procedures/definitions/win32_wdspxe.py +86 -0
  939. angr/procedures/definitions/win32_wdstptc.py +50 -0
  940. angr/procedures/definitions/win32_webauthn.py +50 -0
  941. angr/procedures/definitions/win32_webservices.py +410 -0
  942. angr/procedures/definitions/win32_websocket.py +50 -0
  943. angr/procedures/definitions/win32_wecapi.py +54 -0
  944. angr/procedures/definitions/win32_wer.py +66 -0
  945. angr/procedures/definitions/win32_wevtapi.py +94 -0
  946. angr/procedures/definitions/win32_winbio.py +132 -0
  947. angr/procedures/definitions/win32_windows_ai_machinelearning.py +26 -0
  948. angr/procedures/definitions/win32_windows_data_pdf.py +24 -0
  949. angr/procedures/definitions/win32_windows_media_mediacontrol.py +40 -0
  950. angr/procedures/definitions/win32_windows_networking.py +26 -0
  951. angr/procedures/definitions/win32_windows_ui_xaml.py +28 -0
  952. angr/procedures/definitions/win32_windowscodecs.py +42 -0
  953. angr/procedures/definitions/win32_winfax.py +136 -0
  954. angr/procedures/definitions/win32_winhttp.py +136 -0
  955. angr/procedures/definitions/win32_winhvemulation.py +32 -0
  956. angr/procedures/definitions/win32_winhvplatform.py +156 -0
  957. angr/procedures/definitions/win32_wininet.py +616 -0
  958. angr/procedures/definitions/win32_winml.py +26 -0
  959. angr/procedures/definitions/win32_winmm.py +376 -0
  960. angr/procedures/definitions/win32_winscard.py +164 -0
  961. angr/procedures/definitions/win32_winspool.py +364 -0
  962. angr/procedures/definitions/win32_winspool_drv.py +368 -0
  963. angr/procedures/definitions/win32_wintrust.py +144 -0
  964. angr/procedures/definitions/win32_winusb.py +92 -0
  965. angr/procedures/definitions/win32_wlanapi.py +144 -0
  966. angr/procedures/definitions/win32_wlanui.py +26 -0
  967. angr/procedures/definitions/win32_wldap32.py +510 -0
  968. angr/procedures/definitions/win32_wldp.py +42 -0
  969. angr/procedures/definitions/win32_wmvcore.py +46 -0
  970. angr/procedures/definitions/win32_wnvapi.py +28 -0
  971. angr/procedures/definitions/win32_wofutil.py +46 -0
  972. angr/procedures/definitions/win32_ws2_32.py +344 -0
  973. angr/procedures/definitions/win32_wscapi.py +36 -0
  974. angr/procedures/definitions/win32_wsclient.py +30 -0
  975. angr/procedures/definitions/win32_wsdapi.py +88 -0
  976. angr/procedures/definitions/win32_wsmsvc.py +90 -0
  977. angr/procedures/definitions/win32_wsnmp32.py +122 -0
  978. angr/procedures/definitions/win32_wtsapi32.py +150 -0
  979. angr/procedures/definitions/win32_xaudio2_8.py +32 -0
  980. angr/procedures/definitions/win32_xinput1_4.py +38 -0
  981. angr/procedures/definitions/win32_xinputuap.py +36 -0
  982. angr/procedures/definitions/win32_xmllite.py +36 -0
  983. angr/procedures/definitions/win32_xolehlp.py +32 -0
  984. angr/procedures/definitions/win32_xpsprint.py +28 -0
  985. angr/procedures/glibc/__ctype_b_loc.py +21 -0
  986. angr/procedures/glibc/__ctype_tolower_loc.py +21 -0
  987. angr/procedures/glibc/__ctype_toupper_loc.py +21 -0
  988. angr/procedures/glibc/__errno_location.py +7 -0
  989. angr/procedures/glibc/__init__.py +3 -0
  990. angr/procedures/glibc/__libc_init.py +37 -0
  991. angr/procedures/glibc/__libc_start_main.py +301 -0
  992. angr/procedures/glibc/dynamic_loading.py +20 -0
  993. angr/procedures/glibc/scanf.py +11 -0
  994. angr/procedures/glibc/sscanf.py +6 -0
  995. angr/procedures/gnulib/__init__.py +3 -0
  996. angr/procedures/gnulib/xalloc_die.py +14 -0
  997. angr/procedures/gnulib/xstrtol_fatal.py +14 -0
  998. angr/procedures/java/__init__.py +42 -0
  999. angr/procedures/java/unconstrained.py +65 -0
  1000. angr/procedures/java_io/__init__.py +0 -0
  1001. angr/procedures/java_io/read.py +12 -0
  1002. angr/procedures/java_io/write.py +17 -0
  1003. angr/procedures/java_jni/__init__.py +482 -0
  1004. angr/procedures/java_jni/array_operations.py +312 -0
  1005. angr/procedures/java_jni/class_and_interface_operations.py +31 -0
  1006. angr/procedures/java_jni/field_access.py +173 -0
  1007. angr/procedures/java_jni/global_and_local_refs.py +57 -0
  1008. angr/procedures/java_jni/method_calls.py +365 -0
  1009. angr/procedures/java_jni/not_implemented.py +26 -0
  1010. angr/procedures/java_jni/object_operations.py +94 -0
  1011. angr/procedures/java_jni/string_operations.py +87 -0
  1012. angr/procedures/java_jni/version_information.py +12 -0
  1013. angr/procedures/java_lang/__init__.py +0 -0
  1014. angr/procedures/java_lang/character.py +30 -0
  1015. angr/procedures/java_lang/double.py +24 -0
  1016. angr/procedures/java_lang/exit.py +13 -0
  1017. angr/procedures/java_lang/getsimplename.py +18 -0
  1018. angr/procedures/java_lang/integer.py +43 -0
  1019. angr/procedures/java_lang/load_library.py +9 -0
  1020. angr/procedures/java_lang/math.py +15 -0
  1021. angr/procedures/java_lang/string.py +78 -0
  1022. angr/procedures/java_lang/stringbuilder.py +44 -0
  1023. angr/procedures/java_lang/system.py +18 -0
  1024. angr/procedures/java_util/__init__.py +0 -0
  1025. angr/procedures/java_util/collection.py +35 -0
  1026. angr/procedures/java_util/iterator.py +46 -0
  1027. angr/procedures/java_util/list.py +99 -0
  1028. angr/procedures/java_util/map.py +131 -0
  1029. angr/procedures/java_util/random.py +14 -0
  1030. angr/procedures/java_util/scanner_nextline.py +23 -0
  1031. angr/procedures/libc/__init__.py +3 -0
  1032. angr/procedures/libc/abort.py +9 -0
  1033. angr/procedures/libc/access.py +13 -0
  1034. angr/procedures/libc/atoi.py +14 -0
  1035. angr/procedures/libc/atol.py +13 -0
  1036. angr/procedures/libc/calloc.py +8 -0
  1037. angr/procedures/libc/closelog.py +10 -0
  1038. angr/procedures/libc/err.py +14 -0
  1039. angr/procedures/libc/error.py +54 -0
  1040. angr/procedures/libc/exit.py +11 -0
  1041. angr/procedures/libc/fclose.py +19 -0
  1042. angr/procedures/libc/feof.py +21 -0
  1043. angr/procedures/libc/fflush.py +16 -0
  1044. angr/procedures/libc/fgetc.py +27 -0
  1045. angr/procedures/libc/fgets.py +68 -0
  1046. angr/procedures/libc/fopen.py +63 -0
  1047. angr/procedures/libc/fprintf.py +25 -0
  1048. angr/procedures/libc/fputc.py +23 -0
  1049. angr/procedures/libc/fputs.py +24 -0
  1050. angr/procedures/libc/fread.py +24 -0
  1051. angr/procedures/libc/free.py +9 -0
  1052. angr/procedures/libc/fscanf.py +20 -0
  1053. angr/procedures/libc/fseek.py +34 -0
  1054. angr/procedures/libc/ftell.py +22 -0
  1055. angr/procedures/libc/fwrite.py +19 -0
  1056. angr/procedures/libc/getchar.py +13 -0
  1057. angr/procedures/libc/getdelim.py +99 -0
  1058. angr/procedures/libc/getegid.py +8 -0
  1059. angr/procedures/libc/geteuid.py +8 -0
  1060. angr/procedures/libc/getgid.py +8 -0
  1061. angr/procedures/libc/gets.py +68 -0
  1062. angr/procedures/libc/getuid.py +8 -0
  1063. angr/procedures/libc/malloc.py +12 -0
  1064. angr/procedures/libc/memcmp.py +69 -0
  1065. angr/procedures/libc/memcpy.py +38 -0
  1066. angr/procedures/libc/memset.py +72 -0
  1067. angr/procedures/libc/openlog.py +10 -0
  1068. angr/procedures/libc/perror.py +13 -0
  1069. angr/procedures/libc/printf.py +34 -0
  1070. angr/procedures/libc/putchar.py +13 -0
  1071. angr/procedures/libc/puts.py +19 -0
  1072. angr/procedures/libc/rand.py +8 -0
  1073. angr/procedures/libc/realloc.py +8 -0
  1074. angr/procedures/libc/rewind.py +12 -0
  1075. angr/procedures/libc/scanf.py +20 -0
  1076. angr/procedures/libc/setbuf.py +9 -0
  1077. angr/procedures/libc/setvbuf.py +7 -0
  1078. angr/procedures/libc/snprintf.py +36 -0
  1079. angr/procedures/libc/sprintf.py +25 -0
  1080. angr/procedures/libc/srand.py +7 -0
  1081. angr/procedures/libc/sscanf.py +13 -0
  1082. angr/procedures/libc/stpcpy.py +18 -0
  1083. angr/procedures/libc/strcat.py +14 -0
  1084. angr/procedures/libc/strchr.py +48 -0
  1085. angr/procedures/libc/strcmp.py +31 -0
  1086. angr/procedures/libc/strcpy.py +13 -0
  1087. angr/procedures/libc/strlen.py +114 -0
  1088. angr/procedures/libc/strncat.py +19 -0
  1089. angr/procedures/libc/strncmp.py +183 -0
  1090. angr/procedures/libc/strncpy.py +22 -0
  1091. angr/procedures/libc/strnlen.py +13 -0
  1092. angr/procedures/libc/strstr.py +101 -0
  1093. angr/procedures/libc/strtol.py +261 -0
  1094. angr/procedures/libc/strtoul.py +9 -0
  1095. angr/procedures/libc/system.py +13 -0
  1096. angr/procedures/libc/time.py +9 -0
  1097. angr/procedures/libc/tmpnam.py +20 -0
  1098. angr/procedures/libc/tolower.py +10 -0
  1099. angr/procedures/libc/toupper.py +10 -0
  1100. angr/procedures/libc/ungetc.py +20 -0
  1101. angr/procedures/libc/vsnprintf.py +17 -0
  1102. angr/procedures/libc/wchar.py +16 -0
  1103. angr/procedures/libstdcpp/__init__.py +0 -0
  1104. angr/procedures/libstdcpp/_unwind_resume.py +11 -0
  1105. angr/procedures/libstdcpp/std____throw_bad_alloc.py +13 -0
  1106. angr/procedures/libstdcpp/std____throw_bad_cast.py +13 -0
  1107. angr/procedures/libstdcpp/std____throw_length_error.py +13 -0
  1108. angr/procedures/libstdcpp/std____throw_logic_error.py +13 -0
  1109. angr/procedures/libstdcpp/std__terminate.py +13 -0
  1110. angr/procedures/linux_kernel/__init__.py +3 -0
  1111. angr/procedures/linux_kernel/access.py +18 -0
  1112. angr/procedures/linux_kernel/arch_prctl.py +34 -0
  1113. angr/procedures/linux_kernel/arm_user_helpers.py +59 -0
  1114. angr/procedures/linux_kernel/brk.py +18 -0
  1115. angr/procedures/linux_kernel/cwd.py +28 -0
  1116. angr/procedures/linux_kernel/fstat.py +138 -0
  1117. angr/procedures/linux_kernel/fstat64.py +170 -0
  1118. angr/procedures/linux_kernel/futex.py +17 -0
  1119. angr/procedures/linux_kernel/getegid.py +17 -0
  1120. angr/procedures/linux_kernel/geteuid.py +17 -0
  1121. angr/procedures/linux_kernel/getgid.py +17 -0
  1122. angr/procedures/linux_kernel/getpid.py +14 -0
  1123. angr/procedures/linux_kernel/getrlimit.py +24 -0
  1124. angr/procedures/linux_kernel/gettid.py +9 -0
  1125. angr/procedures/linux_kernel/getuid.py +17 -0
  1126. angr/procedures/linux_kernel/iovec.py +47 -0
  1127. angr/procedures/linux_kernel/lseek.py +42 -0
  1128. angr/procedures/linux_kernel/mmap.py +16 -0
  1129. angr/procedures/linux_kernel/mprotect.py +42 -0
  1130. angr/procedures/linux_kernel/munmap.py +8 -0
  1131. angr/procedures/linux_kernel/openat.py +26 -0
  1132. angr/procedures/linux_kernel/set_tid_address.py +8 -0
  1133. angr/procedures/linux_kernel/sigaction.py +19 -0
  1134. angr/procedures/linux_kernel/sigprocmask.py +23 -0
  1135. angr/procedures/linux_kernel/stat.py +23 -0
  1136. angr/procedures/linux_kernel/sysinfo.py +59 -0
  1137. angr/procedures/linux_kernel/tgkill.py +10 -0
  1138. angr/procedures/linux_kernel/time.py +34 -0
  1139. angr/procedures/linux_kernel/uid.py +30 -0
  1140. angr/procedures/linux_kernel/uname.py +29 -0
  1141. angr/procedures/linux_kernel/unlink.py +22 -0
  1142. angr/procedures/linux_kernel/vsyscall.py +16 -0
  1143. angr/procedures/linux_loader/__init__.py +3 -0
  1144. angr/procedures/linux_loader/_dl_initial_error_catch_tsd.py +7 -0
  1145. angr/procedures/linux_loader/_dl_rtld_lock.py +15 -0
  1146. angr/procedures/linux_loader/sim_loader.py +54 -0
  1147. angr/procedures/linux_loader/tls.py +40 -0
  1148. angr/procedures/msvcr/__getmainargs.py +16 -0
  1149. angr/procedures/msvcr/__init__.py +4 -0
  1150. angr/procedures/msvcr/_initterm.py +38 -0
  1151. angr/procedures/msvcr/fmode.py +31 -0
  1152. angr/procedures/ntdll/__init__.py +0 -0
  1153. angr/procedures/ntdll/exceptions.py +60 -0
  1154. angr/procedures/posix/__init__.py +3 -0
  1155. angr/procedures/posix/accept.py +29 -0
  1156. angr/procedures/posix/bind.py +13 -0
  1157. angr/procedures/posix/bzero.py +9 -0
  1158. angr/procedures/posix/chroot.py +27 -0
  1159. angr/procedures/posix/close.py +9 -0
  1160. angr/procedures/posix/closedir.py +7 -0
  1161. angr/procedures/posix/dup.py +56 -0
  1162. angr/procedures/posix/fcntl.py +10 -0
  1163. angr/procedures/posix/fdopen.py +76 -0
  1164. angr/procedures/posix/fileno.py +18 -0
  1165. angr/procedures/posix/fork.py +13 -0
  1166. angr/procedures/posix/getenv.py +35 -0
  1167. angr/procedures/posix/gethostbyname.py +43 -0
  1168. angr/procedures/posix/getpass.py +19 -0
  1169. angr/procedures/posix/getsockopt.py +11 -0
  1170. angr/procedures/posix/htonl.py +11 -0
  1171. angr/procedures/posix/htons.py +11 -0
  1172. angr/procedures/posix/inet_ntoa.py +59 -0
  1173. angr/procedures/posix/listen.py +13 -0
  1174. angr/procedures/posix/mmap.py +144 -0
  1175. angr/procedures/posix/open.py +18 -0
  1176. angr/procedures/posix/opendir.py +10 -0
  1177. angr/procedures/posix/poll.py +55 -0
  1178. angr/procedures/posix/pread64.py +46 -0
  1179. angr/procedures/posix/pthread.py +87 -0
  1180. angr/procedures/posix/pwrite64.py +46 -0
  1181. angr/procedures/posix/read.py +13 -0
  1182. angr/procedures/posix/readdir.py +62 -0
  1183. angr/procedures/posix/recv.py +13 -0
  1184. angr/procedures/posix/recvfrom.py +13 -0
  1185. angr/procedures/posix/select.py +48 -0
  1186. angr/procedures/posix/send.py +23 -0
  1187. angr/procedures/posix/setsockopt.py +9 -0
  1188. angr/procedures/posix/sigaction.py +23 -0
  1189. angr/procedures/posix/sim_time.py +48 -0
  1190. angr/procedures/posix/sleep.py +8 -0
  1191. angr/procedures/posix/socket.py +18 -0
  1192. angr/procedures/posix/strcasecmp.py +26 -0
  1193. angr/procedures/posix/strdup.py +18 -0
  1194. angr/procedures/posix/strtok_r.py +64 -0
  1195. angr/procedures/posix/syslog.py +15 -0
  1196. angr/procedures/posix/tz.py +9 -0
  1197. angr/procedures/posix/unlink.py +11 -0
  1198. angr/procedures/posix/usleep.py +8 -0
  1199. angr/procedures/posix/write.py +13 -0
  1200. angr/procedures/procedure_dict.py +50 -0
  1201. angr/procedures/stubs/CallReturn.py +13 -0
  1202. angr/procedures/stubs/NoReturnUnconstrained.py +13 -0
  1203. angr/procedures/stubs/Nop.py +7 -0
  1204. angr/procedures/stubs/PathTerminator.py +9 -0
  1205. angr/procedures/stubs/Redirect.py +18 -0
  1206. angr/procedures/stubs/ReturnChar.py +11 -0
  1207. angr/procedures/stubs/ReturnUnconstrained.py +24 -0
  1208. angr/procedures/stubs/UnresolvableCallTarget.py +9 -0
  1209. angr/procedures/stubs/UnresolvableJumpTarget.py +9 -0
  1210. angr/procedures/stubs/UserHook.py +18 -0
  1211. angr/procedures/stubs/__init__.py +3 -0
  1212. angr/procedures/stubs/b64_decode.py +15 -0
  1213. angr/procedures/stubs/caller.py +14 -0
  1214. angr/procedures/stubs/crazy_scanf.py +20 -0
  1215. angr/procedures/stubs/format_parser.py +669 -0
  1216. angr/procedures/stubs/syscall_stub.py +24 -0
  1217. angr/procedures/testing/__init__.py +3 -0
  1218. angr/procedures/testing/manyargs.py +9 -0
  1219. angr/procedures/testing/retreg.py +8 -0
  1220. angr/procedures/tracer/__init__.py +4 -0
  1221. angr/procedures/tracer/random.py +9 -0
  1222. angr/procedures/tracer/receive.py +23 -0
  1223. angr/procedures/tracer/transmit.py +26 -0
  1224. angr/procedures/uclibc/__init__.py +3 -0
  1225. angr/procedures/uclibc/__uClibc_main.py +10 -0
  1226. angr/procedures/win32/EncodePointer.py +7 -0
  1227. angr/procedures/win32/ExitProcess.py +9 -0
  1228. angr/procedures/win32/GetCommandLine.py +12 -0
  1229. angr/procedures/win32/GetCurrentProcessId.py +7 -0
  1230. angr/procedures/win32/GetCurrentThreadId.py +7 -0
  1231. angr/procedures/win32/GetLastInputInfo.py +40 -0
  1232. angr/procedures/win32/GetModuleHandle.py +29 -0
  1233. angr/procedures/win32/GetProcessAffinityMask.py +37 -0
  1234. angr/procedures/win32/InterlockedExchange.py +15 -0
  1235. angr/procedures/win32/IsProcessorFeaturePresent.py +7 -0
  1236. angr/procedures/win32/VirtualAlloc.py +114 -0
  1237. angr/procedures/win32/VirtualProtect.py +60 -0
  1238. angr/procedures/win32/__init__.py +3 -0
  1239. angr/procedures/win32/critical_section.py +12 -0
  1240. angr/procedures/win32/dynamic_loading.py +104 -0
  1241. angr/procedures/win32/file_handles.py +47 -0
  1242. angr/procedures/win32/gethostbyname.py +12 -0
  1243. angr/procedures/win32/heap.py +45 -0
  1244. angr/procedures/win32/is_bad_ptr.py +26 -0
  1245. angr/procedures/win32/local_storage.py +88 -0
  1246. angr/procedures/win32/mutex.py +11 -0
  1247. angr/procedures/win32/sim_time.py +135 -0
  1248. angr/procedures/win32/system_paths.py +35 -0
  1249. angr/procedures/win32_kernel/ExAllocatePool.py +13 -0
  1250. angr/procedures/win32_kernel/ExFreePoolWithTag.py +8 -0
  1251. angr/procedures/win32_kernel/__fastfail.py +15 -0
  1252. angr/procedures/win32_kernel/__init__.py +3 -0
  1253. angr/procedures/win_user32/__init__.py +0 -0
  1254. angr/procedures/win_user32/chars.py +15 -0
  1255. angr/procedures/win_user32/keyboard.py +14 -0
  1256. angr/procedures/win_user32/messagebox.py +49 -0
  1257. angr/project.py +847 -0
  1258. angr/protos/__init__.py +19 -0
  1259. angr/protos/cfg_pb2.py +31 -0
  1260. angr/protos/function_pb2.py +27 -0
  1261. angr/protos/primitives_pb2.py +52 -0
  1262. angr/protos/variables_pb2.py +44 -0
  1263. angr/protos/xrefs_pb2.py +25 -0
  1264. angr/py.typed +1 -0
  1265. angr/rustylib.abi3.so +0 -0
  1266. angr/serializable.py +66 -0
  1267. angr/sim_manager.py +971 -0
  1268. angr/sim_options.py +438 -0
  1269. angr/sim_procedure.py +606 -0
  1270. angr/sim_state.py +901 -0
  1271. angr/sim_state_options.py +403 -0
  1272. angr/sim_type.py +3702 -0
  1273. angr/sim_variable.py +465 -0
  1274. angr/simos/__init__.py +47 -0
  1275. angr/simos/cgc.py +153 -0
  1276. angr/simos/javavm.py +458 -0
  1277. angr/simos/linux.py +509 -0
  1278. angr/simos/simos.py +444 -0
  1279. angr/simos/snimmuc_nxp.py +149 -0
  1280. angr/simos/userland.py +163 -0
  1281. angr/simos/windows.py +601 -0
  1282. angr/simos/xbox.py +32 -0
  1283. angr/slicer.py +352 -0
  1284. angr/state_hierarchy.py +262 -0
  1285. angr/state_plugins/__init__.py +84 -0
  1286. angr/state_plugins/callstack.py +398 -0
  1287. angr/state_plugins/cgc.py +155 -0
  1288. angr/state_plugins/debug_variables.py +192 -0
  1289. angr/state_plugins/filesystem.py +463 -0
  1290. angr/state_plugins/gdb.py +148 -0
  1291. angr/state_plugins/globals.py +65 -0
  1292. angr/state_plugins/heap/__init__.py +15 -0
  1293. angr/state_plugins/heap/heap_base.py +128 -0
  1294. angr/state_plugins/heap/heap_brk.py +136 -0
  1295. angr/state_plugins/heap/heap_freelist.py +213 -0
  1296. angr/state_plugins/heap/heap_libc.py +46 -0
  1297. angr/state_plugins/heap/heap_ptmalloc.py +620 -0
  1298. angr/state_plugins/heap/utils.py +22 -0
  1299. angr/state_plugins/history.py +564 -0
  1300. angr/state_plugins/inspect.py +375 -0
  1301. angr/state_plugins/javavm_classloader.py +134 -0
  1302. angr/state_plugins/jni_references.py +95 -0
  1303. angr/state_plugins/libc.py +1263 -0
  1304. angr/state_plugins/light_registers.py +168 -0
  1305. angr/state_plugins/log.py +84 -0
  1306. angr/state_plugins/loop_data.py +92 -0
  1307. angr/state_plugins/plugin.py +170 -0
  1308. angr/state_plugins/posix.py +703 -0
  1309. angr/state_plugins/preconstrainer.py +196 -0
  1310. angr/state_plugins/scratch.py +173 -0
  1311. angr/state_plugins/sim_action.py +326 -0
  1312. angr/state_plugins/sim_action_object.py +271 -0
  1313. angr/state_plugins/sim_event.py +59 -0
  1314. angr/state_plugins/solver.py +1127 -0
  1315. angr/state_plugins/symbolizer.py +291 -0
  1316. angr/state_plugins/trace_additions.py +738 -0
  1317. angr/state_plugins/uc_manager.py +94 -0
  1318. angr/state_plugins/unicorn_engine.py +1886 -0
  1319. angr/state_plugins/view.py +340 -0
  1320. angr/storage/__init__.py +15 -0
  1321. angr/storage/file.py +1210 -0
  1322. angr/storage/memory_mixins/__init__.py +317 -0
  1323. angr/storage/memory_mixins/actions_mixin.py +72 -0
  1324. angr/storage/memory_mixins/address_concretization_mixin.py +384 -0
  1325. angr/storage/memory_mixins/bvv_conversion_mixin.py +73 -0
  1326. angr/storage/memory_mixins/clouseau_mixin.py +137 -0
  1327. angr/storage/memory_mixins/conditional_store_mixin.py +25 -0
  1328. angr/storage/memory_mixins/convenient_mappings_mixin.py +256 -0
  1329. angr/storage/memory_mixins/default_filler_mixin.py +144 -0
  1330. angr/storage/memory_mixins/dirty_addrs_mixin.py +11 -0
  1331. angr/storage/memory_mixins/hex_dumper_mixin.py +82 -0
  1332. angr/storage/memory_mixins/javavm_memory_mixin.py +392 -0
  1333. angr/storage/memory_mixins/keyvalue_memory_mixin.py +42 -0
  1334. angr/storage/memory_mixins/label_merger_mixin.py +31 -0
  1335. angr/storage/memory_mixins/memory_mixin.py +174 -0
  1336. angr/storage/memory_mixins/multi_value_merger_mixin.py +79 -0
  1337. angr/storage/memory_mixins/name_resolution_mixin.py +67 -0
  1338. angr/storage/memory_mixins/paged_memory/__init__.py +0 -0
  1339. angr/storage/memory_mixins/paged_memory/page_backer_mixins.py +266 -0
  1340. angr/storage/memory_mixins/paged_memory/paged_memory_mixin.py +743 -0
  1341. angr/storage/memory_mixins/paged_memory/paged_memory_multivalue_mixin.py +65 -0
  1342. angr/storage/memory_mixins/paged_memory/pages/__init__.py +26 -0
  1343. angr/storage/memory_mixins/paged_memory/pages/base.py +31 -0
  1344. angr/storage/memory_mixins/paged_memory/pages/cooperation.py +341 -0
  1345. angr/storage/memory_mixins/paged_memory/pages/history_tracking_mixin.py +92 -0
  1346. angr/storage/memory_mixins/paged_memory/pages/ispo_mixin.py +55 -0
  1347. angr/storage/memory_mixins/paged_memory/pages/list_page.py +338 -0
  1348. angr/storage/memory_mixins/paged_memory/pages/multi_values.py +324 -0
  1349. angr/storage/memory_mixins/paged_memory/pages/mv_list_page.py +419 -0
  1350. angr/storage/memory_mixins/paged_memory/pages/permissions_mixin.py +36 -0
  1351. angr/storage/memory_mixins/paged_memory/pages/refcount_mixin.py +52 -0
  1352. angr/storage/memory_mixins/paged_memory/pages/ultra_page.py +503 -0
  1353. angr/storage/memory_mixins/paged_memory/privileged_mixin.py +36 -0
  1354. angr/storage/memory_mixins/paged_memory/stack_allocation_mixin.py +74 -0
  1355. angr/storage/memory_mixins/regioned_memory/__init__.py +17 -0
  1356. angr/storage/memory_mixins/regioned_memory/abstract_address_descriptor.py +36 -0
  1357. angr/storage/memory_mixins/regioned_memory/abstract_merger_mixin.py +31 -0
  1358. angr/storage/memory_mixins/regioned_memory/region_category_mixin.py +9 -0
  1359. angr/storage/memory_mixins/regioned_memory/region_data.py +246 -0
  1360. angr/storage/memory_mixins/regioned_memory/region_meta_mixin.py +241 -0
  1361. angr/storage/memory_mixins/regioned_memory/regioned_address_concretization_mixin.py +119 -0
  1362. angr/storage/memory_mixins/regioned_memory/regioned_memory_mixin.py +441 -0
  1363. angr/storage/memory_mixins/regioned_memory/static_find_mixin.py +69 -0
  1364. angr/storage/memory_mixins/simple_interface_mixin.py +71 -0
  1365. angr/storage/memory_mixins/simplification_mixin.py +15 -0
  1366. angr/storage/memory_mixins/size_resolution_mixin.py +143 -0
  1367. angr/storage/memory_mixins/slotted_memory.py +140 -0
  1368. angr/storage/memory_mixins/smart_find_mixin.py +161 -0
  1369. angr/storage/memory_mixins/symbolic_merger_mixin.py +16 -0
  1370. angr/storage/memory_mixins/top_merger_mixin.py +25 -0
  1371. angr/storage/memory_mixins/underconstrained_mixin.py +67 -0
  1372. angr/storage/memory_mixins/unwrapper_mixin.py +26 -0
  1373. angr/storage/memory_object.py +195 -0
  1374. angr/tablespecs.py +91 -0
  1375. angr/unicornlib.so +0 -0
  1376. angr/utils/__init__.py +46 -0
  1377. angr/utils/ail.py +70 -0
  1378. angr/utils/algo.py +34 -0
  1379. angr/utils/bits.py +46 -0
  1380. angr/utils/constants.py +9 -0
  1381. angr/utils/cowdict.py +63 -0
  1382. angr/utils/cpp.py +17 -0
  1383. angr/utils/doms.py +149 -0
  1384. angr/utils/dynamic_dictlist.py +89 -0
  1385. angr/utils/endness.py +18 -0
  1386. angr/utils/enums_conv.py +97 -0
  1387. angr/utils/env.py +12 -0
  1388. angr/utils/formatting.py +128 -0
  1389. angr/utils/funcid.py +159 -0
  1390. angr/utils/graph.py +933 -0
  1391. angr/utils/lazy_import.py +13 -0
  1392. angr/utils/library.py +212 -0
  1393. angr/utils/loader.py +55 -0
  1394. angr/utils/mp.py +66 -0
  1395. angr/utils/orderedset.py +74 -0
  1396. angr/utils/ssa/__init__.py +457 -0
  1397. angr/utils/ssa/tmp_uses_collector.py +23 -0
  1398. angr/utils/ssa/vvar_uses_collector.py +37 -0
  1399. angr/utils/tagged_interval_map.py +112 -0
  1400. angr/utils/timing.py +74 -0
  1401. angr/utils/types.py +151 -0
  1402. angr/utils/vex.py +11 -0
  1403. angr/vaults.py +367 -0
  1404. angr-9.2.166.dist-info/METADATA +110 -0
  1405. angr-9.2.166.dist-info/RECORD +1409 -0
  1406. angr-9.2.166.dist-info/WHEEL +5 -0
  1407. angr-9.2.166.dist-info/entry_points.txt +2 -0
  1408. angr-9.2.166.dist-info/licenses/LICENSE +27 -0
  1409. angr-9.2.166.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1666 @@
1
+ # pylint:disable=missing-class-docstring,too-many-boolean-expressions
2
+ from __future__ import annotations
3
+ import enum
4
+ from collections import defaultdict
5
+ from contextlib import suppress
6
+ import logging
7
+
8
+ import networkx
9
+ from sortedcontainers import SortedDict
10
+
11
+ from angr.utils.constants import MAX_POINTSTO_BITS
12
+ from .typevars import (
13
+ Existence,
14
+ Subtype,
15
+ Equivalence,
16
+ Add,
17
+ TypeVariable,
18
+ DerivedTypeVariable,
19
+ HasField,
20
+ IsArray,
21
+ TypeConstraint,
22
+ Load,
23
+ Store,
24
+ BaseLabel,
25
+ FuncIn,
26
+ FuncOut,
27
+ ConvertTo,
28
+ new_dtv,
29
+ )
30
+ from .typeconsts import (
31
+ BottomType,
32
+ TopType,
33
+ TypeConstant,
34
+ Int,
35
+ Int8,
36
+ Int16,
37
+ Int32,
38
+ Int64,
39
+ Pointer,
40
+ Pointer32,
41
+ Pointer64,
42
+ Struct,
43
+ Array,
44
+ Function,
45
+ int_type,
46
+ Float,
47
+ Float32,
48
+ Float64,
49
+ )
50
+ from .variance import Variance
51
+ from .dfa import DFAConstraintSolver, EmptyEpsilonNFAError
52
+
53
+ _l = logging.getLogger(__name__)
54
+
55
+
56
+ Top_ = TopType()
57
+ Int_ = Int()
58
+ Int64_ = Int64()
59
+ Int32_ = Int32()
60
+ Int16_ = Int16()
61
+ Int8_ = Int8()
62
+ Bottom_ = BottomType()
63
+ Pointer64_ = Pointer64()
64
+ Pointer32_ = Pointer32()
65
+ Struct_ = Struct()
66
+ Array_ = Array()
67
+ Float_ = Float()
68
+ Float32_ = Float32()
69
+ Float64_ = Float64()
70
+
71
+
72
+ PRIMITIVE_TYPES = {
73
+ Top_,
74
+ Int_,
75
+ Int8_,
76
+ Int16_,
77
+ Int32_,
78
+ Int64_,
79
+ Pointer32_,
80
+ Pointer64_,
81
+ Bottom_,
82
+ Struct_,
83
+ Array_,
84
+ Float_,
85
+ Float32_,
86
+ Float64_,
87
+ }
88
+
89
+
90
+ # lattice for 64-bit binaries
91
+ BASE_LATTICE_64 = networkx.DiGraph()
92
+ BASE_LATTICE_64.add_edge(Top_, Int_)
93
+ BASE_LATTICE_64.add_edge(Int_, Int64_)
94
+ BASE_LATTICE_64.add_edge(Int_, Int32_)
95
+ BASE_LATTICE_64.add_edge(Int_, Int16_)
96
+ BASE_LATTICE_64.add_edge(Int_, Int8_)
97
+ BASE_LATTICE_64.add_edge(Int32_, Bottom_)
98
+ BASE_LATTICE_64.add_edge(Int16_, Bottom_)
99
+ BASE_LATTICE_64.add_edge(Int8_, Bottom_)
100
+ BASE_LATTICE_64.add_edge(Int64_, Pointer64_)
101
+ BASE_LATTICE_64.add_edge(Pointer64_, Bottom_)
102
+
103
+ # lattice for 32-bit binaries
104
+ BASE_LATTICE_32 = networkx.DiGraph()
105
+ BASE_LATTICE_32.add_edge(Top_, Int_)
106
+ BASE_LATTICE_32.add_edge(Int_, Int64_)
107
+ BASE_LATTICE_32.add_edge(Int_, Int32_)
108
+ BASE_LATTICE_32.add_edge(Int_, Int16_)
109
+ BASE_LATTICE_32.add_edge(Int_, Int8_)
110
+ BASE_LATTICE_32.add_edge(Int32_, Pointer32_)
111
+ BASE_LATTICE_32.add_edge(Int64_, Bottom_)
112
+ BASE_LATTICE_32.add_edge(Pointer32_, Bottom_)
113
+ BASE_LATTICE_32.add_edge(Int16_, Bottom_)
114
+ BASE_LATTICE_32.add_edge(Int8_, Bottom_)
115
+
116
+ BASE_LATTICES = {
117
+ 32: BASE_LATTICE_32,
118
+ 64: BASE_LATTICE_64,
119
+ }
120
+
121
+
122
+ #
123
+ # Sketch
124
+ #
125
+
126
+
127
+ class SketchNodeBase:
128
+ """
129
+ The base class for nodes in a sketch.
130
+ """
131
+
132
+ __slots__ = ()
133
+
134
+
135
+ class SketchNode(SketchNodeBase):
136
+ """
137
+ Represents a node in a sketch graph.
138
+ """
139
+
140
+ __slots__ = ("lower_bound", "typevar", "upper_bound")
141
+
142
+ def __init__(self, typevar: TypeVariable | DerivedTypeVariable):
143
+ self.typevar: TypeVariable | DerivedTypeVariable = typevar
144
+ self.upper_bound: TypeConstant = TopType()
145
+ self.lower_bound: TypeConstant = BottomType()
146
+
147
+ def __repr__(self):
148
+ return f"{self.lower_bound} <: {self.typevar} <: {self.upper_bound}"
149
+
150
+ def __eq__(self, other):
151
+ return isinstance(other, SketchNode) and self.typevar == other.typevar
152
+
153
+ def __hash__(self):
154
+ return hash((SketchNode, self.typevar))
155
+
156
+ @property
157
+ def size(self) -> int | None:
158
+ """
159
+ Best-effort estimation of the size of the typevar (in bits). Returns None if we cannot determine.
160
+ """
161
+
162
+ if isinstance(self.typevar, DerivedTypeVariable):
163
+ last_label = self.typevar.labels[-1]
164
+ if isinstance(last_label, HasField) and last_label.bits != MAX_POINTSTO_BITS:
165
+ return last_label.bits
166
+ if isinstance(self.lower_bound, TypeConstant) and not isinstance(self.lower_bound, (TopType, BottomType)):
167
+ with suppress(NotImplementedError):
168
+ return self.lower_bound.size * 8
169
+ if isinstance(self.upper_bound, TypeConstant) and not isinstance(self.upper_bound, (TopType, BottomType)):
170
+ with suppress(NotImplementedError):
171
+ return self.upper_bound.size * 8
172
+ return None
173
+
174
+
175
+ class RecursiveRefNode(SketchNodeBase):
176
+ """
177
+ Represents a cycle in a sketch graph.
178
+
179
+ This is equivalent to sketches.LabelNode in the reference implementation of retypd.
180
+ """
181
+
182
+ def __init__(self, target: DerivedTypeVariable):
183
+ self.target: DerivedTypeVariable = target
184
+
185
+ def __hash__(self):
186
+ return hash((RecursiveRefNode, self.target))
187
+
188
+ def __eq__(self, other):
189
+ return type(other) is RecursiveRefNode and other.target == self.target
190
+
191
+
192
+ class Sketch:
193
+ """
194
+ Describes the sketch of a type variable.
195
+ """
196
+
197
+ __slots__ = (
198
+ "graph",
199
+ "node_mapping",
200
+ "root",
201
+ "solver",
202
+ )
203
+
204
+ def __init__(self, solver: SimpleSolver, root: TypeVariable):
205
+ self.root: SketchNode = SketchNode(root)
206
+ self.graph = networkx.MultiDiGraph()
207
+ self.node_mapping: dict[TypeVariable | DerivedTypeVariable, SketchNodeBase] = {}
208
+ self.solver = solver
209
+
210
+ # add the root node
211
+ self.graph.add_node(self.root)
212
+ self.node_mapping[root] = self.root
213
+
214
+ def lookup(self, typevar: TypeVariable | DerivedTypeVariable) -> SketchNodeBase | None:
215
+ if typevar in self.node_mapping:
216
+ return self.node_mapping[typevar]
217
+ node: SketchNodeBase | None = None
218
+ if isinstance(typevar, DerivedTypeVariable):
219
+ t = SimpleSolver._to_typevar_or_typeconst(typevar.type_var)
220
+ assert isinstance(t, TypeVariable)
221
+ node = self.node_mapping[t]
222
+ for label in typevar.labels:
223
+ succs = []
224
+ for _, dst, data in self.graph.out_edges(node, data=True):
225
+ if "label" in data and data["label"] == label and dst not in succs:
226
+ succs.append(dst)
227
+ if len(succs) > 1:
228
+ _l.warning(
229
+ "Multiple successors found for node %s with label %s. Picking the first one.", node, label
230
+ )
231
+ succs = succs[:1]
232
+ if not succs:
233
+ return None
234
+ node = succs[0]
235
+ if isinstance(node, RecursiveRefNode):
236
+ node = self.lookup(node.target)
237
+ return node
238
+
239
+ def add_edge(self, src: SketchNodeBase, dst: SketchNodeBase, label) -> None:
240
+ # ensure the label does not already exist in existing edges
241
+ if self.graph.has_edge(src, dst):
242
+ for data in self.graph.get_edge_data(src, dst).values():
243
+ if "label" in data and data["label"] == label:
244
+ return
245
+ if isinstance(src, SketchNode) and src.typevar not in self.node_mapping:
246
+ self.node_mapping[src.typevar] = src
247
+ if isinstance(dst, SketchNode) and dst.typevar not in self.node_mapping:
248
+ self.node_mapping[dst.typevar] = dst
249
+ self.graph.add_edge(src, dst, label=label)
250
+
251
+ def add_constraint(self, constraint: TypeConstraint) -> None:
252
+ # sub <: super
253
+ if not isinstance(constraint, Subtype):
254
+ return
255
+ subtype, _ = self.flatten_typevar(constraint.sub_type)
256
+ supertype, try_maxsize = self.flatten_typevar(constraint.super_type)
257
+
258
+ if (
259
+ try_maxsize
260
+ and isinstance(subtype, TypeVariable)
261
+ and subtype in self.solver.stackvar_max_sizes
262
+ and isinstance(supertype, TypeConstant)
263
+ and not isinstance(supertype, BottomType)
264
+ ):
265
+ basetype = supertype
266
+ assert basetype.size is not None
267
+ max_size = self.solver.stackvar_max_sizes.get(subtype, None)
268
+ if max_size not in {0, None} and max_size // basetype.size > 0: # type: ignore
269
+ supertype = Array(element=basetype, count=max_size // basetype.size) # type: ignore
270
+
271
+ if SimpleSolver._typevar_inside_set(subtype, PRIMITIVE_TYPES) and not SimpleSolver._typevar_inside_set(
272
+ supertype, PRIMITIVE_TYPES
273
+ ):
274
+ assert isinstance(supertype, (TypeVariable, DerivedTypeVariable))
275
+ super_node = self.lookup(supertype)
276
+ assert super_node is None or isinstance(super_node, SketchNode)
277
+ if super_node is not None:
278
+ super_node.lower_bound = self.solver.join(super_node.lower_bound, subtype)
279
+ elif SimpleSolver._typevar_inside_set(supertype, PRIMITIVE_TYPES) and not SimpleSolver._typevar_inside_set(
280
+ subtype, PRIMITIVE_TYPES
281
+ ):
282
+ assert isinstance(subtype, (TypeVariable, DerivedTypeVariable))
283
+ sub_node = self.lookup(subtype)
284
+ assert sub_node is None or isinstance(sub_node, SketchNode)
285
+ # assert sub_node is not None
286
+ if sub_node is not None:
287
+ sub_node.upper_bound = self.solver.meet(sub_node.upper_bound, supertype)
288
+
289
+ @staticmethod
290
+ def flatten_typevar(
291
+ derived_typevar: TypeVariable | TypeConstant | DerivedTypeVariable,
292
+ ) -> tuple[DerivedTypeVariable | TypeVariable | TypeConstant, bool]:
293
+ # pylint:disable=too-many-boolean-expressions
294
+ if (
295
+ isinstance(derived_typevar, DerivedTypeVariable)
296
+ and isinstance(derived_typevar.type_var, Pointer)
297
+ and SimpleSolver._typevar_inside_set(derived_typevar.type_var.basetype, PRIMITIVE_TYPES)
298
+ and len(derived_typevar.labels) == 2
299
+ and isinstance(derived_typevar.labels[0], Load)
300
+ and isinstance(derived_typevar.labels[1], HasField)
301
+ and derived_typevar.labels[1].offset == 0
302
+ and derived_typevar.labels[1].bits == MAX_POINTSTO_BITS
303
+ ):
304
+ bt = derived_typevar.type_var.basetype
305
+ assert bt is not None
306
+ return bt, True
307
+ return derived_typevar, False
308
+
309
+
310
+ #
311
+ # Constraint graph
312
+ #
313
+
314
+
315
+ class ConstraintGraphTag(enum.Enum):
316
+ LEFT = 0
317
+ RIGHT = 1
318
+ UNKNOWN = 2
319
+
320
+
321
+ class FORGOTTEN(enum.Enum):
322
+ PRE_FORGOTTEN = 0
323
+ POST_FORGOTTEN = 1
324
+
325
+
326
+ class ConstraintGraphNode:
327
+ __slots__ = ("forgotten", "tag", "typevar", "variance")
328
+
329
+ def __init__(
330
+ self,
331
+ typevar: TypeVariable | DerivedTypeVariable,
332
+ variance: Variance,
333
+ tag: ConstraintGraphTag,
334
+ forgotten: FORGOTTEN,
335
+ ):
336
+ self.typevar = typevar
337
+ self.variance = variance
338
+ self.tag = tag
339
+ self.forgotten = forgotten
340
+
341
+ def __repr__(self):
342
+ variance_str = "CO" if self.variance == Variance.COVARIANT else "CONTRA"
343
+ if self.tag == ConstraintGraphTag.LEFT:
344
+ tag_str = "L"
345
+ elif self.tag == ConstraintGraphTag.RIGHT:
346
+ tag_str = "R"
347
+ else:
348
+ tag_str = "U"
349
+ forgotten_str = "PRE" if self.forgotten == FORGOTTEN.PRE_FORGOTTEN else "POST"
350
+ s = f"{self.typevar}#{variance_str}.{tag_str}.{forgotten_str}"
351
+ if ":" in s:
352
+ return '"' + s + '"'
353
+ return s
354
+
355
+ def __eq__(self, other):
356
+ if not isinstance(other, ConstraintGraphNode):
357
+ return False
358
+ return (
359
+ self.typevar == other.typevar
360
+ and self.variance == other.variance
361
+ and self.tag == other.tag
362
+ and self.forgotten == other.forgotten
363
+ )
364
+
365
+ def __hash__(self):
366
+ return hash((ConstraintGraphNode, self.typevar, self.variance, self.tag, self.forgotten))
367
+
368
+ def forget_last_label(self) -> tuple[ConstraintGraphNode, BaseLabel] | None:
369
+ if isinstance(self.typevar, DerivedTypeVariable) and self.typevar.labels:
370
+ last_label = self.typevar.labels[-1]
371
+ if len(self.typevar.labels) == 1:
372
+ prefix = self.typevar.type_var
373
+ else:
374
+ prefix = DerivedTypeVariable(self.typevar.type_var, None, labels=self.typevar.labels[:-1])
375
+ variance = Variance.COVARIANT if self.variance == last_label.variance else Variance.CONTRAVARIANT
376
+ if not isinstance(prefix, (TypeVariable, DerivedTypeVariable)):
377
+ # we may see incorrectly generated type constraints that attempt to load from an int:
378
+ # int64.load
379
+ # we don't want to entertain such constraints
380
+ return None
381
+ return (
382
+ ConstraintGraphNode(prefix, variance, self.tag, FORGOTTEN.PRE_FORGOTTEN),
383
+ self.typevar.labels[-1],
384
+ )
385
+ return None
386
+
387
+ def recall(self, label: BaseLabel) -> ConstraintGraphNode:
388
+ if isinstance(self.typevar, DerivedTypeVariable):
389
+ labels = (*self.typevar.labels, label)
390
+ typevar = self.typevar.type_var
391
+ elif isinstance(self.typevar, (TypeVariable, TypeConstant)):
392
+ labels = (label,)
393
+ typevar = self.typevar
394
+ else:
395
+ raise TypeError(f"Unsupported type {type(self.typevar)}")
396
+ variance = Variance.COVARIANT if self.variance == label.variance else Variance.CONTRAVARIANT
397
+ var = typevar if not labels else DerivedTypeVariable(typevar, None, labels=labels)
398
+ assert isinstance(var, (TypeVariable, DerivedTypeVariable))
399
+ return ConstraintGraphNode(var, variance, self.tag, FORGOTTEN.PRE_FORGOTTEN)
400
+
401
+ def inverse(self) -> ConstraintGraphNode:
402
+ if self.tag == ConstraintGraphTag.LEFT:
403
+ tag = ConstraintGraphTag.RIGHT
404
+ elif self.tag == ConstraintGraphTag.RIGHT:
405
+ tag = ConstraintGraphTag.LEFT
406
+ else:
407
+ tag = ConstraintGraphTag.UNKNOWN
408
+
409
+ variance = Variance.CONTRAVARIANT if self.variance == Variance.COVARIANT else Variance.COVARIANT
410
+
411
+ return ConstraintGraphNode(self.typevar, variance, tag, self.forgotten)
412
+
413
+ def inverse_wo_tag(self) -> ConstraintGraphNode:
414
+ """
415
+ Invert the variance only.
416
+ """
417
+ variance = Variance.CONTRAVARIANT if self.variance == Variance.COVARIANT else Variance.COVARIANT
418
+
419
+ return ConstraintGraphNode(self.typevar, variance, self.tag, self.forgotten)
420
+
421
+
422
+ #
423
+ # The solver
424
+ #
425
+
426
+
427
+ class SimpleSolver:
428
+ """
429
+ SimpleSolver is, by its name, a simple solver. Most of this solver is based on the (complex) simplification logic
430
+ that the retypd paper describes and the retypd re-implementation (https://github.com/GrammaTech/retypd) implements.
431
+ Additionally, we add some improvements to allow type propagation of known struct names, among a few other
432
+ improvements.
433
+ """
434
+
435
+ def __init__(
436
+ self,
437
+ bits: int,
438
+ constraints,
439
+ typevars,
440
+ constraint_set_degradation_threshold: int = 150,
441
+ stackvar_max_sizes: dict[TypeVariable, int] | None = None,
442
+ ):
443
+ if bits not in (32, 64):
444
+ raise ValueError(f"Pointer size {bits} is not supported. Expect 32 or 64.")
445
+
446
+ self.bits = bits
447
+ self._constraints: dict[TypeVariable, set[TypeConstraint]] = constraints
448
+ self._typevars: set[TypeVariable] = typevars
449
+ self.stackvar_max_sizes = stackvar_max_sizes if stackvar_max_sizes is not None else {}
450
+ self._constraint_set_degradation_threshold = constraint_set_degradation_threshold
451
+ self._base_lattice = BASE_LATTICES[bits]
452
+ self._base_lattice_inverted = networkx.DiGraph()
453
+ for src, dst in self._base_lattice.edges:
454
+ self._base_lattice_inverted.add_edge(dst, src)
455
+
456
+ # statistics
457
+ self.processed_constraints_count: int = 0
458
+ self.simplified_constraints_count: int = 0
459
+ self.eqclass_constraints_count: list[int] = []
460
+
461
+ #
462
+ # Solving state
463
+ #
464
+ self._equivalence = defaultdict(dict)
465
+ for typevar in list(self._constraints):
466
+ if self._constraints[typevar]:
467
+ self.processed_constraints_count += len(self._constraints[typevar])
468
+
469
+ self._constraints[typevar] |= self._eq_constraints_from_add(typevar)
470
+ self._constraints[typevar] |= self._discover_equivalence(self._constraints[typevar])
471
+ new_constraints, replacements = self._handle_equivalence(self._constraints[typevar])
472
+ self._equivalence |= replacements
473
+ self._constraints[typevar] = new_constraints
474
+ self._constraints[typevar] = self._filter_constraints(self._constraints[typevar])
475
+
476
+ self.simplified_constraints_count += len(self._constraints[typevar])
477
+
478
+ self.solution = {}
479
+ for tv, sol in self._equivalence.items():
480
+ if isinstance(tv, TypeVariable) and isinstance(sol, TypeConstant):
481
+ self.solution[tv] = sol
482
+
483
+ self._solution_cache = {}
484
+ self.solve()
485
+ for typevar in list(self._constraints):
486
+ self._convert_arrays(self._constraints[typevar])
487
+
488
+ def solve(self):
489
+ """
490
+ Steps:
491
+
492
+ For each type variable,
493
+ - Infer the shape in its sketch
494
+ - Build the constraint graph
495
+ - Collect all constraints
496
+ - Apply constraints to derive the lower and upper bounds
497
+ - Determine a solution for type variables with constraints
498
+ - Rewrite the constraint graph by replacing determined type variables with their solutions
499
+ - Solve repeatedly until all interesting type variables have solutions
500
+
501
+ By repeatedly solving until exhausting interesting type variables, we ensure the S-Trans rule is applied.
502
+ """
503
+
504
+ prem_typevars = set(self._constraints) | self._typevars
505
+ typevars = set()
506
+ for tv in prem_typevars:
507
+ if tv not in self._equivalence:
508
+ typevars.add(tv)
509
+ else:
510
+ repl = self._equivalence[tv]
511
+ if isinstance(repl, TypeVariable):
512
+ typevars.add(repl)
513
+
514
+ constraints = set()
515
+ for tv in typevars:
516
+ if tv in self._constraints:
517
+ constraints |= self._constraints[tv]
518
+
519
+ # collect typevars used in the constraint set
520
+ constrained_typevars = set()
521
+ for constraint in constraints:
522
+ if isinstance(constraint, Subtype):
523
+ for t in (constraint.sub_type, constraint.super_type):
524
+ if isinstance(t, DerivedTypeVariable):
525
+ if t.type_var in typevars:
526
+ constrained_typevars.add(t.type_var)
527
+ elif isinstance(t, TypeVariable) and t in typevars:
528
+ constrained_typevars.add(t)
529
+
530
+ _, sketches = self.infer_shapes(typevars, constraints)
531
+ constraintset2tvs = defaultdict(set)
532
+ tvs_seen = set()
533
+ for idx, tv in enumerate(constrained_typevars):
534
+ _l.debug("Collecting constraints for type variable %r (%d/%d)", tv, idx + 1, len(constrained_typevars))
535
+ if tv in tvs_seen:
536
+ continue
537
+ # build a sub constraint set for the type variable
538
+ constraint_subset, related_tvs = self._generate_constraint_subset(constraints, {tv})
539
+ # drop all type vars outside constrained_typevars
540
+ related_tvs = related_tvs.intersection(constrained_typevars)
541
+ tvs_seen |= related_tvs
542
+ frozen_constraint_subset = frozenset(constraint_subset)
543
+ constraintset2tvs[frozen_constraint_subset] = related_tvs
544
+
545
+ for idx, (constraint_subset, tvs) in enumerate(constraintset2tvs.items()):
546
+ _l.debug(
547
+ "Solving %d constraints for %d type variables %r (%d/%d)",
548
+ len(constraint_subset),
549
+ len(tvs),
550
+ tvs,
551
+ idx + 1,
552
+ len(constraintset2tvs),
553
+ )
554
+ self.eqclass_constraints_count.append(len(constraint_subset))
555
+
556
+ if len(constraint_subset) > self._constraint_set_degradation_threshold:
557
+ _l.debug(
558
+ "Constraint subset contains %d constraints, which is over the limit of %d. Enter degradation.",
559
+ len(constraint_subset),
560
+ self._constraint_set_degradation_threshold,
561
+ )
562
+ constraint_subset = self._degrade_constraint_set(constraint_subset)
563
+ _l.debug("Degraded constraint subset to %d constraints.", len(constraint_subset))
564
+
565
+ while constraint_subset:
566
+
567
+ _l.debug("Working with %d constraints.", len(constraint_subset))
568
+
569
+ # remove constraints that are a <: b where a only appears once; in this case, the solution fo a is
570
+ # entirely determined by the solution of b (which is the upper bound of a)
571
+ filtered_constraint_subset, ub_subtypes = self._filter_leaf_typevars(constraint_subset, tvs)
572
+ _l.debug(
573
+ "Filtered %d leaf typevars; %d constraints remain.",
574
+ len(ub_subtypes),
575
+ len(filtered_constraint_subset),
576
+ )
577
+
578
+ base_constraint_graph = self._generate_constraint_graph(
579
+ filtered_constraint_subset, tvs | PRIMITIVE_TYPES
580
+ )
581
+ primitive_constraints = self._generate_primitive_constraints(tvs, base_constraint_graph)
582
+ tvs_with_primitive_constraints = set()
583
+ for primitive_constraint in primitive_constraints:
584
+ tv = self._typevar_from_primitive_constraint(primitive_constraint)
585
+ tvs_with_primitive_constraints.add(tv)
586
+ assert tv is not None, f"Cannot find type variable in primitive constraint {primitive_constraint}"
587
+ sketches[tv].add_constraint(primitive_constraint)
588
+ solutions = {}
589
+ self.determine(sketches, tvs_with_primitive_constraints, solutions)
590
+ _l.debug("Determined solutions for %d type variable(s).", len(tvs_with_primitive_constraints))
591
+
592
+ leaf_solutions = 0
593
+ for tv_, ub_tv in ub_subtypes.items():
594
+ if ub_tv in solutions:
595
+ solutions[tv_] = solutions[ub_tv]
596
+ leaf_solutions += 1
597
+ elif isinstance(ub_tv, TypeConstant):
598
+ solutions[tv_] = ub_tv
599
+ leaf_solutions += 1
600
+ _l.debug("Determined solutions for %d leaf type variable(s).", leaf_solutions)
601
+
602
+ if not solutions:
603
+ break
604
+ self.solution |= solutions
605
+
606
+ tvs = {tv for tv in tvs if tv not in solutions}
607
+ if not tvs:
608
+ break
609
+ # rewrite existing constraints
610
+ new_constraint_subset = set()
611
+ for constraint in constraint_subset:
612
+ rewritten = self._rewrite_constraint(constraint, solutions)
613
+ new_constraint_subset.add(rewritten)
614
+ constraint_subset = self._filter_constraints(new_constraint_subset)
615
+
616
+ # set the solution for missing type vars to TOP
617
+ self.determine(sketches, set(sketches).difference(set(self.solution)), self.solution)
618
+
619
+ def infer_shapes(
620
+ self, typevars: set[TypeVariable], constraints: set[TypeConstraint]
621
+ ) -> tuple[dict, dict[TypeVariable, Sketch]]:
622
+ """
623
+ Computing sketches from constraint sets. Implements Algorithm E.1 in the retypd paper.
624
+ """
625
+
626
+ equivalence_classes, quotient_graph = self.compute_quotient_graph(constraints)
627
+
628
+ sketches: dict[TypeVariable, Sketch] = {}
629
+ for tv in typevars:
630
+ sketches[tv] = Sketch(self, tv)
631
+
632
+ for tv, sketch in sketches.items():
633
+ sketch_node = sketch.lookup(tv)
634
+ graph_node = equivalence_classes.get(tv, None)
635
+ # assert graph_node is not None
636
+ if graph_node is None:
637
+ continue
638
+ visited = {graph_node: sketch_node}
639
+ self._get_all_paths(quotient_graph, sketch, graph_node, visited)
640
+ return equivalence_classes, sketches
641
+
642
+ def compute_quotient_graph(self, constraints: set[TypeConstraint]):
643
+ """
644
+ Compute the quotient graph (the constraint graph modulo ~ in Algorithm E.1 in the retypd paper) with respect to
645
+ a given set of type constraints.
646
+ """
647
+
648
+ g = networkx.DiGraph()
649
+ # collect all derived type variables
650
+ typevars = self._typevars_from_constraints(constraints)
651
+ g.add_nodes_from(typevars)
652
+ # add paths for each derived type variable into the graph
653
+ for tv in typevars:
654
+ last_node = tv
655
+ prefix = tv
656
+ while isinstance(prefix, DerivedTypeVariable) and prefix.labels:
657
+ prefix = prefix.longest_prefix()
658
+ if prefix is None:
659
+ continue
660
+ g.add_edge(prefix, last_node, label=last_node.labels[-1])
661
+ last_node = prefix
662
+
663
+ # compute the constraint graph modulo ~
664
+ equivalence_classes = {node: node for node in g}
665
+
666
+ load = Load()
667
+ store = Store()
668
+ for node in g.nodes:
669
+ lbl_to_node = {}
670
+ for succ in g.successors(node):
671
+ lbl_to_node[succ.labels[-1]] = succ
672
+ if load in lbl_to_node and store in lbl_to_node:
673
+ self._unify(equivalence_classes, lbl_to_node[load], lbl_to_node[store], g)
674
+
675
+ for constraint in constraints:
676
+ if isinstance(constraint, Subtype):
677
+ if self._typevar_inside_set(constraint.super_type, PRIMITIVE_TYPES) or self._typevar_inside_set(
678
+ constraint.sub_type, PRIMITIVE_TYPES
679
+ ):
680
+ continue
681
+ self._unify(equivalence_classes, constraint.super_type, constraint.sub_type, g)
682
+
683
+ out_graph = networkx.MultiDiGraph() # there can be multiple edges between two nodes, each edge is associated
684
+ # with a different label
685
+ for src, dst, data in g.edges(data=True):
686
+ src_cls = equivalence_classes[src]
687
+ dst_cls = equivalence_classes[dst]
688
+ label = None if not data else data["label"]
689
+ if label is not None and out_graph.has_edge(src_cls, dst_cls):
690
+ # do not add the same edge twice
691
+ existing_labels = {
692
+ data_["label"]
693
+ for _, dst_cls_, data_ in out_graph.out_edges(src_cls, data=True)
694
+ if dst_cls_ == dst_cls and data
695
+ }
696
+ if label in existing_labels:
697
+ continue
698
+ out_graph.add_edge(src_cls, dst_cls, label=label)
699
+
700
+ return equivalence_classes, out_graph
701
+
702
+ def _generate_primitive_constraints(
703
+ self,
704
+ non_primitive_endpoints: set[TypeVariable | DerivedTypeVariable],
705
+ constraint_graph,
706
+ ) -> set[TypeConstraint]:
707
+ constraints_0 = self._solve_constraints_between(constraint_graph, non_primitive_endpoints, PRIMITIVE_TYPES)
708
+ constraints_1 = self._solve_constraints_between(constraint_graph, PRIMITIVE_TYPES, non_primitive_endpoints)
709
+ return constraints_0 | constraints_1
710
+
711
+ @staticmethod
712
+ def _typevars_from_constraints(constraints: set[TypeConstraint]) -> set[TypeVariable | DerivedTypeVariable]:
713
+ """
714
+ Collect derived type variables from a set of constraints.
715
+ """
716
+
717
+ typevars: set[TypeVariable | DerivedTypeVariable] = set()
718
+ for constraint in constraints:
719
+ if isinstance(constraint, Subtype):
720
+ typevars.add(constraint.sub_type)
721
+ typevars.add(constraint.super_type)
722
+ # TODO: Other types of constraints?
723
+ return typevars
724
+
725
+ @staticmethod
726
+ def _typevar_from_primitive_constraint(constraint: TypeConstraint) -> TypeVariable | None:
727
+ if isinstance(constraint, Subtype):
728
+ if (
729
+ isinstance(constraint.sub_type, DerivedTypeVariable)
730
+ and type(constraint.sub_type.type_var) is TypeVariable
731
+ ):
732
+ return constraint.sub_type.type_var
733
+ if type(constraint.sub_type) is TypeVariable:
734
+ return constraint.sub_type
735
+ if (
736
+ isinstance(constraint.super_type, DerivedTypeVariable)
737
+ and type(constraint.super_type.type_var) is TypeVariable
738
+ ):
739
+ return constraint.super_type.type_var
740
+ if type(constraint.super_type) is TypeVariable:
741
+ return constraint.super_type
742
+ return None
743
+
744
+ @staticmethod
745
+ def _get_all_paths(
746
+ graph: networkx.DiGraph[TypeVariable | DerivedTypeVariable],
747
+ sketch: Sketch,
748
+ node: DerivedTypeVariable,
749
+ visited: dict[TypeVariable | DerivedTypeVariable, SketchNode],
750
+ ):
751
+ if node not in graph:
752
+ return
753
+ curr_node = visited[node]
754
+ for _, succ, data in sorted(graph.out_edges(node, data=True), key=lambda x: str(x[1])):
755
+ label = data["label"]
756
+ if succ not in visited:
757
+ if isinstance(curr_node.typevar, DerivedTypeVariable):
758
+ base_typevar = curr_node.typevar.type_var
759
+ labels = curr_node.typevar.labels
760
+ elif isinstance(curr_node.typevar, TypeVariable):
761
+ base_typevar = curr_node.typevar
762
+ labels = ()
763
+ else:
764
+ raise TypeError("Unexpected")
765
+ labels += (label,)
766
+ succ_derived_typevar = new_dtv(
767
+ base_typevar,
768
+ labels=labels,
769
+ )
770
+ succ_node = SketchNode(succ_derived_typevar)
771
+ sketch.add_edge(curr_node, succ_node, label)
772
+ visited[succ] = succ_node
773
+ SimpleSolver._get_all_paths(graph, sketch, succ, visited)
774
+ del visited[succ]
775
+ else:
776
+ # a cycle exists
777
+ ref_node = RecursiveRefNode(visited[succ].typevar)
778
+ sketch.add_edge(curr_node, ref_node, label)
779
+
780
+ @staticmethod
781
+ def _unify(
782
+ equivalence_classes: dict, cls0: DerivedTypeVariable, cls1: DerivedTypeVariable, graph: networkx.DiGraph
783
+ ) -> None:
784
+ # first convert cls0 and cls1 to their equivalence classes
785
+ cls0 = equivalence_classes[cls0]
786
+ cls1 = equivalence_classes[cls1]
787
+
788
+ # unify if needed
789
+ if cls0 != cls1:
790
+ # MakeEquiv
791
+ existing_elements = {key for key, item in equivalence_classes.items() if item in {cls0, cls1}}
792
+ rep_cls = cls0
793
+ for elem in existing_elements:
794
+ equivalence_classes[elem] = rep_cls
795
+ # the logic below refers to the retypd reference implementation. it is different from Algorithm E.1
796
+ # note that graph is used read-only in this method, so we do not need to make copy of edges
797
+ for _, dst0, data0 in graph.out_edges(cls0, data=True):
798
+ if "label" in data0 and data0["label"] is not None:
799
+ for _, dst1, data1 in graph.out_edges(cls1, data=True):
800
+ if data0["label"] == data1["label"] or (
801
+ isinstance(data0["label"], Load) and isinstance(data1["label"], Store)
802
+ ):
803
+ SimpleSolver._unify(
804
+ equivalence_classes, equivalence_classes[dst0], equivalence_classes[dst1], graph
805
+ )
806
+
807
+ def _eq_constraints_from_add(self, typevar: TypeVariable):
808
+ """
809
+ Handle Add constraints.
810
+ """
811
+ new_constraints = set()
812
+ for constraint in self._constraints[typevar]:
813
+ if isinstance(constraint, Add):
814
+ if (
815
+ isinstance(constraint.type_0, TypeVariable)
816
+ and not isinstance(constraint.type_0, DerivedTypeVariable)
817
+ and isinstance(constraint.type_r, TypeVariable)
818
+ and not isinstance(constraint.type_r, DerivedTypeVariable)
819
+ ):
820
+ new_constraints.add(Equivalence(constraint.type_0, constraint.type_r))
821
+ if (
822
+ isinstance(constraint.type_1, TypeVariable)
823
+ and not isinstance(constraint.type_1, DerivedTypeVariable)
824
+ and isinstance(constraint.type_r, TypeVariable)
825
+ and not isinstance(constraint.type_r, DerivedTypeVariable)
826
+ ):
827
+ new_constraints.add(Equivalence(constraint.type_1, constraint.type_r))
828
+ return new_constraints
829
+
830
+ @staticmethod
831
+ def _discover_equivalence(constraints: set[TypeConstraint]) -> set[Equivalence]:
832
+ """
833
+ a <:b && b <: a ==> a == b
834
+ """
835
+
836
+ new_eq_constraints: set[Equivalence] = set()
837
+ subtypes = defaultdict(set)
838
+ for constraint in constraints:
839
+ if isinstance(constraint, Subtype):
840
+ sub_type = constraint.sub_type
841
+ super_type = constraint.super_type
842
+ subtypes[sub_type].add(super_type)
843
+
844
+ # check everything
845
+ seen = set()
846
+ for tv, tv_supers in subtypes.items():
847
+ for tv_super in tv_supers:
848
+ if tv_super in subtypes and tv in subtypes[tv_super]: # noqa: SIM102
849
+ # we have a pair of subtypes that are equivalent
850
+ if (tv, tv_super) not in seen and (tv_super, tv) not in seen:
851
+ new_eq_constraints.add(Equivalence(tv, tv_super))
852
+ seen.add((tv, tv_super))
853
+
854
+ _l.debug(
855
+ "Discovered %d equivalence constraints from %d constraints.", len(new_eq_constraints), len(constraints)
856
+ )
857
+ return new_eq_constraints
858
+
859
+ @staticmethod
860
+ def _handle_equivalence(
861
+ constraint_set: set[TypeConstraint],
862
+ ) -> tuple[set[TypeConstraint], dict[TypeVariable, TypeVariable | TypeConstant]]:
863
+ graph = networkx.Graph()
864
+
865
+ replacements: dict[TypeVariable, TypeVariable | TypeConstant] = {}
866
+
867
+ # collect equivalence relations
868
+ for constraint in constraint_set:
869
+ if isinstance(constraint, Equivalence):
870
+ # | type_a == type_b
871
+ # we apply unification and removes one of them
872
+ ta, tb = constraint.type_a, constraint.type_b
873
+ if isinstance(ta, TypeConstant) and isinstance(tb, TypeVariable):
874
+ # replace tb with ta
875
+ replacements[tb] = ta
876
+ elif isinstance(ta, TypeVariable) and isinstance(tb, TypeConstant):
877
+ # replace ta with tb
878
+ replacements[ta] = tb
879
+ else:
880
+ # they are both type variables. we will determine a representative later
881
+ graph.add_edge(ta, tb)
882
+
883
+ for components in networkx.connected_components(graph):
884
+ components_lst = sorted(components, key=lambda x: str(x)) # pylint:disable=unnecessary-lambda
885
+ representative = components_lst[0]
886
+ for tv in components_lst[1:]:
887
+ replacements[tv] = representative
888
+
889
+ constraints = SimpleSolver._rewrite_constraints_with_replacements(constraint_set, replacements)
890
+
891
+ # import pprint
892
+ # print("Replacements")
893
+ # pprint.pprint(replacements)
894
+ # print("Constraints (after replacement)")
895
+ # pprint.pprint(constraints)
896
+
897
+ return constraints, replacements
898
+
899
+ @staticmethod
900
+ def _rewrite_constraints_with_replacements(
901
+ constraints: set[TypeConstraint], replacements: dict[TypeVariable, TypeVariable]
902
+ ) -> set[TypeConstraint]:
903
+ # replace constraints according to a dictionary of type variable replacements
904
+ replaced_constraints = set()
905
+ for constraint in constraints:
906
+ if isinstance(constraint, Existence):
907
+ replaced, new_constraint = constraint.replace(replacements)
908
+
909
+ if replaced:
910
+ replaced_constraints.add(new_constraint)
911
+ else:
912
+ replaced_constraints.add(constraint)
913
+
914
+ elif isinstance(constraint, Subtype):
915
+ # subtype <: supertype
916
+ # replace type variables
917
+ replaced, new_constraint = constraint.replace(replacements)
918
+
919
+ if replaced:
920
+ replaced_constraints.add(new_constraint)
921
+ else:
922
+ replaced_constraints.add(constraint)
923
+ return replaced_constraints
924
+
925
+ @staticmethod
926
+ def _filter_constraints(constraints: set[TypeConstraint]) -> set[TypeConstraint]:
927
+ """
928
+ Filter out constraints that we don't yet support.
929
+ """
930
+
931
+ filtered_constraints = set()
932
+ for constraint in constraints:
933
+ dropped = False
934
+ if isinstance(constraint, Subtype) and (
935
+ (isinstance(constraint.sub_type, TypeConstant) and isinstance(constraint.super_type, TypeConstant))
936
+ or (
937
+ isinstance(constraint.sub_type, DerivedTypeVariable)
938
+ and isinstance(constraint.sub_type.labels[-1], ConvertTo)
939
+ )
940
+ or (
941
+ isinstance(constraint.sub_type, TypeVariable)
942
+ and isinstance(constraint.super_type, TypeVariable)
943
+ and constraint.sub_type == constraint.super_type
944
+ )
945
+ ):
946
+ dropped = True
947
+
948
+ if not dropped:
949
+ filtered_constraints.add(constraint)
950
+
951
+ return filtered_constraints
952
+
953
+ @staticmethod
954
+ def _filter_leaf_typevars(
955
+ constraints: set[TypeConstraint], tvs_to_solve: set[TypeVariable]
956
+ ) -> tuple[set[TypeConstraint], dict[TypeVariable, TypeVariable]]:
957
+ """
958
+ Filter out leaf type variables that only appear once in the constraints. These type variables are not
959
+ interesting and can be removed from the constraints.
960
+ """
961
+
962
+ sub_typevars = defaultdict(set)
963
+ tv_to_dtvs: dict[TypeVariable, set[TypeVariable | DerivedTypeVariable]] = defaultdict(set)
964
+ for constraint in constraints:
965
+ if isinstance(constraint, Subtype):
966
+ if isinstance(constraint.sub_type, TypeVariable):
967
+ sub_typevars[constraint.sub_type].add(constraint.super_type)
968
+ for tv in [constraint.sub_type, constraint.super_type]:
969
+ if isinstance(tv, DerivedTypeVariable):
970
+ tv_to_dtvs[tv.type_var].add(constraint.sub_type)
971
+ elif isinstance(tv, TypeVariable):
972
+ tv_to_dtvs[tv].add(constraint.sub_type)
973
+
974
+ ub_subtypes: dict[TypeVariable, TypeVariable] = {}
975
+ for tv, dtvs in tv_to_dtvs.items():
976
+ if len(dtvs) == 1 and tv in sub_typevars and len(sub_typevars[tv]) == 1:
977
+ ub = next(iter(sub_typevars[tv]))
978
+ if ub in tvs_to_solve:
979
+ ub_subtypes[tv] = ub
980
+
981
+ filtered_constraints = set()
982
+ for constraint in constraints:
983
+ if isinstance(constraint, Subtype) and constraint.sub_type in ub_subtypes:
984
+ continue
985
+ filtered_constraints.add(constraint)
986
+
987
+ return filtered_constraints, ub_subtypes
988
+
989
+ def _degrade_constraint_set(self, constraints: set[TypeConstraint]) -> set[TypeConstraint]:
990
+ """
991
+ Degrade the constraint set to a smaller set of constraints to speed up the DFA generation process.
992
+ """
993
+
994
+ tv_with_ls = defaultdict(set) # tv_with_ls are type variables with Loads or Stores
995
+ graph = networkx.Graph()
996
+
997
+ for constraint in constraints:
998
+ if isinstance(constraint, Subtype):
999
+ if isinstance(constraint.sub_type, DerivedTypeVariable) and isinstance(
1000
+ constraint.sub_type.labels[0], (Load, Store)
1001
+ ):
1002
+ tv_with_ls[constraint.sub_type.type_var].add(constraint.sub_type)
1003
+ if type(constraint.sub_type) is TypeVariable and type(constraint.super_type) is TypeVariable:
1004
+ graph.add_edge(constraint.sub_type, constraint.super_type)
1005
+
1006
+ tv_to_degrade = set()
1007
+ for tv, dtvs in tv_with_ls.items():
1008
+ if len(dtvs) > 5:
1009
+ # degrade all subtype relationships involving this type variable to equivalence
1010
+ tv_to_degrade.add(tv)
1011
+
1012
+ replacements = {}
1013
+ for components in networkx.connected_components(graph):
1014
+ if len(components) == 1:
1015
+ continue
1016
+ if any(tv in tv_to_degrade for tv in components):
1017
+ components_lst = sorted(components, key=str)
1018
+ representative = components_lst[0]
1019
+ for tv in components_lst[1:]:
1020
+ replacements[tv] = representative
1021
+
1022
+ degraded_constraints = self._rewrite_constraints_with_replacements(constraints, replacements)
1023
+
1024
+ # discover more equivalence relations
1025
+ eq_constraints = self._discover_equivalence(degraded_constraints)
1026
+ _l.debug("Discovered %d equivalence constraints from degraded constraints.", len(eq_constraints))
1027
+ if eq_constraints:
1028
+ degraded_constraints, eq_replacements = self._handle_equivalence(degraded_constraints | eq_constraints)
1029
+ self._equivalence |= eq_replacements
1030
+
1031
+ # filter them
1032
+ degraded_constraints = self._filter_constraints(degraded_constraints)
1033
+
1034
+ self._equivalence |= replacements
1035
+ return degraded_constraints
1036
+
1037
+ def _convert_arrays(self, constraints):
1038
+ for constraint in constraints:
1039
+ if not isinstance(constraint, Existence):
1040
+ continue
1041
+ inner = constraint.type_
1042
+ if (
1043
+ isinstance(inner, DerivedTypeVariable)
1044
+ and isinstance(inner.one_label(), IsArray)
1045
+ and inner.type_var in self.solution
1046
+ ):
1047
+ curr_type = self.solution[inner.type_var]
1048
+ if (
1049
+ isinstance(curr_type, Pointer)
1050
+ and isinstance(curr_type.basetype, Struct)
1051
+ and 0 in curr_type.basetype.fields
1052
+ ):
1053
+ # replace all fields with the first field
1054
+ first_field = curr_type.basetype.fields[0]
1055
+ for offset in curr_type.basetype.fields:
1056
+ curr_type.basetype.fields[offset] = first_field
1057
+
1058
+ #
1059
+ # Constraint graph
1060
+ #
1061
+
1062
+ @staticmethod
1063
+ def _generate_constraint_subset(
1064
+ constraints: set[TypeConstraint], typevars: set[TypeVariable]
1065
+ ) -> tuple[set[TypeConstraint], set[TypeVariable]]:
1066
+ subset = set()
1067
+ related_typevars = set(typevars)
1068
+ while True:
1069
+ new = set()
1070
+ for constraint in constraints:
1071
+ if constraint in subset:
1072
+ continue
1073
+ if isinstance(constraint, Subtype):
1074
+ if isinstance(constraint.sub_type, DerivedTypeVariable):
1075
+ subt = constraint.sub_type.type_var
1076
+ elif isinstance(constraint.sub_type, TypeVariable):
1077
+ subt = constraint.sub_type
1078
+ else:
1079
+ subt = None
1080
+ if isinstance(constraint.super_type, DerivedTypeVariable):
1081
+ supert = constraint.super_type.type_var
1082
+ elif isinstance(constraint.super_type, TypeVariable):
1083
+ supert = constraint.super_type
1084
+ else:
1085
+ supert = None
1086
+ if subt in related_typevars or supert in related_typevars:
1087
+ new.add(constraint)
1088
+ if subt is not None:
1089
+ related_typevars.add(subt)
1090
+ if supert is not None:
1091
+ related_typevars.add(supert)
1092
+ if not new:
1093
+ break
1094
+ subset |= new
1095
+ return subset, related_typevars
1096
+
1097
+ def _generate_constraint_graph(
1098
+ self, constraints: set[TypeConstraint], interesting_variables: set[DerivedTypeVariable]
1099
+ ) -> networkx.DiGraph:
1100
+ """
1101
+ A constraint graph is the same as the finite state transducer that is presented in Appendix D in the retypd
1102
+ paper.
1103
+ """
1104
+
1105
+ graph = networkx.DiGraph()
1106
+ for constraint in constraints:
1107
+ if isinstance(constraint, Subtype):
1108
+ self._constraint_graph_add_edges(
1109
+ graph, constraint.sub_type, constraint.super_type, interesting_variables
1110
+ )
1111
+ self._constraint_graph_saturate(graph)
1112
+ self._constraint_graph_remove_self_loops(graph)
1113
+ self._constraint_graph_recall_forget_split(graph)
1114
+ return graph
1115
+
1116
+ @staticmethod
1117
+ def _constraint_graph_add_recall_edges(graph: networkx.DiGraph, node: ConstraintGraphNode) -> None:
1118
+ while True:
1119
+ r = node.forget_last_label()
1120
+ if r is None:
1121
+ break
1122
+ prefix, last_label = r
1123
+ graph.add_edge(prefix, node, label=(last_label, "recall"))
1124
+ node = prefix
1125
+
1126
+ @staticmethod
1127
+ def _constraint_graph_add_forget_edges(graph: networkx.DiGraph, node: ConstraintGraphNode) -> None:
1128
+ while True:
1129
+ r = node.forget_last_label()
1130
+ if r is None:
1131
+ break
1132
+ prefix, last_label = r
1133
+ graph.add_edge(node, prefix, label=(last_label, "forget"))
1134
+ node = prefix
1135
+
1136
+ def _constraint_graph_add_edges(
1137
+ self,
1138
+ graph: networkx.DiGraph,
1139
+ subtype: TypeVariable | DerivedTypeVariable,
1140
+ supertype: TypeVariable | DerivedTypeVariable,
1141
+ interesting_variables: set[DerivedTypeVariable],
1142
+ ):
1143
+ # left and right tags
1144
+ if self._typevar_inside_set(self._to_typevar_or_typeconst(subtype), interesting_variables):
1145
+ left_tag = ConstraintGraphTag.LEFT
1146
+ else:
1147
+ left_tag = ConstraintGraphTag.UNKNOWN
1148
+ if self._typevar_inside_set(self._to_typevar_or_typeconst(supertype), interesting_variables):
1149
+ right_tag = ConstraintGraphTag.RIGHT
1150
+ else:
1151
+ right_tag = ConstraintGraphTag.UNKNOWN
1152
+ # nodes
1153
+ forward_src = ConstraintGraphNode(subtype, Variance.COVARIANT, left_tag, FORGOTTEN.PRE_FORGOTTEN)
1154
+ forward_dst = ConstraintGraphNode(supertype, Variance.COVARIANT, right_tag, FORGOTTEN.PRE_FORGOTTEN)
1155
+ graph.add_edge(forward_src, forward_dst)
1156
+ # add recall edges and forget edges
1157
+ self._constraint_graph_add_recall_edges(graph, forward_src)
1158
+ self._constraint_graph_add_forget_edges(graph, forward_dst)
1159
+
1160
+ # backward edges
1161
+ backward_src = forward_dst.inverse()
1162
+ backward_dst = forward_src.inverse()
1163
+ graph.add_edge(backward_src, backward_dst)
1164
+ self._constraint_graph_add_recall_edges(graph, backward_src)
1165
+ self._constraint_graph_add_forget_edges(graph, backward_dst)
1166
+
1167
+ @staticmethod
1168
+ def _constraint_graph_saturate(graph: networkx.DiGraph) -> None:
1169
+ """
1170
+ The saturation algorithm D.2 as described in Appendix of the retypd paper.
1171
+ """
1172
+ R: defaultdict[ConstraintGraphNode, set[tuple[BaseLabel, ConstraintGraphNode]]] = defaultdict(set)
1173
+
1174
+ # initialize the reaching-push sets R(x)
1175
+ for x, y, data in graph.edges(data=True):
1176
+ if "label" in data and data.get("label")[1] == "forget":
1177
+ d = data["label"][0], x
1178
+ R[y].add(d)
1179
+
1180
+ # repeat ... until fixed point
1181
+ changed = True
1182
+ while changed:
1183
+ changed = False
1184
+ for x, y, data in graph.edges(data=True):
1185
+ if "label" not in data:
1186
+ if R[y].issuperset(R[x]):
1187
+ continue
1188
+ changed = True
1189
+ R[y] |= R[x]
1190
+ for x, y, data in graph.edges(data=True):
1191
+ lbl = data.get("label")
1192
+ if lbl and lbl[1] == "recall":
1193
+ for _label, z in R[x]:
1194
+ if not graph.has_edge(z, y):
1195
+ changed = True
1196
+ graph.add_edge(z, y)
1197
+ v_contravariant = []
1198
+ for node in graph.nodes:
1199
+ node: ConstraintGraphNode
1200
+ if node.variance == Variance.CONTRAVARIANT:
1201
+ v_contravariant.append(node)
1202
+ # lazily apply saturation rules corresponding to S-Pointer
1203
+ for x in v_contravariant:
1204
+ for z_label, z in R[x]:
1205
+ label = None
1206
+ if isinstance(z_label, Store):
1207
+ label = Load()
1208
+ elif isinstance(z_label, Load):
1209
+ label = Store()
1210
+ if label is not None:
1211
+ x_inverse = x.inverse_wo_tag()
1212
+ d = label, z
1213
+ if d not in R[x_inverse]:
1214
+ changed = True
1215
+ R[x_inverse].add(d)
1216
+
1217
+ @staticmethod
1218
+ def _constraint_graph_remove_self_loops(graph: networkx.DiGraph):
1219
+ for node in list(graph.nodes):
1220
+ if graph.has_edge(node, node):
1221
+ graph.remove_edge(node, node)
1222
+
1223
+ @staticmethod
1224
+ def _constraint_graph_recall_forget_split(graph: networkx.DiGraph):
1225
+ """
1226
+ Ensure that recall edges are not reachable after traversing a forget node.
1227
+ """
1228
+ for src, dst, data in list(graph.edges(data=True)):
1229
+ src: ConstraintGraphNode
1230
+ dst: ConstraintGraphNode
1231
+ if "label" in data and data["label"][1] == "recall":
1232
+ continue
1233
+ forget_src = ConstraintGraphNode(src.typevar, src.variance, src.tag, FORGOTTEN.POST_FORGOTTEN)
1234
+ forget_dst = ConstraintGraphNode(dst.typevar, dst.variance, dst.tag, FORGOTTEN.POST_FORGOTTEN)
1235
+ if "label" in data and data["label"][1] == "forget":
1236
+ graph.remove_edge(src, dst)
1237
+ graph.add_edge(src, forget_dst, **data)
1238
+ graph.add_edge(forget_src, forget_dst, **data)
1239
+
1240
+ @staticmethod
1241
+ def _to_typevar_or_typeconst(obj: TypeVariable | DerivedTypeVariable | TypeConstant) -> TypeVariable | TypeConstant:
1242
+ if isinstance(obj, DerivedTypeVariable):
1243
+ return SimpleSolver._to_typevar_or_typeconst(obj.type_var)
1244
+ if isinstance(obj, (TypeVariable, TypeConstant)):
1245
+ return obj
1246
+ raise TypeError(f"Unsupported type {type(obj)}")
1247
+
1248
+ #
1249
+ # Graph solver
1250
+ #
1251
+
1252
+ @staticmethod
1253
+ def _typevar_inside_set(typevar, typevar_set: set[TypeConstant | TypeVariable | DerivedTypeVariable]) -> bool:
1254
+ if typevar in typevar_set:
1255
+ return True
1256
+ if isinstance(typevar, Struct) and Struct_ in typevar_set:
1257
+ return True
1258
+ if isinstance(typevar, Array) and Array_ in typevar_set:
1259
+ return SimpleSolver._typevar_inside_set(typevar.element, typevar_set)
1260
+ if isinstance(typevar, Pointer) and (Pointer32_ in typevar_set or Pointer64_ in typevar_set):
1261
+ return SimpleSolver._typevar_inside_set(typevar.basetype, typevar_set)
1262
+ return False
1263
+
1264
+ def _solve_constraints_between(
1265
+ self,
1266
+ graph: networkx.DiGraph,
1267
+ starts: set[TypeConstant | TypeVariable | DerivedTypeVariable],
1268
+ ends: set[TypeConstant | TypeVariable | DerivedTypeVariable],
1269
+ ) -> set[TypeConstraint]:
1270
+ start_nodes = set()
1271
+ end_nodes = set()
1272
+ for node in graph.nodes:
1273
+ node: ConstraintGraphNode
1274
+ if (
1275
+ self._typevar_inside_set(self._to_typevar_or_typeconst(node.typevar), starts)
1276
+ and node.tag == ConstraintGraphTag.LEFT
1277
+ ):
1278
+ start_nodes.add(node)
1279
+ if (
1280
+ self._typevar_inside_set(self._to_typevar_or_typeconst(node.typevar), ends)
1281
+ and node.tag == ConstraintGraphTag.RIGHT
1282
+ ):
1283
+ end_nodes.add(node)
1284
+
1285
+ if not start_nodes or not end_nodes:
1286
+ return set()
1287
+
1288
+ dfa_solver = DFAConstraintSolver()
1289
+ try:
1290
+ return dfa_solver.generate_constraints_between(graph, start_nodes, end_nodes)
1291
+ except EmptyEpsilonNFAError:
1292
+ return set()
1293
+
1294
+ #
1295
+ # Type lattice
1296
+ #
1297
+
1298
+ def join(self, t1: TypeConstant | TypeVariable, t2: TypeConstant | TypeVariable) -> TypeConstant:
1299
+ abstract_t1 = self.abstract(t1)
1300
+ abstract_t2 = self.abstract(t2)
1301
+ if abstract_t1 in self._base_lattice and abstract_t2 in self._base_lattice:
1302
+ ancestor = networkx.lowest_common_ancestor(self._base_lattice, abstract_t1, abstract_t2)
1303
+
1304
+ if (
1305
+ isinstance(ancestor, Pointer)
1306
+ and isinstance(abstract_t1, Pointer)
1307
+ and isinstance(abstract_t2, Pointer)
1308
+ and isinstance(t1, Pointer)
1309
+ and isinstance(t2, Pointer)
1310
+ ):
1311
+ return ancestor.__class__(self.join(t1.basetype, t2.basetype))
1312
+
1313
+ if ancestor == abstract_t1:
1314
+ return t1
1315
+ if ancestor == abstract_t2:
1316
+ return t2
1317
+ return ancestor
1318
+ if t1 == Bottom_:
1319
+ return t2
1320
+ if t2 == Bottom_:
1321
+ return t1
1322
+ return Bottom_
1323
+
1324
+ def meet(self, t1: TypeConstant | TypeVariable, t2: TypeConstant | TypeVariable) -> TypeConstant:
1325
+ abstract_t1 = self.abstract(t1)
1326
+ abstract_t2 = self.abstract(t2)
1327
+ if abstract_t1 in self._base_lattice_inverted and abstract_t2 in self._base_lattice_inverted:
1328
+ ancestor = networkx.lowest_common_ancestor(self._base_lattice_inverted, abstract_t1, abstract_t2)
1329
+
1330
+ if (
1331
+ isinstance(ancestor, Pointer)
1332
+ and isinstance(abstract_t1, Pointer)
1333
+ and isinstance(abstract_t2, Pointer)
1334
+ and isinstance(t1, Pointer)
1335
+ and isinstance(t2, Pointer)
1336
+ ):
1337
+ return ancestor.__class__(self.meet(t1.basetype, t2.basetype))
1338
+
1339
+ if ancestor == abstract_t1:
1340
+ return t1
1341
+ if ancestor == abstract_t2:
1342
+ return t2
1343
+ return ancestor
1344
+ if t1 == Top_:
1345
+ return t2
1346
+ if t2 == Top_:
1347
+ return t1
1348
+ return Top_
1349
+
1350
+ @staticmethod
1351
+ def abstract(t: TypeConstant | TypeVariable) -> TypeConstant | TypeVariable:
1352
+ if isinstance(t, Pointer32):
1353
+ return Pointer32()
1354
+ if isinstance(t, Pointer64):
1355
+ return Pointer64()
1356
+ return t
1357
+
1358
+ @staticmethod
1359
+ def _rewrite_constraint(constraint: TypeConstraint, solutions: dict) -> TypeConstraint:
1360
+ if isinstance(constraint, Subtype):
1361
+ replaced = False
1362
+ if isinstance(constraint.sub_type, TypeVariable) and constraint.sub_type in solutions:
1363
+ sub_type = solutions[constraint.sub_type]
1364
+ replaced = True
1365
+ else:
1366
+ sub_type = constraint.sub_type
1367
+ if isinstance(constraint.super_type, TypeVariable) and constraint.super_type in solutions:
1368
+ super_type = solutions[constraint.super_type]
1369
+ replaced = True
1370
+ else:
1371
+ super_type = constraint.super_type
1372
+ return Subtype(sub_type, super_type) if replaced else constraint
1373
+ return constraint
1374
+
1375
+ def determine(
1376
+ self,
1377
+ sketches,
1378
+ tvs,
1379
+ solution: dict,
1380
+ nodes: set[SketchNode] | None = None,
1381
+ ) -> None:
1382
+ """
1383
+ Determine C-like types from sketches.
1384
+
1385
+ :param sketches: A dictionary storing sketches for each type variable.
1386
+ :param solution: The dictionary storing C-like types for each type variable. Output.
1387
+ :param nodes: Optional. Nodes that should be considered in the sketch.
1388
+ :return: None
1389
+ """
1390
+
1391
+ for typevar in tvs:
1392
+ self._determine(typevar, sketches[typevar], solution, nodes=nodes)
1393
+
1394
+ for v, eq in self._equivalence.items():
1395
+ if v not in solution and eq in solution:
1396
+ solution[v] = solution[eq]
1397
+
1398
+ def _determine(self, the_typevar, sketch, solution: dict, nodes: set[SketchNode] | None = None):
1399
+ """
1400
+ Return the solution from sketches
1401
+ """
1402
+
1403
+ if not nodes:
1404
+ # TODO: resolve references
1405
+ node = sketch.lookup(the_typevar)
1406
+ assert node is not None
1407
+ nodes = {node}
1408
+
1409
+ # consult the cache
1410
+ cached_results = set()
1411
+ for node in nodes:
1412
+ if node.typevar in self._solution_cache:
1413
+ cached_results.add(self._solution_cache[node.typevar])
1414
+ if len(cached_results) == 1:
1415
+ return next(iter(cached_results))
1416
+ if len(cached_results) > 1:
1417
+ # we get nodes for multiple type variables?
1418
+ raise RuntimeError("Getting nodes for multiple type variables. Unexpected.")
1419
+
1420
+ # collect all successors and the paths (labels) of this type variable
1421
+ path_and_successors = []
1422
+ last_labels = []
1423
+ for node in nodes:
1424
+ path_and_successors += self._collect_sketch_paths(node, sketch)
1425
+ for labels, _ in path_and_successors:
1426
+ if labels:
1427
+ last_labels.append(labels[-1])
1428
+
1429
+ # now, what is this variable?
1430
+ result = None
1431
+
1432
+ if last_labels and all(isinstance(label, (FuncIn, FuncOut)) for label in last_labels):
1433
+ # create a dummy result and dump it to the cache
1434
+ func_type = Function([], [])
1435
+ result = self._pointer_class()(basetype=func_type)
1436
+ for node in nodes:
1437
+ self._solution_cache[node.typevar] = result
1438
+
1439
+ # this is a function variable
1440
+ func_inputs = defaultdict(set)
1441
+ func_outputs = defaultdict(set)
1442
+
1443
+ for labels, succ in path_and_successors:
1444
+ last_label = labels[-1] if labels else None
1445
+
1446
+ if isinstance(last_label, FuncIn):
1447
+ func_inputs[last_label.loc].add(succ)
1448
+ elif isinstance(last_label, FuncOut):
1449
+ func_outputs[last_label.loc].add(succ)
1450
+ else:
1451
+ raise RuntimeError("Unreachable")
1452
+
1453
+ input_args = []
1454
+ output_values = []
1455
+ for vals, out in [(func_inputs, input_args), (func_outputs, output_values)]:
1456
+ for idx in range(max(vals) + 1):
1457
+ if idx in vals:
1458
+ sol = self._determine(the_typevar, sketch, solution, nodes=vals[idx])
1459
+ out.append(sol)
1460
+ else:
1461
+ out.append(None)
1462
+
1463
+ # back patch
1464
+ func_type.params = input_args
1465
+ func_type.outputs = output_values
1466
+
1467
+ for node in nodes:
1468
+ solution[node.typevar] = result
1469
+
1470
+ elif path_and_successors:
1471
+ # maybe this is a pointer to a struct?
1472
+ if len(nodes) == 1:
1473
+ the_node = next(iter(nodes))
1474
+ if (
1475
+ isinstance(the_node.upper_bound, self._pointer_class())
1476
+ and isinstance(the_node.upper_bound.basetype, Struct)
1477
+ and the_node.upper_bound.basetype.name
1478
+ ):
1479
+ # handle pointers to known struct types
1480
+ result = (
1481
+ the_node.lower_bound
1482
+ if not isinstance(the_node.lower_bound, BottomType)
1483
+ else the_node.upper_bound
1484
+ )
1485
+ for node in nodes:
1486
+ solution[node.typevar] = result
1487
+ self._solution_cache[node.typevar] = result
1488
+ return result
1489
+
1490
+ # create a dummy result and shove it into the cache
1491
+ struct_type = Struct(fields={})
1492
+ result = self._pointer_class()(struct_type)
1493
+ for node in nodes:
1494
+ self._solution_cache[node.typevar] = result
1495
+
1496
+ # this might be a struct
1497
+ fields = {}
1498
+
1499
+ candidate_bases = SortedDict()
1500
+
1501
+ for labels, _succ in path_and_successors:
1502
+ last_label = labels[-1] if labels else None
1503
+ if isinstance(last_label, HasField):
1504
+ # TODO: Really determine the maximum possible size of the field when MAX_POINTSTO_BITS is in use
1505
+ if last_label.offset not in candidate_bases:
1506
+ candidate_bases[last_label.offset] = set()
1507
+ candidate_bases[last_label.offset].add(
1508
+ 1 if last_label.bits == MAX_POINTSTO_BITS else (last_label.bits // 8)
1509
+ )
1510
+
1511
+ # determine possible bases and map each offset to its base
1512
+ offset_to_base = SortedDict()
1513
+ for start_offset, sizes in candidate_bases.items():
1514
+ for size in sizes:
1515
+ for i in range(size):
1516
+ access_off = start_offset + i
1517
+ if access_off not in offset_to_base:
1518
+ offset_to_base[access_off] = start_offset
1519
+
1520
+ # determine again the maximum size of each field (at each offset)
1521
+ offset_to_maxsize = defaultdict(int)
1522
+ offset_to_sizes = defaultdict(set) # we do not consider offsets to each base offset
1523
+ for labels, _succ in path_and_successors:
1524
+ last_label = labels[-1] if labels else None
1525
+ if isinstance(last_label, HasField):
1526
+ base = offset_to_base[last_label.offset]
1527
+ access_size = 1 if last_label.bits == MAX_POINTSTO_BITS else (last_label.bits // 8)
1528
+ offset_to_maxsize[base] = max(offset_to_maxsize[base], (last_label.offset - base) + access_size)
1529
+ offset_to_sizes[base].add(access_size)
1530
+
1531
+ idx_to_base = {}
1532
+
1533
+ for idx, (labels, _) in enumerate(path_and_successors):
1534
+ last_label = labels[-1] if labels else None
1535
+ if isinstance(last_label, HasField):
1536
+ prev_offset = next(offset_to_base.irange(maximum=last_label.offset, reverse=True))
1537
+ idx_to_base[idx] = offset_to_base[prev_offset]
1538
+
1539
+ node_by_offset = defaultdict(set)
1540
+
1541
+ for idx, (labels, succ) in enumerate(path_and_successors):
1542
+ last_label = labels[-1] if labels else None
1543
+ if isinstance(last_label, HasField):
1544
+ if idx in idx_to_base:
1545
+ node_by_offset[idx_to_base[idx]].add(succ)
1546
+ else:
1547
+ node_by_offset[last_label.offset].add(succ)
1548
+
1549
+ sorted_offsets: list[int] = sorted(node_by_offset)
1550
+ for i in range(len(sorted_offsets)): # pylint:disable=consider-using-enumerate
1551
+ offset = sorted_offsets[i]
1552
+
1553
+ child_nodes = node_by_offset[offset]
1554
+ sol = self._determine(the_typevar, sketch, solution, nodes=child_nodes)
1555
+ if isinstance(sol, TopType):
1556
+ # make it an array if possible
1557
+ elem_size = min(offset_to_sizes[offset])
1558
+ array_size = offset_to_maxsize[offset]
1559
+ if array_size % elem_size != 0:
1560
+ # fall back to byte_t
1561
+ elem_size = 1
1562
+ elem_type = int_type(elem_size * 8)
1563
+ sol = elem_type if array_size == elem_size else Array(elem_type, array_size // elem_size)
1564
+ fields[offset] = sol
1565
+
1566
+ if not fields:
1567
+ result = Top_
1568
+ for node in nodes:
1569
+ self._solution_cache[node.typevar] = result
1570
+ solution[node.typevar] = result
1571
+ elif any(off < 0 for off in fields):
1572
+ result = self._pointer_class()(Bottom_)
1573
+ for node in nodes:
1574
+ self._solution_cache[node.typevar] = result
1575
+ solution[node.typevar] = result
1576
+ else:
1577
+ # back-patch
1578
+ struct_type.fields = fields
1579
+ for node in nodes:
1580
+ solution[node.typevar] = result
1581
+
1582
+ if not path_and_successors or result in {Top_, None}:
1583
+ # this is probably a primitive variable
1584
+ lower_bound = Bottom_
1585
+ upper_bound = Top_
1586
+
1587
+ node_sizes = set()
1588
+ for node in nodes:
1589
+ node_size = node.size
1590
+ if node_size is not None:
1591
+ node_sizes.add(node_size)
1592
+ if len(node_sizes) > 1:
1593
+ # multi-sized reads - cannot converge to a reasonable type
1594
+ result = Bottom_
1595
+ else:
1596
+ for node in nodes:
1597
+ lower_bound = self.join(lower_bound, node.lower_bound)
1598
+ upper_bound = self.meet(upper_bound, node.upper_bound)
1599
+ result = lower_bound if not isinstance(lower_bound, BottomType) else upper_bound
1600
+
1601
+ for node in nodes:
1602
+ solution[node.typevar] = result
1603
+ self._solution_cache[node.typevar] = result
1604
+
1605
+ # import pprint
1606
+
1607
+ # print("Solution")
1608
+ # pprint.pprint(result)
1609
+ return result
1610
+
1611
+ @staticmethod
1612
+ def _collect_sketch_paths(node: SketchNodeBase, sketch: Sketch) -> list[tuple[list[BaseLabel], SketchNodeBase]]:
1613
+ """
1614
+ Collect all paths that go from `typevar` to its leaves.
1615
+ """
1616
+ paths = []
1617
+ visited: set[SketchNodeBase] = set()
1618
+ queue: list[tuple[list[BaseLabel], SketchNodeBase]] = [([], node)]
1619
+
1620
+ while queue:
1621
+ curr_labels, curr_node = queue.pop(0)
1622
+ if curr_node in visited:
1623
+ continue
1624
+ visited.add(curr_node)
1625
+
1626
+ out_edges = sketch.graph.out_edges(curr_node, data=True)
1627
+ for _, succ, data in sorted(out_edges, key=lambda x: str(x[1])):
1628
+ if isinstance(succ, RecursiveRefNode):
1629
+ ref = succ
1630
+ succ: SketchNode | None = sketch.lookup(succ.target) # type: ignore
1631
+ if succ is None:
1632
+ # failed to resolve...
1633
+ _l.warning(
1634
+ "Failed to resolve reference node to a real sketch node for type variable %s", ref.target
1635
+ )
1636
+ continue
1637
+ label = data["label"]
1638
+ if isinstance(label, ConvertTo):
1639
+ # drop conv labels for now
1640
+ continue
1641
+ if isinstance(label, IsArray):
1642
+ continue
1643
+ new_labels = [*curr_labels, label]
1644
+ succ: SketchNode
1645
+ if isinstance(succ.typevar, DerivedTypeVariable) and isinstance(succ.typevar.labels[-1], (Load, Store)):
1646
+ queue.append((new_labels, succ))
1647
+ else:
1648
+ paths.append((new_labels, succ))
1649
+
1650
+ return paths
1651
+
1652
+ def _pointer_class(self) -> type[Pointer32] | type[Pointer64]:
1653
+ if self.bits == 32:
1654
+ return Pointer32
1655
+ if self.bits == 64:
1656
+ return Pointer64
1657
+ raise NotImplementedError(f"Unsupported bits {self.bits}")
1658
+
1659
+ @staticmethod
1660
+ def dump_constraint_graph(graph: networkx.DiGraph, filename: str) -> None:
1661
+ """
1662
+ Dump the constraint graph to a file.
1663
+ """
1664
+ from networkx.drawing.nx_agraph import write_dot # pylint:disable=import-outside-toplevel
1665
+
1666
+ write_dot(graph, filename)