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