angr 9.2.103__py3-none-manylinux2014_aarch64.whl

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

Potentially problematic release.


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

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