angr 9.2.158__cp310-abi3-manylinux2014_x86_64.whl

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

Potentially problematic release.


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

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