angr 9.2.117__py3-none-manylinux2014_aarch64.whl → 9.2.119__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 (1317) hide show
  1. angr/__init__.py +2 -1
  2. angr/__main__.py +21 -1
  3. angr/analyses/__init__.py +4 -0
  4. angr/analyses/analysis.py +88 -46
  5. angr/analyses/backward_slice.py +15 -18
  6. angr/analyses/binary_optimizer.py +29 -34
  7. angr/analyses/bindiff.py +35 -44
  8. angr/analyses/boyscout.py +1 -0
  9. angr/analyses/callee_cleanup_finder.py +3 -4
  10. angr/analyses/calling_convention.py +98 -98
  11. angr/analyses/cdg.py +5 -12
  12. angr/analyses/cfg/__init__.py +1 -0
  13. angr/analyses/cfg/cfb.py +14 -20
  14. angr/analyses/cfg/cfg.py +2 -1
  15. angr/analyses/cfg/cfg_arch_options.py +4 -1
  16. angr/analyses/cfg/cfg_base.py +122 -165
  17. angr/analyses/cfg/cfg_emulated.py +60 -92
  18. angr/analyses/cfg/cfg_fast.py +406 -335
  19. angr/analyses/cfg/cfg_fast_soot.py +10 -17
  20. angr/analyses/cfg/cfg_job_base.py +6 -7
  21. angr/analyses/cfg/indirect_jump_resolvers/__init__.py +1 -0
  22. angr/analyses/cfg/indirect_jump_resolvers/amd64_elf_got.py +2 -3
  23. angr/analyses/cfg/indirect_jump_resolvers/amd64_pe_iat.py +2 -3
  24. angr/analyses/cfg/indirect_jump_resolvers/arm_elf_fast.py +6 -8
  25. angr/analyses/cfg/indirect_jump_resolvers/const_resolver.py +3 -5
  26. angr/analyses/cfg/indirect_jump_resolvers/default_resolvers.py +1 -0
  27. angr/analyses/cfg/indirect_jump_resolvers/jumptable.py +97 -112
  28. angr/analyses/cfg/indirect_jump_resolvers/mips_elf_fast.py +26 -32
  29. angr/analyses/cfg/indirect_jump_resolvers/propagator_utils.py +1 -0
  30. angr/analyses/cfg/indirect_jump_resolvers/resolver.py +7 -7
  31. angr/analyses/cfg/indirect_jump_resolvers/x86_elf_pic_plt.py +3 -8
  32. angr/analyses/cfg/indirect_jump_resolvers/x86_pe_iat.py +2 -3
  33. angr/analyses/cfg_slice_to_sink/__init__.py +1 -0
  34. angr/analyses/cfg_slice_to_sink/cfg_slice_to_sink.py +4 -4
  35. angr/analyses/cfg_slice_to_sink/graph.py +4 -1
  36. angr/analyses/cfg_slice_to_sink/transitions.py +4 -2
  37. angr/analyses/class_identifier.py +1 -0
  38. angr/analyses/code_tagging.py +9 -9
  39. angr/analyses/complete_calling_conventions.py +28 -36
  40. angr/analyses/congruency_check.py +6 -11
  41. angr/analyses/data_dep/__init__.py +1 -0
  42. angr/analyses/data_dep/data_dependency_analysis.py +38 -48
  43. angr/analyses/data_dep/dep_nodes.py +13 -12
  44. angr/analyses/data_dep/sim_act_location.py +3 -0
  45. angr/analyses/datagraph_meta.py +7 -7
  46. angr/analyses/ddg.py +48 -69
  47. angr/analyses/decompiler/__init__.py +3 -0
  48. angr/analyses/decompiler/ail_simplifier.py +929 -400
  49. angr/analyses/decompiler/ailgraph_walker.py +1 -0
  50. angr/analyses/decompiler/block_io_finder.py +13 -4
  51. angr/analyses/decompiler/block_similarity.py +28 -18
  52. angr/analyses/decompiler/block_simplifier.py +40 -104
  53. angr/analyses/decompiler/callsite_maker.py +124 -82
  54. angr/analyses/decompiler/ccall_rewriters/__init__.py +1 -0
  55. angr/analyses/decompiler/ccall_rewriters/amd64_ccalls.py +115 -105
  56. angr/analyses/decompiler/ccall_rewriters/rewriter_base.py +2 -1
  57. angr/analyses/decompiler/clinic.py +371 -184
  58. angr/analyses/decompiler/condition_processor.py +127 -116
  59. angr/analyses/decompiler/counters/__init__.py +5 -0
  60. angr/analyses/decompiler/counters/boolean_counter.py +27 -0
  61. angr/analyses/decompiler/{call_counter.py → counters/call_counter.py} +5 -4
  62. angr/analyses/decompiler/{expression_counters.py → counters/expression_counters.py} +5 -4
  63. angr/analyses/decompiler/counters/seq_cf_structure_counter.py +63 -0
  64. angr/analyses/decompiler/decompilation_cache.py +2 -1
  65. angr/analyses/decompiler/decompilation_options.py +1 -0
  66. angr/analyses/decompiler/decompiler.py +50 -27
  67. angr/analyses/decompiler/dephication/__init__.py +6 -0
  68. angr/analyses/decompiler/dephication/dephication_base.py +87 -0
  69. angr/analyses/decompiler/dephication/graph_dephication.py +63 -0
  70. angr/analyses/decompiler/dephication/graph_rewriting.py +116 -0
  71. angr/analyses/decompiler/dephication/graph_vvar_mapping.py +313 -0
  72. angr/analyses/decompiler/dephication/rewriting_engine.py +247 -0
  73. angr/analyses/decompiler/dephication/seqnode_dephication.py +106 -0
  74. angr/analyses/decompiler/empty_node_remover.py +1 -0
  75. angr/analyses/decompiler/expression_narrower.py +12 -17
  76. angr/analyses/decompiler/goto_manager.py +43 -4
  77. angr/analyses/decompiler/graph_region.py +19 -31
  78. angr/analyses/decompiler/jump_target_collector.py +1 -0
  79. angr/analyses/decompiler/jumptable_entry_condition_rewriter.py +2 -1
  80. angr/analyses/decompiler/optimization_passes/__init__.py +7 -3
  81. angr/analyses/decompiler/optimization_passes/base_ptr_save_simplifier.py +23 -18
  82. angr/analyses/decompiler/optimization_passes/call_stmt_rewriter.py +46 -0
  83. angr/analyses/decompiler/optimization_passes/code_motion.py +4 -2
  84. angr/analyses/decompiler/optimization_passes/const_derefs.py +36 -36
  85. angr/analyses/decompiler/optimization_passes/const_prop_reverter.py +6 -9
  86. angr/analyses/decompiler/optimization_passes/cross_jump_reverter.py +4 -3
  87. angr/analyses/decompiler/optimization_passes/deadblock_remover.py +1 -0
  88. angr/analyses/decompiler/optimization_passes/div_simplifier.py +78 -72
  89. angr/analyses/decompiler/optimization_passes/duplication_reverter/__init__.py +2 -0
  90. angr/analyses/decompiler/optimization_passes/duplication_reverter/ail_merge_graph.py +503 -0
  91. angr/analyses/decompiler/optimization_passes/duplication_reverter/duplication_reverter.py +1215 -0
  92. angr/analyses/decompiler/optimization_passes/duplication_reverter/errors.py +16 -0
  93. angr/analyses/decompiler/optimization_passes/duplication_reverter/similarity.py +126 -0
  94. angr/analyses/decompiler/optimization_passes/duplication_reverter/utils.py +169 -0
  95. angr/analyses/decompiler/optimization_passes/engine_base.py +60 -63
  96. angr/analyses/decompiler/optimization_passes/expr_op_swapper.py +6 -7
  97. angr/analyses/decompiler/optimization_passes/flip_boolean_cmp.py +1 -0
  98. angr/analyses/decompiler/optimization_passes/inlined_string_transformation_simplifier.py +102 -37
  99. angr/analyses/decompiler/optimization_passes/ite_expr_converter.py +8 -10
  100. angr/analyses/decompiler/optimization_passes/ite_region_converter.py +128 -18
  101. angr/analyses/decompiler/optimization_passes/lowered_switch_simplifier.py +142 -145
  102. angr/analyses/decompiler/optimization_passes/mod_simplifier.py +27 -23
  103. angr/analyses/decompiler/optimization_passes/multi_simplifier.py +30 -34
  104. angr/analyses/decompiler/optimization_passes/optimization_pass.py +108 -47
  105. angr/analyses/decompiler/optimization_passes/register_save_area_simplifier.py +10 -3
  106. angr/analyses/decompiler/optimization_passes/ret_addr_save_simplifier.py +5 -6
  107. angr/analyses/decompiler/optimization_passes/ret_deduplicator.py +3 -2
  108. angr/analyses/decompiler/optimization_passes/return_duplicator_base.py +125 -13
  109. angr/analyses/decompiler/optimization_passes/return_duplicator_high.py +1 -0
  110. angr/analyses/decompiler/optimization_passes/return_duplicator_low.py +3 -2
  111. angr/analyses/decompiler/optimization_passes/stack_canary_simplifier.py +52 -21
  112. angr/analyses/decompiler/optimization_passes/switch_default_case_duplicator.py +3 -2
  113. angr/analyses/decompiler/optimization_passes/win_stack_canary_simplifier.py +47 -36
  114. angr/analyses/decompiler/optimization_passes/x86_gcc_getpc_simplifier.py +2 -1
  115. angr/analyses/decompiler/peephole_optimizations/__init__.py +2 -0
  116. angr/analyses/decompiler/peephole_optimizations/a_div_const_add_a_mul_n_div_const.py +26 -22
  117. angr/analyses/decompiler/peephole_optimizations/a_mul_const_div_shr_const.py +2 -2
  118. angr/analyses/decompiler/peephole_optimizations/a_shl_const_sub_a.py +1 -0
  119. angr/analyses/decompiler/peephole_optimizations/a_sub_a_div.py +2 -2
  120. angr/analyses/decompiler/peephole_optimizations/a_sub_a_div_const_mul_const.py +1 -0
  121. angr/analyses/decompiler/peephole_optimizations/a_sub_a_sub_n.py +8 -4
  122. angr/analyses/decompiler/peephole_optimizations/arm_cmpf.py +28 -27
  123. angr/analyses/decompiler/peephole_optimizations/base.py +17 -20
  124. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_add_n.py +1 -0
  125. angr/analyses/decompiler/peephole_optimizations/basepointeroffset_and_mask.py +1 -0
  126. angr/analyses/decompiler/peephole_optimizations/bitwise_or_to_logical_or.py +2 -2
  127. angr/analyses/decompiler/peephole_optimizations/bool_expr_xor_1.py +2 -2
  128. angr/analyses/decompiler/peephole_optimizations/bswap.py +29 -22
  129. angr/analyses/decompiler/peephole_optimizations/cmpord_rewriter.py +3 -4
  130. angr/analyses/decompiler/peephole_optimizations/coalesce_adjacent_shrs.py +39 -0
  131. angr/analyses/decompiler/peephole_optimizations/coalesce_same_cascading_ifs.py +2 -1
  132. angr/analyses/decompiler/peephole_optimizations/const_mull_a_shift.py +94 -29
  133. angr/analyses/decompiler/peephole_optimizations/constant_derefs.py +1 -0
  134. angr/analyses/decompiler/peephole_optimizations/conv_a_sub0_shr_and.py +48 -49
  135. angr/analyses/decompiler/peephole_optimizations/conv_shl_shr.py +1 -0
  136. angr/analyses/decompiler/peephole_optimizations/eager_eval.py +41 -34
  137. angr/analyses/decompiler/peephole_optimizations/extended_byte_and_mask.py +2 -1
  138. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy.py +28 -18
  139. angr/analyses/decompiler/peephole_optimizations/inlined_strcpy_consolidation.py +8 -4
  140. angr/analyses/decompiler/peephole_optimizations/inlined_wstrcpy.py +28 -18
  141. angr/analyses/decompiler/peephole_optimizations/invert_negated_logical_conjuction_disjunction.py +32 -32
  142. angr/analyses/decompiler/peephole_optimizations/one_sub_bool.py +2 -2
  143. angr/analyses/decompiler/peephole_optimizations/remove_cascading_conversions.py +23 -3
  144. angr/analyses/decompiler/peephole_optimizations/remove_empty_if_body.py +2 -1
  145. angr/analyses/decompiler/peephole_optimizations/remove_noop_conversions.py +4 -0
  146. angr/analyses/decompiler/peephole_optimizations/remove_redundant_bitmasks.py +1 -0
  147. angr/analyses/decompiler/peephole_optimizations/remove_redundant_conversions.py +4 -6
  148. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_branch.py +14 -13
  149. angr/analyses/decompiler/peephole_optimizations/remove_redundant_ite_comparisons.py +2 -2
  150. angr/analyses/decompiler/peephole_optimizations/remove_redundant_nots.py +1 -0
  151. angr/analyses/decompiler/peephole_optimizations/remove_redundant_reinterprets.py +3 -2
  152. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts.py +2 -2
  153. angr/analyses/decompiler/peephole_optimizations/remove_redundant_shifts_around_comparators.py +20 -16
  154. angr/analyses/decompiler/peephole_optimizations/rewrite_bit_extractions.py +3 -3
  155. angr/analyses/decompiler/peephole_optimizations/rewrite_mips_gp_loads.py +4 -2
  156. angr/analyses/decompiler/peephole_optimizations/rol_ror.py +66 -40
  157. angr/analyses/decompiler/peephole_optimizations/sar_to_signed_div.py +64 -57
  158. angr/analyses/decompiler/peephole_optimizations/simplify_pc_relative_loads.py +14 -14
  159. angr/analyses/decompiler/peephole_optimizations/single_bit_cond_to_boolexpr.py +1 -0
  160. angr/analyses/decompiler/peephole_optimizations/single_bit_xor.py +8 -5
  161. angr/analyses/decompiler/peephole_optimizations/tidy_stack_addr.py +4 -6
  162. angr/analyses/decompiler/redundant_label_remover.py +20 -19
  163. angr/analyses/decompiler/region_identifier.py +64 -77
  164. angr/analyses/decompiler/region_simplifiers/__init__.py +1 -0
  165. angr/analyses/decompiler/region_simplifiers/cascading_cond_transformer.py +2 -1
  166. angr/analyses/decompiler/region_simplifiers/cascading_ifs.py +1 -0
  167. angr/analyses/decompiler/region_simplifiers/expr_folding.py +43 -29
  168. angr/analyses/decompiler/region_simplifiers/goto.py +1 -0
  169. angr/analyses/decompiler/region_simplifiers/if_.py +29 -36
  170. angr/analyses/decompiler/region_simplifiers/ifelse.py +1 -0
  171. angr/analyses/decompiler/region_simplifiers/loop.py +27 -13
  172. angr/analyses/decompiler/region_simplifiers/node_address_finder.py +1 -0
  173. angr/analyses/decompiler/region_simplifiers/region_simplifier.py +1 -0
  174. angr/analyses/decompiler/region_simplifiers/switch_cluster_simplifier.py +12 -16
  175. angr/analyses/decompiler/region_simplifiers/switch_expr_simplifier.py +36 -32
  176. angr/analyses/decompiler/region_walker.py +1 -0
  177. angr/analyses/decompiler/return_maker.py +1 -0
  178. angr/analyses/decompiler/seq_to_blocks.py +1 -0
  179. angr/analyses/decompiler/sequence_walker.py +5 -10
  180. angr/analyses/decompiler/ssailification/__init__.py +4 -0
  181. angr/analyses/decompiler/ssailification/rewriting.py +325 -0
  182. angr/analyses/decompiler/ssailification/rewriting_engine.py +601 -0
  183. angr/analyses/decompiler/ssailification/rewriting_state.py +60 -0
  184. angr/analyses/decompiler/ssailification/ssailification.py +213 -0
  185. angr/analyses/decompiler/ssailification/traversal.py +97 -0
  186. angr/analyses/decompiler/ssailification/traversal_engine.py +131 -0
  187. angr/analyses/decompiler/ssailification/traversal_state.py +42 -0
  188. angr/analyses/decompiler/structured_codegen/__init__.py +1 -0
  189. angr/analyses/decompiler/structured_codegen/base.py +2 -2
  190. angr/analyses/decompiler/structured_codegen/c.py +172 -160
  191. angr/analyses/decompiler/structured_codegen/dummy.py +1 -0
  192. angr/analyses/decompiler/structured_codegen/dwarf_import.py +1 -0
  193. angr/analyses/decompiler/structuring/__init__.py +1 -0
  194. angr/analyses/decompiler/structuring/dream.py +27 -43
  195. angr/analyses/decompiler/structuring/phoenix.py +201 -201
  196. angr/analyses/decompiler/structuring/recursive_structurer.py +4 -3
  197. angr/analyses/decompiler/structuring/sailr.py +5 -4
  198. angr/analyses/decompiler/structuring/structurer_base.py +26 -23
  199. angr/analyses/decompiler/structuring/structurer_nodes.py +14 -24
  200. angr/analyses/decompiler/utils.py +112 -52
  201. angr/analyses/disassembly.py +75 -77
  202. angr/analyses/disassembly_utils.py +10 -13
  203. angr/analyses/dominance_frontier.py +25 -7
  204. angr/analyses/find_objects_static.py +3 -2
  205. angr/analyses/flirt.py +7 -10
  206. angr/analyses/forward_analysis/__init__.py +1 -0
  207. angr/analyses/forward_analysis/forward_analysis.py +9 -6
  208. angr/analyses/forward_analysis/job_info.py +3 -3
  209. angr/analyses/forward_analysis/visitors/__init__.py +1 -0
  210. angr/analyses/forward_analysis/visitors/call_graph.py +1 -0
  211. angr/analyses/forward_analysis/visitors/function_graph.py +3 -2
  212. angr/analyses/forward_analysis/visitors/graph.py +9 -9
  213. angr/analyses/forward_analysis/visitors/loop.py +1 -0
  214. angr/analyses/forward_analysis/visitors/single_node_graph.py +2 -2
  215. angr/analyses/identifier/__init__.py +1 -0
  216. angr/analyses/identifier/custom_callable.py +2 -2
  217. angr/analyses/identifier/errors.py +1 -0
  218. angr/analyses/identifier/func.py +6 -3
  219. angr/analyses/identifier/functions/__init__.py +2 -1
  220. angr/analyses/identifier/functions/atoi.py +2 -4
  221. angr/analyses/identifier/functions/based_atoi.py +3 -6
  222. angr/analyses/identifier/functions/fdprintf.py +1 -0
  223. angr/analyses/identifier/functions/free.py +3 -5
  224. angr/analyses/identifier/functions/int2str.py +11 -26
  225. angr/analyses/identifier/functions/malloc.py +4 -6
  226. angr/analyses/identifier/functions/memcmp.py +2 -4
  227. angr/analyses/identifier/functions/memcpy.py +2 -2
  228. angr/analyses/identifier/functions/memset.py +2 -2
  229. angr/analyses/identifier/functions/printf.py +1 -0
  230. angr/analyses/identifier/functions/recv_until.py +3 -6
  231. angr/analyses/identifier/functions/skip_calloc.py +2 -1
  232. angr/analyses/identifier/functions/skip_realloc.py +4 -6
  233. angr/analyses/identifier/functions/skip_recv_n.py +4 -6
  234. angr/analyses/identifier/functions/snprintf.py +2 -4
  235. angr/analyses/identifier/functions/sprintf.py +1 -0
  236. angr/analyses/identifier/functions/strcasecmp.py +1 -0
  237. angr/analyses/identifier/functions/strcmp.py +2 -1
  238. angr/analyses/identifier/functions/strcpy.py +2 -2
  239. angr/analyses/identifier/functions/strlen.py +1 -0
  240. angr/analyses/identifier/functions/strncmp.py +2 -1
  241. angr/analyses/identifier/functions/strncpy.py +2 -2
  242. angr/analyses/identifier/functions/strtol.py +2 -4
  243. angr/analyses/identifier/identify.py +35 -54
  244. angr/analyses/identifier/runner.py +6 -5
  245. angr/analyses/init_finder.py +17 -17
  246. angr/analyses/loop_analysis.py +10 -14
  247. angr/analyses/loopfinder.py +9 -13
  248. angr/analyses/propagator/__init__.py +1 -0
  249. angr/analyses/propagator/engine_ail.py +161 -166
  250. angr/analyses/propagator/engine_base.py +3 -2
  251. angr/analyses/propagator/engine_vex.py +47 -48
  252. angr/analyses/propagator/outdated_definition_walker.py +18 -23
  253. angr/analyses/propagator/propagator.py +8 -12
  254. angr/analyses/propagator/tmpvar_finder.py +1 -0
  255. angr/analyses/propagator/top_checker_mixin.py +2 -4
  256. angr/analyses/propagator/values.py +1 -0
  257. angr/analyses/propagator/vex_vars.py +3 -2
  258. angr/analyses/proximity_graph.py +12 -20
  259. angr/analyses/reaching_definitions/__init__.py +5 -4
  260. angr/analyses/reaching_definitions/call_trace.py +7 -6
  261. angr/analyses/reaching_definitions/dep_graph.py +18 -23
  262. angr/analyses/reaching_definitions/engine_ail.py +89 -121
  263. angr/analyses/reaching_definitions/engine_vex.py +20 -32
  264. angr/analyses/reaching_definitions/function_handler.py +38 -35
  265. angr/analyses/reaching_definitions/function_handler_library/__init__.py +1 -0
  266. angr/analyses/reaching_definitions/function_handler_library/stdio.py +4 -6
  267. angr/analyses/reaching_definitions/function_handler_library/stdlib.py +1 -2
  268. angr/analyses/reaching_definitions/function_handler_library/string.py +2 -4
  269. angr/analyses/reaching_definitions/function_handler_library/unistd.py +1 -0
  270. angr/analyses/reaching_definitions/heap_allocator.py +7 -6
  271. angr/analyses/reaching_definitions/rd_initializer.py +27 -25
  272. angr/analyses/reaching_definitions/rd_state.py +14 -16
  273. angr/analyses/reaching_definitions/reaching_definitions.py +27 -36
  274. angr/analyses/reaching_definitions/subject.py +3 -2
  275. angr/analyses/reassembler.py +189 -253
  276. angr/analyses/s_liveness/__init__.py +2 -0
  277. angr/analyses/s_liveness/s_liveness.py +153 -0
  278. angr/analyses/s_propagator/__init__.py +2 -0
  279. angr/analyses/s_propagator/s_propagator.py +250 -0
  280. angr/analyses/s_reaching_definitions/__init__.py +2 -0
  281. angr/analyses/s_reaching_definitions/s_rda.py +479 -0
  282. angr/analyses/soot_class_hierarchy.py +15 -24
  283. angr/analyses/stack_pointer_tracker.py +106 -98
  284. angr/analyses/static_hooker.py +3 -2
  285. angr/analyses/typehoon/__init__.py +1 -0
  286. angr/analyses/typehoon/dfa.py +5 -5
  287. angr/analyses/typehoon/lifter.py +5 -4
  288. angr/analyses/typehoon/simple_solver.py +80 -64
  289. angr/analyses/typehoon/translator.py +26 -16
  290. angr/analyses/typehoon/typeconsts.py +22 -12
  291. angr/analyses/typehoon/typehoon.py +8 -10
  292. angr/analyses/typehoon/typevars.py +37 -49
  293. angr/analyses/typehoon/variance.py +1 -0
  294. angr/analyses/variable_recovery/__init__.py +1 -0
  295. angr/analyses/variable_recovery/annotations.py +1 -0
  296. angr/analyses/variable_recovery/engine_ail.py +78 -32
  297. angr/analyses/variable_recovery/engine_base.py +233 -59
  298. angr/analyses/variable_recovery/engine_vex.py +17 -21
  299. angr/analyses/variable_recovery/irsb_scanner.py +1 -0
  300. angr/analyses/variable_recovery/variable_recovery.py +14 -16
  301. angr/analyses/variable_recovery/variable_recovery_base.py +12 -14
  302. angr/analyses/variable_recovery/variable_recovery_fast.py +67 -47
  303. angr/analyses/veritesting.py +10 -16
  304. angr/analyses/vfg.py +102 -148
  305. angr/analyses/vsa_ddg.py +3 -5
  306. angr/analyses/vtable.py +6 -6
  307. angr/analyses/xrefs.py +9 -13
  308. angr/angrdb/__init__.py +4 -2
  309. angr/angrdb/db.py +51 -53
  310. angr/angrdb/models.py +1 -0
  311. angr/angrdb/serializers/__init__.py +1 -0
  312. angr/angrdb/serializers/cfg_model.py +2 -2
  313. angr/angrdb/serializers/comments.py +1 -0
  314. angr/angrdb/serializers/funcs.py +4 -3
  315. angr/angrdb/serializers/kb.py +3 -2
  316. angr/angrdb/serializers/labels.py +1 -0
  317. angr/angrdb/serializers/structured_code.py +5 -10
  318. angr/angrdb/serializers/variables.py +6 -6
  319. angr/angrdb/serializers/xrefs.py +2 -2
  320. angr/annocfg.py +17 -25
  321. angr/blade.py +19 -23
  322. angr/block.py +11 -13
  323. angr/callable.py +4 -3
  324. angr/calling_conventions.py +147 -147
  325. angr/code_location.py +12 -13
  326. angr/codenode.py +2 -1
  327. angr/concretization_strategies/__init__.py +6 -6
  328. angr/concretization_strategies/any.py +5 -4
  329. angr/concretization_strategies/any_named.py +1 -0
  330. angr/concretization_strategies/controlled_data.py +1 -0
  331. angr/concretization_strategies/eval.py +2 -2
  332. angr/concretization_strategies/logging.py +1 -0
  333. angr/concretization_strategies/max.py +6 -6
  334. angr/concretization_strategies/nonzero.py +1 -0
  335. angr/concretization_strategies/nonzero_range.py +4 -3
  336. angr/concretization_strategies/norepeats.py +5 -4
  337. angr/concretization_strategies/norepeats_range.py +1 -0
  338. angr/concretization_strategies/range.py +1 -0
  339. angr/concretization_strategies/signed_add.py +13 -9
  340. angr/concretization_strategies/single.py +2 -0
  341. angr/concretization_strategies/solutions.py +1 -0
  342. angr/concretization_strategies/unlimited_range.py +1 -0
  343. angr/distributed/__init__.py +1 -0
  344. angr/distributed/server.py +2 -2
  345. angr/distributed/worker.py +3 -3
  346. angr/engines/__init__.py +1 -0
  347. angr/engines/concrete.py +2 -1
  348. angr/engines/engine.py +4 -6
  349. angr/engines/failure.py +2 -1
  350. angr/engines/hook.py +1 -0
  351. angr/engines/light/__init__.py +1 -0
  352. angr/engines/light/data.py +221 -255
  353. angr/engines/light/engine.py +72 -85
  354. angr/engines/pcode/__init__.py +1 -0
  355. angr/engines/pcode/behavior.py +3 -3
  356. angr/engines/pcode/cc.py +1 -0
  357. angr/engines/pcode/emulate.py +13 -16
  358. angr/engines/pcode/engine.py +7 -5
  359. angr/engines/pcode/lifter.py +62 -79
  360. angr/engines/procedure.py +1 -0
  361. angr/engines/soot/__init__.py +1 -0
  362. angr/engines/soot/engine.py +46 -52
  363. angr/engines/soot/exceptions.py +3 -0
  364. angr/engines/soot/expressions/__init__.py +1 -0
  365. angr/engines/soot/expressions/arrayref.py +1 -0
  366. angr/engines/soot/expressions/base.py +4 -5
  367. angr/engines/soot/expressions/binop.py +1 -0
  368. angr/engines/soot/expressions/cast.py +1 -0
  369. angr/engines/soot/expressions/condition.py +2 -1
  370. angr/engines/soot/expressions/constants.py +1 -0
  371. angr/engines/soot/expressions/instanceOf.py +1 -0
  372. angr/engines/soot/expressions/instancefieldref.py +1 -0
  373. angr/engines/soot/expressions/invoke.py +7 -9
  374. angr/engines/soot/expressions/length.py +1 -0
  375. angr/engines/soot/expressions/local.py +1 -0
  376. angr/engines/soot/expressions/new.py +1 -0
  377. angr/engines/soot/expressions/newArray.py +1 -0
  378. angr/engines/soot/expressions/newMultiArray.py +3 -3
  379. angr/engines/soot/expressions/paramref.py +1 -0
  380. angr/engines/soot/expressions/phi.py +1 -0
  381. angr/engines/soot/expressions/staticfieldref.py +1 -0
  382. angr/engines/soot/expressions/thisref.py +1 -0
  383. angr/engines/soot/expressions/unsupported.py +1 -0
  384. angr/engines/soot/field_dispatcher.py +5 -8
  385. angr/engines/soot/method_dispatcher.py +4 -7
  386. angr/engines/soot/statements/__init__.py +4 -4
  387. angr/engines/soot/statements/assign.py +1 -0
  388. angr/engines/soot/statements/base.py +6 -7
  389. angr/engines/soot/statements/goto.py +2 -1
  390. angr/engines/soot/statements/identity.py +1 -0
  391. angr/engines/soot/statements/if_.py +2 -1
  392. angr/engines/soot/statements/invoke.py +1 -0
  393. angr/engines/soot/statements/return_.py +1 -0
  394. angr/engines/soot/statements/switch.py +1 -0
  395. angr/engines/soot/statements/throw.py +2 -1
  396. angr/engines/soot/values/__init__.py +4 -2
  397. angr/engines/soot/values/arrayref.py +8 -10
  398. angr/engines/soot/values/base.py +4 -1
  399. angr/engines/soot/values/constants.py +1 -0
  400. angr/engines/soot/values/instancefieldref.py +1 -0
  401. angr/engines/soot/values/local.py +1 -0
  402. angr/engines/soot/values/paramref.py +1 -0
  403. angr/engines/soot/values/staticfieldref.py +1 -0
  404. angr/engines/soot/values/strref.py +3 -2
  405. angr/engines/soot/values/thisref.py +1 -0
  406. angr/engines/successors.py +21 -24
  407. angr/engines/syscall.py +9 -9
  408. angr/engines/unicorn.py +14 -9
  409. angr/engines/vex/__init__.py +1 -0
  410. angr/engines/vex/claripy/__init__.py +1 -0
  411. angr/engines/vex/claripy/ccall.py +86 -112
  412. angr/engines/vex/claripy/datalayer.py +12 -16
  413. angr/engines/vex/claripy/irop.py +85 -104
  414. angr/engines/vex/heavy/__init__.py +1 -0
  415. angr/engines/vex/heavy/actions.py +1 -0
  416. angr/engines/vex/heavy/concretizers.py +8 -9
  417. angr/engines/vex/heavy/dirty.py +6 -5
  418. angr/engines/vex/heavy/heavy.py +15 -14
  419. angr/engines/vex/heavy/inspect.py +1 -0
  420. angr/engines/vex/heavy/resilience.py +2 -2
  421. angr/engines/vex/heavy/super_fastpath.py +2 -2
  422. angr/engines/vex/lifter.py +28 -35
  423. angr/engines/vex/light/__init__.py +1 -0
  424. angr/engines/vex/light/light.py +2 -4
  425. angr/engines/vex/light/resilience.py +1 -0
  426. angr/engines/vex/light/slicing.py +1 -0
  427. angr/errors.py +6 -1
  428. angr/exploration_techniques/__init__.py +3 -2
  429. angr/exploration_techniques/bucketizer.py +2 -3
  430. angr/exploration_techniques/common.py +3 -3
  431. angr/exploration_techniques/dfs.py +1 -0
  432. angr/exploration_techniques/director.py +17 -19
  433. angr/exploration_techniques/driller_core.py +3 -7
  434. angr/exploration_techniques/explorer.py +7 -3
  435. angr/exploration_techniques/lengthlimiter.py +1 -0
  436. angr/exploration_techniques/local_loop_seer.py +2 -2
  437. angr/exploration_techniques/loop_seer.py +11 -14
  438. angr/exploration_techniques/manual_mergepoint.py +3 -2
  439. angr/exploration_techniques/memory_watcher.py +1 -0
  440. angr/exploration_techniques/oppologist.py +4 -4
  441. angr/exploration_techniques/slicecutor.py +1 -0
  442. angr/exploration_techniques/spiller.py +8 -8
  443. angr/exploration_techniques/spiller_db.py +1 -0
  444. angr/exploration_techniques/stochastic.py +3 -4
  445. angr/exploration_techniques/stub_stasher.py +1 -0
  446. angr/exploration_techniques/suggestions.py +5 -4
  447. angr/exploration_techniques/symbion.py +1 -0
  448. angr/exploration_techniques/tech_builder.py +1 -0
  449. angr/exploration_techniques/threading.py +1 -0
  450. angr/exploration_techniques/timeout.py +1 -0
  451. angr/exploration_techniques/tracer.py +34 -39
  452. angr/exploration_techniques/unique.py +1 -0
  453. angr/exploration_techniques/veritesting.py +1 -0
  454. angr/factory.py +9 -9
  455. angr/flirt/__init__.py +1 -0
  456. angr/flirt/build_sig.py +8 -12
  457. angr/keyed_region.py +10 -17
  458. angr/knowledge_base/__init__.py +1 -0
  459. angr/knowledge_base/knowledge_base.py +17 -17
  460. angr/knowledge_plugins/__init__.py +1 -0
  461. angr/knowledge_plugins/callsite_prototypes.py +1 -0
  462. angr/knowledge_plugins/cfg/__init__.py +2 -0
  463. angr/knowledge_plugins/cfg/cfg_manager.py +2 -1
  464. angr/knowledge_plugins/cfg/cfg_model.py +27 -43
  465. angr/knowledge_plugins/cfg/cfg_node.py +8 -19
  466. angr/knowledge_plugins/cfg/indirect_jump.py +3 -5
  467. angr/knowledge_plugins/cfg/memory_data.py +4 -3
  468. angr/knowledge_plugins/comments.py +1 -0
  469. angr/knowledge_plugins/custom_strings.py +1 -0
  470. angr/knowledge_plugins/data.py +1 -0
  471. angr/knowledge_plugins/debug_variables.py +18 -23
  472. angr/knowledge_plugins/functions/__init__.py +1 -0
  473. angr/knowledge_plugins/functions/function.py +49 -53
  474. angr/knowledge_plugins/functions/function_manager.py +14 -14
  475. angr/knowledge_plugins/functions/function_parser.py +38 -42
  476. angr/knowledge_plugins/functions/soot_function.py +5 -6
  477. angr/knowledge_plugins/indirect_jumps.py +1 -0
  478. angr/knowledge_plugins/key_definitions/__init__.py +1 -0
  479. angr/knowledge_plugins/key_definitions/atoms.py +65 -17
  480. angr/knowledge_plugins/key_definitions/constants.py +6 -0
  481. angr/knowledge_plugins/key_definitions/definition.py +22 -25
  482. angr/knowledge_plugins/key_definitions/environment.py +18 -14
  483. angr/knowledge_plugins/key_definitions/heap_address.py +4 -3
  484. angr/knowledge_plugins/key_definitions/key_definition_manager.py +5 -4
  485. angr/knowledge_plugins/key_definitions/live_definitions.py +36 -45
  486. angr/knowledge_plugins/key_definitions/liveness.py +18 -23
  487. angr/knowledge_plugins/key_definitions/rd_model.py +29 -34
  488. angr/knowledge_plugins/key_definitions/tag.py +7 -6
  489. angr/knowledge_plugins/key_definitions/undefined.py +3 -0
  490. angr/knowledge_plugins/key_definitions/unknown_size.py +3 -0
  491. angr/knowledge_plugins/key_definitions/uses.py +21 -23
  492. angr/knowledge_plugins/labels.py +3 -2
  493. angr/knowledge_plugins/patches.py +2 -1
  494. angr/knowledge_plugins/plugin.py +2 -1
  495. angr/knowledge_plugins/propagations/__init__.py +1 -0
  496. angr/knowledge_plugins/propagations/prop_value.py +25 -27
  497. angr/knowledge_plugins/propagations/propagation_manager.py +2 -2
  498. angr/knowledge_plugins/propagations/propagation_model.py +5 -4
  499. angr/knowledge_plugins/propagations/states.py +71 -81
  500. angr/knowledge_plugins/structured_code/__init__.py +1 -0
  501. angr/knowledge_plugins/structured_code/manager.py +5 -4
  502. angr/knowledge_plugins/sync/__init__.py +1 -0
  503. angr/knowledge_plugins/sync/sync_controller.py +10 -15
  504. angr/knowledge_plugins/types.py +1 -0
  505. angr/knowledge_plugins/variables/__init__.py +1 -0
  506. angr/knowledge_plugins/variables/variable_access.py +9 -10
  507. angr/knowledge_plugins/variables/variable_manager.py +84 -55
  508. angr/knowledge_plugins/xrefs/__init__.py +1 -0
  509. angr/knowledge_plugins/xrefs/xref.py +7 -11
  510. angr/knowledge_plugins/xrefs/xref_manager.py +1 -0
  511. angr/knowledge_plugins/xrefs/xref_types.py +3 -0
  512. angr/misc/__init__.py +1 -0
  513. angr/misc/ansi.py +1 -0
  514. angr/misc/autoimport.py +3 -2
  515. angr/misc/bug_report.py +6 -5
  516. angr/misc/hookset.py +3 -2
  517. angr/misc/loggers.py +2 -2
  518. angr/misc/picklable_lock.py +1 -0
  519. angr/misc/plugins.py +11 -13
  520. angr/misc/range.py +3 -0
  521. angr/misc/telemetry.py +54 -0
  522. angr/misc/testing.py +2 -1
  523. angr/misc/ux.py +5 -5
  524. angr/misc/weakpatch.py +1 -0
  525. angr/procedures/__init__.py +1 -0
  526. angr/procedures/cgc/_terminate.py +1 -0
  527. angr/procedures/cgc/allocate.py +1 -0
  528. angr/procedures/cgc/deallocate.py +1 -0
  529. angr/procedures/cgc/fdwait.py +1 -0
  530. angr/procedures/cgc/random.py +1 -0
  531. angr/procedures/cgc/receive.py +26 -26
  532. angr/procedures/cgc/transmit.py +1 -0
  533. angr/procedures/definitions/__init__.py +9 -10
  534. angr/procedures/definitions/cgc.py +1 -0
  535. angr/procedures/definitions/glibc.py +1 -0
  536. angr/procedures/definitions/gnulib.py +1 -0
  537. angr/procedures/definitions/libstdcpp.py +1 -0
  538. angr/procedures/definitions/linux_kernel.py +1 -0
  539. angr/procedures/definitions/linux_loader.py +1 -0
  540. angr/procedures/definitions/msvcr.py +1 -0
  541. angr/procedures/definitions/parse_syscalls_from_local_system.py +2 -1
  542. angr/procedures/definitions/parse_win32json.py +27 -30
  543. angr/procedures/definitions/types_win32.py +1 -0
  544. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-4.py +1 -0
  545. angr/procedures/definitions/wdk_api-ms-win-dx-d3dkmt-l1-1-6.py +1 -0
  546. angr/procedures/definitions/wdk_clfs.py +1 -0
  547. angr/procedures/definitions/wdk_fltmgr.py +1 -0
  548. angr/procedures/definitions/wdk_fwpkclnt.py +1 -0
  549. angr/procedures/definitions/wdk_fwpuclnt.py +1 -0
  550. angr/procedures/definitions/wdk_gdi32.py +1 -0
  551. angr/procedures/definitions/wdk_hal.py +1 -0
  552. angr/procedures/definitions/wdk_ksecdd.py +1 -0
  553. angr/procedures/definitions/wdk_ndis.py +1 -0
  554. angr/procedures/definitions/wdk_ntoskrnl.py +1 -0
  555. angr/procedures/definitions/wdk_offreg.py +1 -0
  556. angr/procedures/definitions/wdk_pshed.py +1 -0
  557. angr/procedures/definitions/wdk_secur32.py +1 -0
  558. angr/procedures/definitions/wdk_vhfum.py +1 -0
  559. angr/procedures/definitions/win32_aclui.py +1 -0
  560. angr/procedures/definitions/win32_activeds.py +1 -0
  561. angr/procedures/definitions/win32_advapi32.py +1 -0
  562. angr/procedures/definitions/win32_advpack.py +1 -0
  563. angr/procedures/definitions/win32_amsi.py +1 -0
  564. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-1.py +1 -0
  565. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-3.py +1 -0
  566. angr/procedures/definitions/win32_api-ms-win-appmodel-runtime-l1-1-6.py +1 -0
  567. angr/procedures/definitions/win32_api-ms-win-core-apiquery-l2-1-0.py +1 -0
  568. angr/procedures/definitions/win32_api-ms-win-core-backgroundtask-l1-1-0.py +1 -0
  569. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-1.py +1 -0
  570. angr/procedures/definitions/win32_api-ms-win-core-comm-l1-1-2.py +1 -0
  571. angr/procedures/definitions/win32_api-ms-win-core-enclave-l1-1-1.py +1 -0
  572. angr/procedures/definitions/win32_api-ms-win-core-errorhandling-l1-1-3.py +1 -0
  573. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-0.py +1 -0
  574. angr/procedures/definitions/win32_api-ms-win-core-featurestaging-l1-1-1.py +1 -0
  575. angr/procedures/definitions/win32_api-ms-win-core-file-fromapp-l1-1-0.py +1 -0
  576. angr/procedures/definitions/win32_api-ms-win-core-handle-l1-1-0.py +1 -0
  577. angr/procedures/definitions/win32_api-ms-win-core-ioring-l1-1-0.py +1 -0
  578. angr/procedures/definitions/win32_api-ms-win-core-marshal-l1-1-0.py +1 -0
  579. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-3.py +1 -0
  580. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-4.py +1 -0
  581. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-5.py +1 -0
  582. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-6.py +1 -0
  583. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-7.py +1 -0
  584. angr/procedures/definitions/win32_api-ms-win-core-memory-l1-1-8.py +1 -0
  585. angr/procedures/definitions/win32_api-ms-win-core-path-l1-1-0.py +1 -0
  586. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-0.py +1 -0
  587. angr/procedures/definitions/win32_api-ms-win-core-psm-appnotify-l1-1-1.py +1 -0
  588. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-1.py +1 -0
  589. angr/procedures/definitions/win32_api-ms-win-core-realtime-l1-1-2.py +1 -0
  590. angr/procedures/definitions/win32_api-ms-win-core-slapi-l1-1-0.py +1 -0
  591. angr/procedures/definitions/win32_api-ms-win-core-state-helpers-l1-1-0.py +1 -0
  592. angr/procedures/definitions/win32_api-ms-win-core-synch-l1-2-0.py +1 -0
  593. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-0.py +1 -0
  594. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-3.py +1 -0
  595. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-4.py +1 -0
  596. angr/procedures/definitions/win32_api-ms-win-core-sysinfo-l1-2-6.py +1 -0
  597. angr/procedures/definitions/win32_api-ms-win-core-util-l1-1-1.py +1 -0
  598. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-0.py +1 -0
  599. angr/procedures/definitions/win32_api-ms-win-core-winrt-error-l1-1-1.py +1 -0
  600. angr/procedures/definitions/win32_api-ms-win-core-winrt-l1-1-0.py +1 -0
  601. angr/procedures/definitions/win32_api-ms-win-core-winrt-registration-l1-1-0.py +1 -0
  602. angr/procedures/definitions/win32_api-ms-win-core-winrt-robuffer-l1-1-0.py +1 -0
  603. angr/procedures/definitions/win32_api-ms-win-core-winrt-roparameterizediid-l1-1-0.py +1 -0
  604. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-0.py +1 -0
  605. angr/procedures/definitions/win32_api-ms-win-core-winrt-string-l1-1-1.py +1 -0
  606. angr/procedures/definitions/win32_api-ms-win-core-wow64-l1-1-1.py +1 -0
  607. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-0.py +1 -0
  608. angr/procedures/definitions/win32_api-ms-win-devices-query-l1-1-1.py +1 -0
  609. angr/procedures/definitions/win32_api-ms-win-dx-d3dkmt-l1-1-0.py +1 -0
  610. angr/procedures/definitions/win32_api-ms-win-gaming-deviceinformation-l1-1-0.py +1 -0
  611. angr/procedures/definitions/win32_api-ms-win-gaming-expandedresources-l1-1-0.py +1 -0
  612. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-0.py +1 -0
  613. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-1.py +1 -0
  614. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-2.py +1 -0
  615. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-3.py +1 -0
  616. angr/procedures/definitions/win32_api-ms-win-gaming-tcui-l1-1-4.py +1 -0
  617. angr/procedures/definitions/win32_api-ms-win-mm-misc-l1-1-1.py +1 -0
  618. angr/procedures/definitions/win32_api-ms-win-net-isolation-l1-1-0.py +1 -0
  619. angr/procedures/definitions/win32_api-ms-win-security-base-l1-2-2.py +1 -0
  620. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-0.py +1 -0
  621. angr/procedures/definitions/win32_api-ms-win-security-isolatedcontainer-l1-1-1.py +1 -0
  622. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-3.py +1 -0
  623. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-4.py +1 -0
  624. angr/procedures/definitions/win32_api-ms-win-service-core-l1-1-5.py +1 -0
  625. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-0.py +1 -0
  626. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-1.py +1 -0
  627. angr/procedures/definitions/win32_api-ms-win-shcore-scaling-l1-1-2.py +1 -0
  628. angr/procedures/definitions/win32_api-ms-win-shcore-stream-winrt-l1-1-0.py +1 -0
  629. angr/procedures/definitions/win32_api-ms-win-wsl-api-l1-1-0.py +1 -0
  630. angr/procedures/definitions/win32_apphelp.py +1 -0
  631. angr/procedures/definitions/win32_authz.py +1 -0
  632. angr/procedures/definitions/win32_avicap32.py +1 -0
  633. angr/procedures/definitions/win32_avifil32.py +1 -0
  634. angr/procedures/definitions/win32_avrt.py +1 -0
  635. angr/procedures/definitions/win32_bcp47mrm.py +1 -0
  636. angr/procedures/definitions/win32_bcrypt.py +1 -0
  637. angr/procedures/definitions/win32_bcryptprimitives.py +1 -0
  638. angr/procedures/definitions/win32_bluetoothapis.py +1 -0
  639. angr/procedures/definitions/win32_bthprops.py +1 -0
  640. angr/procedures/definitions/win32_bthprops_cpl.py +1 -0
  641. angr/procedures/definitions/win32_cabinet.py +1 -0
  642. angr/procedures/definitions/win32_certadm.py +1 -0
  643. angr/procedures/definitions/win32_certpoleng.py +1 -0
  644. angr/procedures/definitions/win32_cfgmgr32.py +1 -0
  645. angr/procedures/definitions/win32_chakra.py +1 -0
  646. angr/procedures/definitions/win32_cldapi.py +1 -0
  647. angr/procedures/definitions/win32_clfsw32.py +1 -0
  648. angr/procedures/definitions/win32_clusapi.py +1 -0
  649. angr/procedures/definitions/win32_comctl32.py +1 -0
  650. angr/procedures/definitions/win32_comdlg32.py +1 -0
  651. angr/procedures/definitions/win32_compstui.py +1 -0
  652. angr/procedures/definitions/win32_computecore.py +1 -0
  653. angr/procedures/definitions/win32_computenetwork.py +1 -0
  654. angr/procedures/definitions/win32_computestorage.py +1 -0
  655. angr/procedures/definitions/win32_comsvcs.py +1 -0
  656. angr/procedures/definitions/win32_coremessaging.py +1 -0
  657. angr/procedures/definitions/win32_credui.py +1 -0
  658. angr/procedures/definitions/win32_crypt32.py +1 -0
  659. angr/procedures/definitions/win32_cryptnet.py +1 -0
  660. angr/procedures/definitions/win32_cryptui.py +1 -0
  661. angr/procedures/definitions/win32_cryptxml.py +1 -0
  662. angr/procedures/definitions/win32_cscapi.py +1 -0
  663. angr/procedures/definitions/win32_d2d1.py +1 -0
  664. angr/procedures/definitions/win32_d3d10.py +1 -0
  665. angr/procedures/definitions/win32_d3d10_1.py +1 -0
  666. angr/procedures/definitions/win32_d3d11.py +1 -0
  667. angr/procedures/definitions/win32_d3d12.py +1 -0
  668. angr/procedures/definitions/win32_d3d9.py +1 -0
  669. angr/procedures/definitions/win32_d3dcompiler_47.py +1 -0
  670. angr/procedures/definitions/win32_d3dcsx.py +1 -0
  671. angr/procedures/definitions/win32_davclnt.py +1 -0
  672. angr/procedures/definitions/win32_dbgeng.py +1 -0
  673. angr/procedures/definitions/win32_dbghelp.py +1 -0
  674. angr/procedures/definitions/win32_dbgmodel.py +1 -0
  675. angr/procedures/definitions/win32_dciman32.py +1 -0
  676. angr/procedures/definitions/win32_dcomp.py +1 -0
  677. angr/procedures/definitions/win32_ddraw.py +1 -0
  678. angr/procedures/definitions/win32_deviceaccess.py +1 -0
  679. angr/procedures/definitions/win32_dflayout.py +1 -0
  680. angr/procedures/definitions/win32_dhcpcsvc.py +1 -0
  681. angr/procedures/definitions/win32_dhcpcsvc6.py +1 -0
  682. angr/procedures/definitions/win32_dhcpsapi.py +1 -0
  683. angr/procedures/definitions/win32_diagnosticdataquery.py +1 -0
  684. angr/procedures/definitions/win32_dinput8.py +1 -0
  685. angr/procedures/definitions/win32_directml.py +1 -0
  686. angr/procedures/definitions/win32_dmprocessxmlfiltered.py +1 -0
  687. angr/procedures/definitions/win32_dnsapi.py +1 -0
  688. angr/procedures/definitions/win32_drt.py +1 -0
  689. angr/procedures/definitions/win32_drtprov.py +1 -0
  690. angr/procedures/definitions/win32_drttransport.py +1 -0
  691. angr/procedures/definitions/win32_dsound.py +1 -0
  692. angr/procedures/definitions/win32_dsparse.py +1 -0
  693. angr/procedures/definitions/win32_dsprop.py +1 -0
  694. angr/procedures/definitions/win32_dssec.py +1 -0
  695. angr/procedures/definitions/win32_dsuiext.py +1 -0
  696. angr/procedures/definitions/win32_dwmapi.py +1 -0
  697. angr/procedures/definitions/win32_dwrite.py +1 -0
  698. angr/procedures/definitions/win32_dxcompiler.py +1 -0
  699. angr/procedures/definitions/win32_dxcore.py +1 -0
  700. angr/procedures/definitions/win32_dxgi.py +1 -0
  701. angr/procedures/definitions/win32_dxva2.py +1 -0
  702. angr/procedures/definitions/win32_eappcfg.py +1 -0
  703. angr/procedures/definitions/win32_eappprxy.py +1 -0
  704. angr/procedures/definitions/win32_efswrt.py +1 -0
  705. angr/procedures/definitions/win32_elscore.py +1 -0
  706. angr/procedures/definitions/win32_esent.py +1 -0
  707. angr/procedures/definitions/win32_evr.py +1 -0
  708. angr/procedures/definitions/win32_faultrep.py +1 -0
  709. angr/procedures/definitions/win32_fhsvcctl.py +1 -0
  710. angr/procedures/definitions/win32_firewallapi.py +1 -0
  711. angr/procedures/definitions/win32_fltlib.py +1 -0
  712. angr/procedures/definitions/win32_fontsub.py +1 -0
  713. angr/procedures/definitions/win32_forceinline.py +1 -0
  714. angr/procedures/definitions/win32_fwpuclnt.py +1 -0
  715. angr/procedures/definitions/win32_fxsutility.py +1 -0
  716. angr/procedures/definitions/win32_gdi32.py +1 -0
  717. angr/procedures/definitions/win32_gdiplus.py +1 -0
  718. angr/procedures/definitions/win32_glu32.py +1 -0
  719. angr/procedures/definitions/win32_gpedit.py +1 -0
  720. angr/procedures/definitions/win32_hhctrl_ocx.py +1 -0
  721. angr/procedures/definitions/win32_hid.py +1 -0
  722. angr/procedures/definitions/win32_hlink.py +1 -0
  723. angr/procedures/definitions/win32_hrtfapo.py +1 -0
  724. angr/procedures/definitions/win32_httpapi.py +1 -0
  725. angr/procedures/definitions/win32_icm32.py +1 -0
  726. angr/procedures/definitions/win32_icmui.py +1 -0
  727. angr/procedures/definitions/win32_icu.py +1 -0
  728. angr/procedures/definitions/win32_ieframe.py +1 -0
  729. angr/procedures/definitions/win32_imagehlp.py +1 -0
  730. angr/procedures/definitions/win32_imgutil.py +1 -0
  731. angr/procedures/definitions/win32_imm32.py +1 -0
  732. angr/procedures/definitions/win32_infocardapi.py +1 -0
  733. angr/procedures/definitions/win32_inkobjcore.py +1 -0
  734. angr/procedures/definitions/win32_iphlpapi.py +1 -0
  735. angr/procedures/definitions/win32_iscsidsc.py +1 -0
  736. angr/procedures/definitions/win32_isolatedwindowsenvironmentutils.py +1 -0
  737. angr/procedures/definitions/win32_kernel32.py +1 -0
  738. angr/procedures/definitions/win32_kernelbase.py +1 -0
  739. angr/procedures/definitions/win32_keycredmgr.py +1 -0
  740. angr/procedures/definitions/win32_ksproxy_ax.py +1 -0
  741. angr/procedures/definitions/win32_ksuser.py +1 -0
  742. angr/procedures/definitions/win32_ktmw32.py +1 -0
  743. angr/procedures/definitions/win32_licenseprotection.py +1 -0
  744. angr/procedures/definitions/win32_loadperf.py +1 -0
  745. angr/procedures/definitions/win32_magnification.py +1 -0
  746. angr/procedures/definitions/win32_mapi32.py +1 -0
  747. angr/procedures/definitions/win32_mdmlocalmanagement.py +1 -0
  748. angr/procedures/definitions/win32_mdmregistration.py +1 -0
  749. angr/procedures/definitions/win32_mf.py +1 -0
  750. angr/procedures/definitions/win32_mfcore.py +1 -0
  751. angr/procedures/definitions/win32_mfplat.py +1 -0
  752. angr/procedures/definitions/win32_mfplay.py +1 -0
  753. angr/procedures/definitions/win32_mfreadwrite.py +1 -0
  754. angr/procedures/definitions/win32_mfsensorgroup.py +1 -0
  755. angr/procedures/definitions/win32_mfsrcsnk.py +1 -0
  756. angr/procedures/definitions/win32_mgmtapi.py +1 -0
  757. angr/procedures/definitions/win32_mi.py +1 -0
  758. angr/procedures/definitions/win32_mmdevapi.py +1 -0
  759. angr/procedures/definitions/win32_mpr.py +1 -0
  760. angr/procedures/definitions/win32_mprapi.py +1 -0
  761. angr/procedures/definitions/win32_mqrt.py +1 -0
  762. angr/procedures/definitions/win32_mrmsupport.py +1 -0
  763. angr/procedures/definitions/win32_msacm32.py +1 -0
  764. angr/procedures/definitions/win32_msajapi.py +1 -0
  765. angr/procedures/definitions/win32_mscms.py +1 -0
  766. angr/procedures/definitions/win32_mscoree.py +1 -0
  767. angr/procedures/definitions/win32_msctfmonitor.py +1 -0
  768. angr/procedures/definitions/win32_msdelta.py +1 -0
  769. angr/procedures/definitions/win32_msdmo.py +1 -0
  770. angr/procedures/definitions/win32_msdrm.py +1 -0
  771. angr/procedures/definitions/win32_msi.py +1 -0
  772. angr/procedures/definitions/win32_msimg32.py +1 -0
  773. angr/procedures/definitions/win32_mspatcha.py +1 -0
  774. angr/procedures/definitions/win32_mspatchc.py +1 -0
  775. angr/procedures/definitions/win32_msports.py +1 -0
  776. angr/procedures/definitions/win32_msrating.py +1 -0
  777. angr/procedures/definitions/win32_mssign32.py +1 -0
  778. angr/procedures/definitions/win32_mstask.py +1 -0
  779. angr/procedures/definitions/win32_msvfw32.py +1 -0
  780. angr/procedures/definitions/win32_mswsock.py +1 -0
  781. angr/procedures/definitions/win32_mtxdm.py +1 -0
  782. angr/procedures/definitions/win32_ncrypt.py +1 -0
  783. angr/procedures/definitions/win32_ndfapi.py +1 -0
  784. angr/procedures/definitions/win32_netapi32.py +1 -0
  785. angr/procedures/definitions/win32_netsh.py +1 -0
  786. angr/procedures/definitions/win32_netshell.py +1 -0
  787. angr/procedures/definitions/win32_newdev.py +1 -0
  788. angr/procedures/definitions/win32_ninput.py +1 -0
  789. angr/procedures/definitions/win32_normaliz.py +1 -0
  790. angr/procedures/definitions/win32_ntdll.py +1 -0
  791. angr/procedures/definitions/win32_ntdllk.py +1 -0
  792. angr/procedures/definitions/win32_ntdsapi.py +1 -0
  793. angr/procedures/definitions/win32_ntlanman.py +1 -0
  794. angr/procedures/definitions/win32_odbc32.py +1 -0
  795. angr/procedures/definitions/win32_odbcbcp.py +1 -0
  796. angr/procedures/definitions/win32_ole32.py +1 -0
  797. angr/procedures/definitions/win32_oleacc.py +1 -0
  798. angr/procedures/definitions/win32_oleaut32.py +1 -0
  799. angr/procedures/definitions/win32_oledlg.py +1 -0
  800. angr/procedures/definitions/win32_ondemandconnroutehelper.py +1 -0
  801. angr/procedures/definitions/win32_opengl32.py +1 -0
  802. angr/procedures/definitions/win32_opmxbox.py +1 -0
  803. angr/procedures/definitions/win32_p2p.py +1 -0
  804. angr/procedures/definitions/win32_p2pgraph.py +1 -0
  805. angr/procedures/definitions/win32_pdh.py +1 -0
  806. angr/procedures/definitions/win32_peerdist.py +1 -0
  807. angr/procedures/definitions/win32_powrprof.py +1 -0
  808. angr/procedures/definitions/win32_prntvpt.py +1 -0
  809. angr/procedures/definitions/win32_projectedfslib.py +1 -0
  810. angr/procedures/definitions/win32_propsys.py +1 -0
  811. angr/procedures/definitions/win32_psapi.py +1 -0
  812. angr/procedures/definitions/win32_quartz.py +1 -0
  813. angr/procedures/definitions/win32_query.py +1 -0
  814. angr/procedures/definitions/win32_qwave.py +1 -0
  815. angr/procedures/definitions/win32_rasapi32.py +1 -0
  816. angr/procedures/definitions/win32_rasdlg.py +1 -0
  817. angr/procedures/definitions/win32_resutils.py +1 -0
  818. angr/procedures/definitions/win32_rometadata.py +1 -0
  819. angr/procedures/definitions/win32_rpcns4.py +1 -0
  820. angr/procedures/definitions/win32_rpcproxy.py +1 -0
  821. angr/procedures/definitions/win32_rpcrt4.py +1 -0
  822. angr/procedures/definitions/win32_rstrtmgr.py +1 -0
  823. angr/procedures/definitions/win32_rtm.py +1 -0
  824. angr/procedures/definitions/win32_rtutils.py +1 -0
  825. angr/procedures/definitions/win32_rtworkq.py +1 -0
  826. angr/procedures/definitions/win32_sas.py +1 -0
  827. angr/procedures/definitions/win32_scarddlg.py +1 -0
  828. angr/procedures/definitions/win32_schannel.py +1 -0
  829. angr/procedures/definitions/win32_sechost.py +1 -0
  830. angr/procedures/definitions/win32_secur32.py +1 -0
  831. angr/procedures/definitions/win32_sensapi.py +1 -0
  832. angr/procedures/definitions/win32_sensorsutilsv2.py +1 -0
  833. angr/procedures/definitions/win32_setupapi.py +1 -0
  834. angr/procedures/definitions/win32_sfc.py +1 -0
  835. angr/procedures/definitions/win32_shdocvw.py +1 -0
  836. angr/procedures/definitions/win32_shell32.py +1 -0
  837. angr/procedures/definitions/win32_shlwapi.py +1 -0
  838. angr/procedures/definitions/win32_slc.py +1 -0
  839. angr/procedures/definitions/win32_slcext.py +1 -0
  840. angr/procedures/definitions/win32_slwga.py +1 -0
  841. angr/procedures/definitions/win32_snmpapi.py +1 -0
  842. angr/procedures/definitions/win32_spoolss.py +1 -0
  843. angr/procedures/definitions/win32_srclient.py +1 -0
  844. angr/procedures/definitions/win32_srpapi.py +1 -0
  845. angr/procedures/definitions/win32_sspicli.py +1 -0
  846. angr/procedures/definitions/win32_sti.py +1 -0
  847. angr/procedures/definitions/win32_t2embed.py +1 -0
  848. angr/procedures/definitions/win32_tapi32.py +1 -0
  849. angr/procedures/definitions/win32_tbs.py +1 -0
  850. angr/procedures/definitions/win32_tdh.py +1 -0
  851. angr/procedures/definitions/win32_tokenbinding.py +1 -0
  852. angr/procedures/definitions/win32_traffic.py +1 -0
  853. angr/procedures/definitions/win32_txfw32.py +1 -0
  854. angr/procedures/definitions/win32_ualapi.py +1 -0
  855. angr/procedures/definitions/win32_uiautomationcore.py +1 -0
  856. angr/procedures/definitions/win32_urlmon.py +1 -0
  857. angr/procedures/definitions/win32_user32.py +1 -0
  858. angr/procedures/definitions/win32_userenv.py +1 -0
  859. angr/procedures/definitions/win32_usp10.py +1 -0
  860. angr/procedures/definitions/win32_uxtheme.py +1 -0
  861. angr/procedures/definitions/win32_verifier.py +1 -0
  862. angr/procedures/definitions/win32_version.py +1 -0
  863. angr/procedures/definitions/win32_vertdll.py +1 -0
  864. angr/procedures/definitions/win32_virtdisk.py +1 -0
  865. angr/procedures/definitions/win32_vmdevicehost.py +1 -0
  866. angr/procedures/definitions/win32_vmsavedstatedumpprovider.py +1 -0
  867. angr/procedures/definitions/win32_vssapi.py +1 -0
  868. angr/procedures/definitions/win32_wcmapi.py +1 -0
  869. angr/procedures/definitions/win32_wdsbp.py +1 -0
  870. angr/procedures/definitions/win32_wdsclientapi.py +1 -0
  871. angr/procedures/definitions/win32_wdsmc.py +1 -0
  872. angr/procedures/definitions/win32_wdspxe.py +1 -0
  873. angr/procedures/definitions/win32_wdstptc.py +1 -0
  874. angr/procedures/definitions/win32_webauthn.py +1 -0
  875. angr/procedures/definitions/win32_webservices.py +1 -0
  876. angr/procedures/definitions/win32_websocket.py +1 -0
  877. angr/procedures/definitions/win32_wecapi.py +1 -0
  878. angr/procedures/definitions/win32_wer.py +1 -0
  879. angr/procedures/definitions/win32_wevtapi.py +1 -0
  880. angr/procedures/definitions/win32_winbio.py +1 -0
  881. angr/procedures/definitions/win32_windows_ai_machinelearning.py +1 -0
  882. angr/procedures/definitions/win32_windows_data_pdf.py +1 -0
  883. angr/procedures/definitions/win32_windows_media_mediacontrol.py +1 -0
  884. angr/procedures/definitions/win32_windows_networking.py +1 -0
  885. angr/procedures/definitions/win32_windows_ui_xaml.py +1 -0
  886. angr/procedures/definitions/win32_windowscodecs.py +1 -0
  887. angr/procedures/definitions/win32_winfax.py +1 -0
  888. angr/procedures/definitions/win32_winhttp.py +1 -0
  889. angr/procedures/definitions/win32_winhvemulation.py +1 -0
  890. angr/procedures/definitions/win32_winhvplatform.py +1 -0
  891. angr/procedures/definitions/win32_wininet.py +1 -0
  892. angr/procedures/definitions/win32_winml.py +1 -0
  893. angr/procedures/definitions/win32_winmm.py +1 -0
  894. angr/procedures/definitions/win32_winscard.py +1 -0
  895. angr/procedures/definitions/win32_winspool.py +1 -0
  896. angr/procedures/definitions/win32_winspool_drv.py +1 -0
  897. angr/procedures/definitions/win32_wintrust.py +1 -0
  898. angr/procedures/definitions/win32_winusb.py +1 -0
  899. angr/procedures/definitions/win32_wlanapi.py +1 -0
  900. angr/procedures/definitions/win32_wlanui.py +1 -0
  901. angr/procedures/definitions/win32_wldap32.py +1 -0
  902. angr/procedures/definitions/win32_wldp.py +1 -0
  903. angr/procedures/definitions/win32_wmvcore.py +1 -0
  904. angr/procedures/definitions/win32_wnvapi.py +1 -0
  905. angr/procedures/definitions/win32_wofutil.py +1 -0
  906. angr/procedures/definitions/win32_ws2_32.py +1 -0
  907. angr/procedures/definitions/win32_wscapi.py +1 -0
  908. angr/procedures/definitions/win32_wsclient.py +1 -0
  909. angr/procedures/definitions/win32_wsdapi.py +1 -0
  910. angr/procedures/definitions/win32_wsmsvc.py +1 -0
  911. angr/procedures/definitions/win32_wsnmp32.py +1 -0
  912. angr/procedures/definitions/win32_wtsapi32.py +1 -0
  913. angr/procedures/definitions/win32_xaudio2_8.py +1 -0
  914. angr/procedures/definitions/win32_xinput1_4.py +1 -0
  915. angr/procedures/definitions/win32_xinputuap.py +1 -0
  916. angr/procedures/definitions/win32_xmllite.py +1 -0
  917. angr/procedures/definitions/win32_xolehlp.py +1 -0
  918. angr/procedures/definitions/win32_xpsprint.py +1 -0
  919. angr/procedures/glibc/__ctype_b_loc.py +2 -3
  920. angr/procedures/glibc/__ctype_tolower_loc.py +2 -3
  921. angr/procedures/glibc/__ctype_toupper_loc.py +2 -3
  922. angr/procedures/glibc/__errno_location.py +1 -0
  923. angr/procedures/glibc/__libc_init.py +1 -0
  924. angr/procedures/glibc/__libc_start_main.py +2 -3
  925. angr/procedures/glibc/dynamic_loading.py +1 -0
  926. angr/procedures/glibc/scanf.py +1 -0
  927. angr/procedures/glibc/sscanf.py +1 -0
  928. angr/procedures/gnulib/xalloc_die.py +1 -0
  929. angr/procedures/gnulib/xstrtol_fatal.py +1 -0
  930. angr/procedures/java/__init__.py +1 -0
  931. angr/procedures/java/unconstrained.py +4 -3
  932. angr/procedures/java_io/read.py +1 -0
  933. angr/procedures/java_io/write.py +1 -0
  934. angr/procedures/java_jni/__init__.py +25 -18
  935. angr/procedures/java_jni/array_operations.py +1 -0
  936. angr/procedures/java_jni/class_and_interface_operations.py +3 -3
  937. angr/procedures/java_jni/field_access.py +3 -6
  938. angr/procedures/java_jni/global_and_local_refs.py +1 -0
  939. angr/procedures/java_jni/method_calls.py +3 -2
  940. angr/procedures/java_jni/not_implemented.py +2 -1
  941. angr/procedures/java_jni/object_operations.py +3 -4
  942. angr/procedures/java_jni/string_operations.py +2 -1
  943. angr/procedures/java_jni/version_information.py +1 -0
  944. angr/procedures/java_lang/character.py +2 -3
  945. angr/procedures/java_lang/double.py +2 -2
  946. angr/procedures/java_lang/exit.py +1 -0
  947. angr/procedures/java_lang/getsimplename.py +2 -2
  948. angr/procedures/java_lang/integer.py +1 -0
  949. angr/procedures/java_lang/load_library.py +1 -0
  950. angr/procedures/java_lang/math.py +1 -0
  951. angr/procedures/java_lang/string.py +3 -3
  952. angr/procedures/java_lang/stringbuilder.py +1 -0
  953. angr/procedures/java_lang/system.py +1 -0
  954. angr/procedures/java_util/collection.py +1 -0
  955. angr/procedures/java_util/iterator.py +1 -0
  956. angr/procedures/java_util/list.py +1 -0
  957. angr/procedures/java_util/map.py +3 -4
  958. angr/procedures/java_util/random.py +1 -0
  959. angr/procedures/java_util/scanner_nextline.py +2 -1
  960. angr/procedures/libc/abort.py +1 -0
  961. angr/procedures/libc/access.py +1 -0
  962. angr/procedures/libc/atoi.py +2 -2
  963. angr/procedures/libc/atol.py +1 -0
  964. angr/procedures/libc/calloc.py +1 -0
  965. angr/procedures/libc/closelog.py +1 -0
  966. angr/procedures/libc/err.py +1 -0
  967. angr/procedures/libc/error.py +2 -3
  968. angr/procedures/libc/exit.py +1 -0
  969. angr/procedures/libc/fclose.py +2 -3
  970. angr/procedures/libc/feof.py +1 -0
  971. angr/procedures/libc/fflush.py +1 -0
  972. angr/procedures/libc/fgetc.py +1 -0
  973. angr/procedures/libc/fgets.py +19 -19
  974. angr/procedures/libc/fopen.py +6 -8
  975. angr/procedures/libc/fprintf.py +1 -0
  976. angr/procedures/libc/fputc.py +1 -0
  977. angr/procedures/libc/fputs.py +1 -0
  978. angr/procedures/libc/fread.py +1 -0
  979. angr/procedures/libc/free.py +1 -0
  980. angr/procedures/libc/fscanf.py +2 -2
  981. angr/procedures/libc/fseek.py +3 -2
  982. angr/procedures/libc/ftell.py +1 -0
  983. angr/procedures/libc/fwrite.py +1 -0
  984. angr/procedures/libc/getchar.py +2 -2
  985. angr/procedures/libc/getdelim.py +25 -25
  986. angr/procedures/libc/getegid.py +1 -0
  987. angr/procedures/libc/geteuid.py +1 -0
  988. angr/procedures/libc/getgid.py +1 -0
  989. angr/procedures/libc/gets.py +18 -18
  990. angr/procedures/libc/getuid.py +1 -0
  991. angr/procedures/libc/malloc.py +1 -0
  992. angr/procedures/libc/memcmp.py +3 -6
  993. angr/procedures/libc/memcpy.py +1 -0
  994. angr/procedures/libc/memset.py +1 -0
  995. angr/procedures/libc/openlog.py +1 -0
  996. angr/procedures/libc/perror.py +1 -0
  997. angr/procedures/libc/printf.py +1 -0
  998. angr/procedures/libc/putchar.py +1 -0
  999. angr/procedures/libc/puts.py +1 -0
  1000. angr/procedures/libc/rand.py +1 -0
  1001. angr/procedures/libc/realloc.py +1 -0
  1002. angr/procedures/libc/rewind.py +2 -1
  1003. angr/procedures/libc/scanf.py +2 -2
  1004. angr/procedures/libc/setbuf.py +1 -0
  1005. angr/procedures/libc/setvbuf.py +1 -0
  1006. angr/procedures/libc/snprintf.py +1 -0
  1007. angr/procedures/libc/sprintf.py +1 -0
  1008. angr/procedures/libc/srand.py +1 -0
  1009. angr/procedures/libc/sscanf.py +2 -2
  1010. angr/procedures/libc/stpcpy.py +2 -2
  1011. angr/procedures/libc/strcat.py +1 -0
  1012. angr/procedures/libc/strchr.py +1 -0
  1013. angr/procedures/libc/strcmp.py +1 -0
  1014. angr/procedures/libc/strcpy.py +2 -2
  1015. angr/procedures/libc/strlen.py +35 -31
  1016. angr/procedures/libc/strncat.py +1 -0
  1017. angr/procedures/libc/strncmp.py +9 -11
  1018. angr/procedures/libc/strncpy.py +1 -0
  1019. angr/procedures/libc/strnlen.py +2 -2
  1020. angr/procedures/libc/strstr.py +8 -4
  1021. angr/procedures/libc/strtol.py +9 -9
  1022. angr/procedures/libc/strtoul.py +2 -2
  1023. angr/procedures/libc/system.py +1 -0
  1024. angr/procedures/libc/time.py +2 -2
  1025. angr/procedures/libc/tmpnam.py +1 -0
  1026. angr/procedures/libc/tolower.py +1 -0
  1027. angr/procedures/libc/toupper.py +1 -0
  1028. angr/procedures/libc/ungetc.py +1 -0
  1029. angr/procedures/libc/vsnprintf.py +1 -0
  1030. angr/procedures/libc/wchar.py +1 -0
  1031. angr/procedures/libstdcpp/_unwind_resume.py +1 -0
  1032. angr/procedures/libstdcpp/std____throw_bad_alloc.py +1 -0
  1033. angr/procedures/libstdcpp/std____throw_bad_cast.py +1 -0
  1034. angr/procedures/libstdcpp/std____throw_length_error.py +1 -0
  1035. angr/procedures/libstdcpp/std____throw_logic_error.py +1 -0
  1036. angr/procedures/libstdcpp/std__terminate.py +1 -0
  1037. angr/procedures/linux_kernel/access.py +1 -0
  1038. angr/procedures/linux_kernel/arch_prctl.py +1 -0
  1039. angr/procedures/linux_kernel/arm_user_helpers.py +1 -0
  1040. angr/procedures/linux_kernel/brk.py +1 -0
  1041. angr/procedures/linux_kernel/cwd.py +1 -0
  1042. angr/procedures/linux_kernel/fstat.py +2 -1
  1043. angr/procedures/linux_kernel/fstat64.py +2 -1
  1044. angr/procedures/linux_kernel/futex.py +3 -3
  1045. angr/procedures/linux_kernel/getegid.py +1 -0
  1046. angr/procedures/linux_kernel/geteuid.py +1 -0
  1047. angr/procedures/linux_kernel/getgid.py +1 -0
  1048. angr/procedures/linux_kernel/getpid.py +1 -0
  1049. angr/procedures/linux_kernel/getrlimit.py +3 -3
  1050. angr/procedures/linux_kernel/gettid.py +1 -0
  1051. angr/procedures/linux_kernel/getuid.py +1 -0
  1052. angr/procedures/linux_kernel/iovec.py +1 -0
  1053. angr/procedures/linux_kernel/lseek.py +1 -0
  1054. angr/procedures/linux_kernel/mmap.py +1 -0
  1055. angr/procedures/linux_kernel/mprotect.py +7 -6
  1056. angr/procedures/linux_kernel/munmap.py +1 -0
  1057. angr/procedures/linux_kernel/openat.py +3 -5
  1058. angr/procedures/linux_kernel/set_tid_address.py +1 -0
  1059. angr/procedures/linux_kernel/sigaction.py +1 -0
  1060. angr/procedures/linux_kernel/sigprocmask.py +1 -0
  1061. angr/procedures/linux_kernel/stat.py +3 -2
  1062. angr/procedures/linux_kernel/sysinfo.py +1 -0
  1063. angr/procedures/linux_kernel/tgkill.py +1 -0
  1064. angr/procedures/linux_kernel/time.py +2 -1
  1065. angr/procedures/linux_kernel/uid.py +1 -0
  1066. angr/procedures/linux_kernel/uname.py +1 -0
  1067. angr/procedures/linux_kernel/unlink.py +2 -2
  1068. angr/procedures/linux_kernel/vsyscall.py +2 -1
  1069. angr/procedures/linux_loader/_dl_initial_error_catch_tsd.py +1 -0
  1070. angr/procedures/linux_loader/_dl_rtld_lock.py +1 -0
  1071. angr/procedures/linux_loader/sim_loader.py +1 -0
  1072. angr/procedures/linux_loader/tls.py +2 -2
  1073. angr/procedures/msvcr/__getmainargs.py +1 -0
  1074. angr/procedures/msvcr/_initterm.py +1 -0
  1075. angr/procedures/msvcr/fmode.py +1 -0
  1076. angr/procedures/ntdll/exceptions.py +4 -3
  1077. angr/procedures/posix/accept.py +2 -2
  1078. angr/procedures/posix/bind.py +1 -0
  1079. angr/procedures/posix/bzero.py +1 -0
  1080. angr/procedures/posix/chroot.py +1 -0
  1081. angr/procedures/posix/close.py +2 -2
  1082. angr/procedures/posix/closedir.py +1 -0
  1083. angr/procedures/posix/dup.py +4 -3
  1084. angr/procedures/posix/fcntl.py +1 -0
  1085. angr/procedures/posix/fdopen.py +16 -19
  1086. angr/procedures/posix/fileno.py +1 -0
  1087. angr/procedures/posix/fork.py +1 -0
  1088. angr/procedures/posix/getenv.py +1 -0
  1089. angr/procedures/posix/gethostbyname.py +1 -0
  1090. angr/procedures/posix/getpass.py +1 -0
  1091. angr/procedures/posix/getsockopt.py +1 -0
  1092. angr/procedures/posix/htonl.py +2 -2
  1093. angr/procedures/posix/htons.py +2 -2
  1094. angr/procedures/posix/inet_ntoa.py +3 -5
  1095. angr/procedures/posix/listen.py +1 -0
  1096. angr/procedures/posix/mmap.py +2 -1
  1097. angr/procedures/posix/open.py +1 -0
  1098. angr/procedures/posix/opendir.py +1 -0
  1099. angr/procedures/posix/poll.py +3 -3
  1100. angr/procedures/posix/pread64.py +1 -0
  1101. angr/procedures/posix/pthread.py +3 -3
  1102. angr/procedures/posix/pwrite64.py +1 -0
  1103. angr/procedures/posix/read.py +1 -0
  1104. angr/procedures/posix/readdir.py +1 -1
  1105. angr/procedures/posix/recv.py +1 -0
  1106. angr/procedures/posix/recvfrom.py +1 -0
  1107. angr/procedures/posix/select.py +7 -7
  1108. angr/procedures/posix/send.py +2 -2
  1109. angr/procedures/posix/setsockopt.py +1 -0
  1110. angr/procedures/posix/sigaction.py +1 -0
  1111. angr/procedures/posix/sim_time.py +1 -0
  1112. angr/procedures/posix/sleep.py +1 -0
  1113. angr/procedures/posix/socket.py +2 -2
  1114. angr/procedures/posix/strcasecmp.py +1 -0
  1115. angr/procedures/posix/strdup.py +1 -0
  1116. angr/procedures/posix/strtok_r.py +32 -36
  1117. angr/procedures/posix/syslog.py +1 -0
  1118. angr/procedures/posix/tz.py +1 -0
  1119. angr/procedures/posix/unlink.py +1 -0
  1120. angr/procedures/posix/usleep.py +1 -0
  1121. angr/procedures/posix/write.py +1 -0
  1122. angr/procedures/procedure_dict.py +1 -0
  1123. angr/procedures/stubs/CallReturn.py +1 -0
  1124. angr/procedures/stubs/NoReturnUnconstrained.py +1 -0
  1125. angr/procedures/stubs/Nop.py +1 -0
  1126. angr/procedures/stubs/PathTerminator.py +1 -0
  1127. angr/procedures/stubs/Redirect.py +3 -2
  1128. angr/procedures/stubs/ReturnChar.py +1 -0
  1129. angr/procedures/stubs/ReturnUnconstrained.py +2 -1
  1130. angr/procedures/stubs/UnresolvableCallTarget.py +1 -0
  1131. angr/procedures/stubs/UnresolvableJumpTarget.py +1 -0
  1132. angr/procedures/stubs/UserHook.py +2 -1
  1133. angr/procedures/stubs/b64_decode.py +1 -0
  1134. angr/procedures/stubs/caller.py +1 -0
  1135. angr/procedures/stubs/crazy_scanf.py +1 -0
  1136. angr/procedures/stubs/format_parser.py +12 -16
  1137. angr/procedures/stubs/syscall_stub.py +6 -7
  1138. angr/procedures/testing/manyargs.py +1 -0
  1139. angr/procedures/testing/retreg.py +2 -2
  1140. angr/procedures/tracer/random.py +1 -0
  1141. angr/procedures/tracer/receive.py +4 -4
  1142. angr/procedures/tracer/transmit.py +4 -4
  1143. angr/procedures/uclibc/__uClibc_main.py +1 -0
  1144. angr/procedures/win32/EncodePointer.py +1 -0
  1145. angr/procedures/win32/ExitProcess.py +1 -0
  1146. angr/procedures/win32/GetCommandLine.py +1 -0
  1147. angr/procedures/win32/GetCurrentProcessId.py +1 -0
  1148. angr/procedures/win32/GetCurrentThreadId.py +1 -0
  1149. angr/procedures/win32/GetLastInputInfo.py +1 -0
  1150. angr/procedures/win32/GetModuleHandle.py +3 -4
  1151. angr/procedures/win32/GetProcessAffinityMask.py +1 -0
  1152. angr/procedures/win32/InterlockedExchange.py +2 -1
  1153. angr/procedures/win32/IsProcessorFeaturePresent.py +1 -0
  1154. angr/procedures/win32/VirtualAlloc.py +2 -1
  1155. angr/procedures/win32/VirtualProtect.py +1 -0
  1156. angr/procedures/win32/critical_section.py +1 -0
  1157. angr/procedures/win32/dynamic_loading.py +2 -1
  1158. angr/procedures/win32/file_handles.py +4 -4
  1159. angr/procedures/win32/gethostbyname.py +2 -2
  1160. angr/procedures/win32/heap.py +1 -0
  1161. angr/procedures/win32/is_bad_ptr.py +1 -0
  1162. angr/procedures/win32/local_storage.py +7 -6
  1163. angr/procedures/win32/mutex.py +1 -0
  1164. angr/procedures/win32/sim_time.py +7 -10
  1165. angr/procedures/win32/system_paths.py +5 -4
  1166. angr/procedures/win32_kernel/ExAllocatePool.py +1 -0
  1167. angr/procedures/win32_kernel/ExFreePoolWithTag.py +1 -0
  1168. angr/procedures/win_user32/chars.py +1 -0
  1169. angr/procedures/win_user32/keyboard.py +1 -0
  1170. angr/procedures/win_user32/messagebox.py +2 -4
  1171. angr/project.py +15 -22
  1172. angr/protos/__init__.py +1 -0
  1173. angr/serializable.py +6 -3
  1174. angr/sim_manager.py +18 -18
  1175. angr/sim_options.py +5 -7
  1176. angr/sim_procedure.py +16 -15
  1177. angr/sim_state.py +61 -88
  1178. angr/sim_state_options.py +9 -15
  1179. angr/sim_type.py +135 -123
  1180. angr/sim_variable.py +23 -38
  1181. angr/simos/__init__.py +3 -1
  1182. angr/simos/cgc.py +2 -1
  1183. angr/simos/javavm.py +84 -95
  1184. angr/simos/linux.py +54 -64
  1185. angr/simos/simos.py +14 -23
  1186. angr/simos/snimmuc_nxp.py +3 -6
  1187. angr/simos/userland.py +6 -6
  1188. angr/simos/windows.py +14 -11
  1189. angr/slicer.py +13 -11
  1190. angr/state_hierarchy.py +4 -4
  1191. angr/state_plugins/__init__.py +1 -0
  1192. angr/state_plugins/callstack.py +19 -18
  1193. angr/state_plugins/cgc.py +5 -4
  1194. angr/state_plugins/concrete.py +7 -8
  1195. angr/state_plugins/debug_variables.py +15 -17
  1196. angr/state_plugins/filesystem.py +13 -19
  1197. angr/state_plugins/gdb.py +3 -2
  1198. angr/state_plugins/globals.py +5 -1
  1199. angr/state_plugins/heap/__init__.py +1 -0
  1200. angr/state_plugins/heap/heap_base.py +1 -0
  1201. angr/state_plugins/heap/heap_brk.py +9 -6
  1202. angr/state_plugins/heap/heap_freelist.py +12 -9
  1203. angr/state_plugins/heap/heap_libc.py +1 -0
  1204. angr/state_plugins/heap/heap_ptmalloc.py +27 -36
  1205. angr/state_plugins/heap/utils.py +1 -0
  1206. angr/state_plugins/history.py +7 -10
  1207. angr/state_plugins/inspect.py +1 -0
  1208. angr/state_plugins/javavm_classloader.py +3 -2
  1209. angr/state_plugins/jni_references.py +2 -1
  1210. angr/state_plugins/libc.py +4 -4
  1211. angr/state_plugins/light_registers.py +6 -8
  1212. angr/state_plugins/log.py +1 -0
  1213. angr/state_plugins/loop_data.py +1 -0
  1214. angr/state_plugins/plugin.py +7 -8
  1215. angr/state_plugins/posix.py +14 -22
  1216. angr/state_plugins/preconstrainer.py +4 -3
  1217. angr/state_plugins/scratch.py +6 -5
  1218. angr/state_plugins/sim_action.py +15 -20
  1219. angr/state_plugins/sim_action_object.py +205 -82
  1220. angr/state_plugins/sim_event.py +1 -0
  1221. angr/state_plugins/solver.py +65 -93
  1222. angr/state_plugins/symbolizer.py +5 -6
  1223. angr/state_plugins/trace_additions.py +32 -42
  1224. angr/state_plugins/uc_manager.py +16 -9
  1225. angr/state_plugins/unicorn_engine.py +21 -37
  1226. angr/state_plugins/view.py +20 -19
  1227. angr/storage/__init__.py +1 -0
  1228. angr/storage/file.py +31 -33
  1229. angr/storage/memory_mixins/__init__.py +12 -15
  1230. angr/storage/memory_mixins/__init__.pyi +13 -14
  1231. angr/storage/memory_mixins/actions_mixin.py +2 -1
  1232. angr/storage/memory_mixins/address_concretization_mixin.py +11 -15
  1233. angr/storage/memory_mixins/bvv_conversion_mixin.py +10 -11
  1234. angr/storage/memory_mixins/clouseau_mixin.py +1 -0
  1235. angr/storage/memory_mixins/conditional_store_mixin.py +1 -0
  1236. angr/storage/memory_mixins/convenient_mappings_mixin.py +7 -8
  1237. angr/storage/memory_mixins/default_filler_mixin.py +12 -14
  1238. angr/storage/memory_mixins/dirty_addrs_mixin.py +1 -0
  1239. angr/storage/memory_mixins/hex_dumper_mixin.py +6 -9
  1240. angr/storage/memory_mixins/javavm_memory/__init__.py +1 -0
  1241. angr/storage/memory_mixins/javavm_memory/javavm_memory_mixin.py +16 -23
  1242. angr/storage/memory_mixins/keyvalue_memory/__init__.py +1 -0
  1243. angr/storage/memory_mixins/keyvalue_memory/keyvalue_memory_mixin.py +2 -1
  1244. angr/storage/memory_mixins/label_merger_mixin.py +2 -2
  1245. angr/storage/memory_mixins/multi_value_merger_mixin.py +6 -5
  1246. angr/storage/memory_mixins/name_resolution_mixin.py +12 -15
  1247. angr/storage/memory_mixins/paged_memory/page_backer_mixins.py +6 -6
  1248. angr/storage/memory_mixins/paged_memory/paged_memory_mixin.py +22 -36
  1249. angr/storage/memory_mixins/paged_memory/paged_memory_multivalue_mixin.py +1 -0
  1250. angr/storage/memory_mixins/paged_memory/pages/__init__.py +1 -2
  1251. angr/storage/memory_mixins/paged_memory/pages/cooperation.py +4 -3
  1252. angr/storage/memory_mixins/paged_memory/pages/history_tracking_mixin.py +4 -4
  1253. angr/storage/memory_mixins/paged_memory/pages/ispo_mixin.py +1 -0
  1254. angr/storage/memory_mixins/paged_memory/pages/list_page.py +12 -20
  1255. angr/storage/memory_mixins/paged_memory/pages/multi_values.py +14 -19
  1256. angr/storage/memory_mixins/paged_memory/pages/mv_list_page.py +26 -32
  1257. angr/storage/memory_mixins/paged_memory/pages/permissions_mixin.py +1 -0
  1258. angr/storage/memory_mixins/paged_memory/pages/refcount_mixin.py +2 -2
  1259. angr/storage/memory_mixins/paged_memory/pages/ultra_page.py +38 -42
  1260. angr/storage/memory_mixins/paged_memory/privileged_mixin.py +1 -0
  1261. angr/storage/memory_mixins/paged_memory/stack_allocation_mixin.py +1 -0
  1262. angr/storage/memory_mixins/regioned_memory/__init__.py +1 -0
  1263. angr/storage/memory_mixins/regioned_memory/abstract_address_descriptor.py +5 -4
  1264. angr/storage/memory_mixins/regioned_memory/abstract_merger_mixin.py +6 -21
  1265. angr/storage/memory_mixins/regioned_memory/region_category_mixin.py +1 -0
  1266. angr/storage/memory_mixins/regioned_memory/region_data.py +4 -5
  1267. angr/storage/memory_mixins/regioned_memory/region_meta_mixin.py +129 -13
  1268. angr/storage/memory_mixins/regioned_memory/regioned_address_concretization_mixin.py +2 -1
  1269. angr/storage/memory_mixins/regioned_memory/regioned_memory_mixin.py +34 -44
  1270. angr/storage/memory_mixins/regioned_memory/static_find_mixin.py +7 -9
  1271. angr/storage/memory_mixins/simple_interface_mixin.py +8 -11
  1272. angr/storage/memory_mixins/simplification_mixin.py +1 -0
  1273. angr/storage/memory_mixins/size_resolution_mixin.py +5 -4
  1274. angr/storage/memory_mixins/slotted_memory.py +3 -3
  1275. angr/storage/memory_mixins/smart_find_mixin.py +3 -2
  1276. angr/storage/memory_mixins/symbolic_merger_mixin.py +1 -0
  1277. angr/storage/memory_mixins/top_merger_mixin.py +2 -2
  1278. angr/storage/memory_mixins/underconstrained_mixin.py +12 -14
  1279. angr/storage/memory_mixins/unwrapper_mixin.py +1 -0
  1280. angr/storage/memory_object.py +35 -35
  1281. angr/storage/pcap.py +3 -3
  1282. angr/tablespecs.py +1 -0
  1283. angr/utils/__init__.py +1 -0
  1284. angr/utils/ail.py +30 -0
  1285. angr/utils/algo.py +1 -0
  1286. angr/utils/bits.py +12 -0
  1287. angr/utils/constants.py +2 -0
  1288. angr/utils/cowdict.py +3 -4
  1289. angr/utils/dynamic_dictlist.py +4 -7
  1290. angr/utils/endness.py +1 -0
  1291. angr/utils/enums_conv.py +1 -0
  1292. angr/utils/env.py +1 -0
  1293. angr/utils/formatting.py +1 -0
  1294. angr/utils/funcid.py +15 -14
  1295. angr/utils/graph.py +52 -19
  1296. angr/utils/lazy_import.py +1 -0
  1297. angr/utils/library.py +10 -13
  1298. angr/utils/loader.py +6 -6
  1299. angr/utils/mp.py +4 -3
  1300. angr/utils/orderedset.py +1 -0
  1301. angr/utils/segment_list.py +7 -9
  1302. angr/utils/ssa/__init__.py +198 -0
  1303. angr/utils/ssa/tmp_uses_collector.py +23 -0
  1304. angr/utils/ssa/vvar_uses_collector.py +37 -0
  1305. angr/utils/timing.py +32 -20
  1306. angr/utils/typing.py +1 -0
  1307. angr/vaults.py +7 -8
  1308. {angr-9.2.117.dist-info → angr-9.2.119.dist-info}/METADATA +9 -8
  1309. angr-9.2.119.dist-info/RECORD +1345 -0
  1310. {angr-9.2.117.dist-info → angr-9.2.119.dist-info}/WHEEL +1 -1
  1311. angr/analyses/decompiler/optimization_passes/spilled_register_finder.py +0 -18
  1312. angr/analyses/decompiler/seq_cf_structure_counter.py +0 -37
  1313. angr/service.py +0 -35
  1314. angr-9.2.117.dist-info/RECORD +0 -1310
  1315. {angr-9.2.117.dist-info → angr-9.2.119.dist-info}/LICENSE +0 -0
  1316. {angr-9.2.117.dist-info → angr-9.2.119.dist-info}/entry_points.txt +0 -0
  1317. {angr-9.2.117.dist-info → angr-9.2.119.dist-info}/top_level.txt +0 -0
@@ -1,23 +1,24 @@
1
1
  from __future__ import annotations
2
+ from typing import Any, NamedTuple, TYPE_CHECKING
2
3
  import copy
3
- from collections import defaultdict, namedtuple
4
4
  import logging
5
5
  import enum
6
- from dataclasses import dataclass
7
- from typing import Any, NamedTuple, TYPE_CHECKING
6
+ from collections import defaultdict, namedtuple
8
7
  from collections.abc import Iterable
8
+ from dataclasses import dataclass
9
9
 
10
10
  import networkx
11
11
  import capstone
12
12
 
13
13
  import ailment
14
14
 
15
+ from angr.errors import AngrDecompilationError
15
16
  from ...knowledge_base import KnowledgeBase
16
17
  from ...knowledge_plugins.functions import Function
17
18
  from ...knowledge_plugins.cfg.memory_data import MemoryDataSort
18
19
  from ...codenode import BlockNode
19
20
  from ...utils import timethis
20
- from ...calling_conventions import SimRegArg, SimStackArg, SimStructArg, SimFunctionArgument
21
+ from ...calling_conventions import SimRegArg, SimStackArg, SimFunctionArgument
21
22
  from ...sim_type import (
22
23
  SimTypeChar,
23
24
  SimTypeInt,
@@ -30,7 +31,6 @@ from ...sim_type import (
30
31
  )
31
32
  from ..stack_pointer_tracker import Register, OffsetVal
32
33
  from ...sim_variable import SimVariable, SimStackVariable, SimRegisterVariable, SimMemoryVariable
33
- from ...knowledge_plugins.key_definitions.constants import OP_BEFORE
34
34
  from ...procedures.stubs.UnresolvableCallTarget import UnresolvableCallTarget
35
35
  from ...procedures.stubs.UnresolvableJumpTarget import UnresolvableJumpTarget
36
36
  from .. import Analysis, register_analysis
@@ -43,10 +43,10 @@ from .optimization_passes import (
43
43
  OptimizationPassStage,
44
44
  RegisterSaveAreaSimplifier,
45
45
  StackCanarySimplifier,
46
- SpilledRegisterFinder,
47
46
  DUPLICATING_OPTS,
48
47
  CONDENSING_OPTS,
49
48
  )
49
+ from .utils import first_nonlabel_statement_id
50
50
 
51
51
  if TYPE_CHECKING:
52
52
  from angr.knowledge_plugins.cfg import CFGModel
@@ -110,6 +110,7 @@ class Clinic(Analysis):
110
110
  inline_functions: set[Function] | None = frozenset(),
111
111
  inlined_counts: dict[int, int] | None = None,
112
112
  inlining_parents: set[int] | None = None,
113
+ vvar_id_start: int = 0,
113
114
  ):
114
115
  if not func.normalized and mode == ClinicMode.DECOMPILE:
115
116
  raise ValueError("Decompilation must work on normalized function graphs.")
@@ -120,6 +121,7 @@ class Clinic(Analysis):
120
121
  self.cc_graph: networkx.DiGraph | None = None
121
122
  self.unoptimized_graph: networkx.DiGraph | None = None
122
123
  self.arg_list = None
124
+ self.arg_vvars: dict[int, tuple[ailment.Expr.VirtualVariable, SimRegArg]] | None = None
123
125
  self.variable_kb = variable_kb
124
126
  self.externs: set[SimMemoryVariable] = set()
125
127
  self.data_refs: dict[int, int] = {} # data address to instruction address
@@ -127,6 +129,7 @@ class Clinic(Analysis):
127
129
  self._func_graph: networkx.DiGraph | None = None
128
130
  self._ail_manager = None
129
131
  self._blocks_by_addr_and_size = {}
132
+ self._entry_node_addr: tuple[int, int | None] = self.function.addr, None
130
133
 
131
134
  self._fold_callexprs_into_conditions = fold_callexprs_into_conditions
132
135
  self._insert_labels = insert_labels
@@ -141,6 +144,8 @@ class Clinic(Analysis):
141
144
  self.reaching_definitions: ReachingDefinitionsAnalysis | None = None
142
145
  self._cache = cache
143
146
  self._mode = mode
147
+ self.vvar_id_start = vvar_id_start
148
+ self.vvar_to_vvar: dict[int, int] | None = None
144
149
 
145
150
  # inlining help
146
151
  self._sp_shift = sp_shift
@@ -296,11 +301,13 @@ class Clinic(Analysis):
296
301
  callee,
297
302
  mode=ClinicMode.DECOMPILE,
298
303
  inline_functions=self._inline_functions,
299
- inlining_parents=self._inlining_parents + (self.function.addr,),
304
+ inlining_parents=(*self._inlining_parents, self.function.addr),
300
305
  inlined_counts=self._inlined_counts,
301
- optimization_passes=[StackCanarySimplifier, SpilledRegisterFinder],
306
+ optimization_passes=[StackCanarySimplifier],
302
307
  sp_shift=self._max_stack_depth,
308
+ vvar_id_start=self.vvar_id_start,
303
309
  )
310
+ self.vvar_id_start = callee_clinic.vvar_id_start + 1
304
311
  self._max_stack_depth = callee_clinic._max_stack_depth
305
312
  callee_graph = callee_clinic.copy_graph()
306
313
 
@@ -318,34 +325,29 @@ class Clinic(Analysis):
318
325
  ail_graph.remove_edge(caller_block, caller_successor)
319
326
 
320
327
  # update all callee return nodes with caller successor
321
- # and rewrite pseudoreg-tagged spills to actually use pseudoregs
322
328
  ail_graph = networkx.union(ail_graph, callee_graph)
323
329
  for blk in callee_graph.nodes():
324
330
  for idx, stmt in enumerate(list(blk.statements)):
325
331
  if isinstance(stmt, ailment.Stmt.Return):
326
- blk.statements[idx] = ailment.Stmt.Jump(
327
- None,
328
- ailment.Expr.Const(None, None, caller_successor.addr, self.project.arch.bits),
329
- caller_successor.idx,
330
- **blk.statements[idx].tags,
331
- )
332
+ # replace the return statement with an assignment to the return register
332
333
  blk.statements.pop(idx)
334
+
335
+ if stmt.ret_exprs:
336
+ assign_to_retreg = ailment.Stmt.Assignment(
337
+ self._ail_manager.next_atom(),
338
+ ailment.Expr.Register(
339
+ self._ail_manager.next_atom(),
340
+ None,
341
+ self.project.arch.ret_offset,
342
+ self.project.arch.bits,
343
+ ),
344
+ stmt.ret_exprs[0],
345
+ **stmt.tags,
346
+ )
347
+ blk.statements.insert(idx, assign_to_retreg)
348
+ idx += 1
333
349
  ail_graph.add_edge(blk, caller_successor)
334
350
  break
335
- if "pseudoreg" in stmt.tags and isinstance(stmt, ailment.Stmt.Store):
336
- new_stmt = ailment.Stmt.Assignment(
337
- stmt.idx, ailment.Expr.Register(None, None, stmt.pseudoreg, stmt.size * 8), stmt.data
338
- )
339
- new_stmt.tags.update(stmt.tags)
340
- new_stmt.tags.pop("pseudoreg")
341
- blk.statements[idx] = new_stmt
342
- if "pseudoreg" in stmt.tags and isinstance(stmt, ailment.Stmt.Assignment):
343
- new_stmt = ailment.Stmt.Assignment(
344
- stmt.idx, stmt.dst, ailment.Expr.Register(None, None, stmt.pseudoreg, stmt.src.size * 8)
345
- )
346
- new_stmt.tags.update(stmt.tags)
347
- new_stmt.tags.pop("pseudoreg")
348
- blk.statements[idx] = new_stmt
349
351
 
350
352
  # update the call edge
351
353
  caller_block.statements[call_idx] = ailment.Stmt.Jump(
@@ -372,6 +374,20 @@ class Clinic(Analysis):
372
374
  and caller_block.statements[call_idx - 1].data.value == caller_successor.addr
373
375
  ):
374
376
  caller_block.statements.pop(call_idx - 1) # s_10 =L 0x401225<64><8>
377
+
378
+ # update caller_block to setup parameters
379
+ if callee_clinic.arg_vvars:
380
+ for arg_idx in sorted(callee_clinic.arg_vvars.keys()):
381
+ param_vvar, reg_arg = callee_clinic.arg_vvars[arg_idx]
382
+ reg_offset = reg_arg.reg
383
+ stmt = ailment.Stmt.Assignment(
384
+ self._ail_manager.next_atom(),
385
+ param_vvar,
386
+ ailment.Expr.Register(self._ail_manager.next_atom(), None, reg_offset, reg_arg.bits),
387
+ ins_addr=caller_block.addr + caller_block.original_size,
388
+ )
389
+ caller_block.statements.append(stmt)
390
+
375
391
  ail_graph.add_edge(caller_block, callee_start)
376
392
 
377
393
  return ail_graph
@@ -398,8 +414,22 @@ class Clinic(Analysis):
398
414
  if self.function.prototype is None or not isinstance(self.function.prototype.returnty, SimTypeBottom):
399
415
  ail_graph = self._make_returns(ail_graph)
400
416
 
417
+ ail_graph = self._run_simplification_passes(
418
+ ail_graph, stage=OptimizationPassStage.BEFORE_SSA_LEVEL0_TRANSFORMATION
419
+ )
420
+
421
+ # Make function arguments
422
+ self._update_progress(33.0, text="Making argument list")
423
+ arg_list = self._make_argument_list()
424
+ arg_vvars = {}
425
+ ail_graph = self._create_argument_accessing_statements(arg_list, ail_graph, arg_vvars)
426
+
427
+ # Transform the graph into partial SSA form
428
+ self._update_progress(35.0, text="Transforming to partial-SSA form")
429
+ ail_graph = self._transform_to_ssa_level0(ail_graph)
430
+
401
431
  # full-function constant-only propagation
402
- self._update_progress(33.0, text="Constant propagation")
432
+ self._update_progress(36.0, text="Constant propagation")
403
433
  self._simplify_function(
404
434
  ail_graph,
405
435
  remove_dead_memdefs=False,
@@ -414,13 +444,13 @@ class Clinic(Analysis):
414
444
  block_simplification_cache: dict[ailment.Block, NamedTuple] | None = {}
415
445
 
416
446
  # Track stack pointers
417
- self._update_progress(15.0, text="Tracking stack pointers")
447
+ self._update_progress(37.0, text="Tracking stack pointers")
418
448
  spt = self._track_stack_pointers()
419
449
 
420
450
  # Simplify blocks
421
451
  # we never remove dead memory definitions before making callsites. otherwise stack arguments may go missing
422
452
  # before they are recognized as stack arguments.
423
- self._update_progress(35.0, text="Simplifying blocks 1")
453
+ self._update_progress(38.0, text="Simplifying blocks 1")
424
454
  ail_graph = self._simplify_blocks(
425
455
  ail_graph, stack_pointer_tracker=spt, remove_dead_memdefs=False, cache=block_simplification_cache
426
456
  )
@@ -440,6 +470,7 @@ class Clinic(Analysis):
440
470
  unify_variables=False,
441
471
  narrow_expressions=True,
442
472
  fold_callexprs_into_conditions=self._fold_callexprs_into_conditions,
473
+ arg_vvars=arg_vvars,
443
474
  )
444
475
 
445
476
  # Run simplification passes again. there might be more chances for peephole optimizations after function-level
@@ -449,13 +480,16 @@ class Clinic(Analysis):
449
480
  ail_graph, stack_pointer_tracker=spt, remove_dead_memdefs=False, cache=block_simplification_cache
450
481
  )
451
482
 
483
+ # rewrite (qualified) stack variables into SSA form
484
+ ail_graph = self._transform_to_ssa_level1(ail_graph)
485
+
452
486
  # clear _blocks_by_addr_and_size so no one can use it again
453
487
  # TODO: Totally remove this dict
454
488
  self._blocks_by_addr_and_size = None
455
489
 
456
490
  # Make call-sites
457
491
  self._update_progress(50.0, text="Making callsites")
458
- _, stackarg_offsets = self._make_callsites(ail_graph, stack_pointer_tracker=spt)
492
+ _, stackarg_offsets, removed_vvar_ids = self._make_callsites(ail_graph, stack_pointer_tracker=spt)
459
493
 
460
494
  # Run simplification passes
461
495
  self._update_progress(53.0, text="Running simplifications 2")
@@ -470,6 +504,8 @@ class Clinic(Analysis):
470
504
  unify_variables=True,
471
505
  narrow_expressions=True,
472
506
  fold_callexprs_into_conditions=self._fold_callexprs_into_conditions,
507
+ removed_vvar_ids=removed_vvar_ids,
508
+ arg_vvars=arg_vvars,
473
509
  )
474
510
 
475
511
  # After global optimization, there might be more chances for peephole optimizations.
@@ -495,9 +531,10 @@ class Clinic(Analysis):
495
531
  unify_variables=True,
496
532
  narrow_expressions=True,
497
533
  fold_callexprs_into_conditions=self._fold_callexprs_into_conditions,
534
+ arg_vvars=arg_vvars,
498
535
  )
499
536
 
500
- self._update_progress(72.0, text="Simplifying blocks 4")
537
+ self._update_progress(75.0, text="Simplifying blocks 4")
501
538
  ail_graph = self._simplify_blocks(
502
539
  ail_graph,
503
540
  remove_dead_memdefs=self._remove_dead_memdefs,
@@ -505,31 +542,47 @@ class Clinic(Analysis):
505
542
  cache=block_simplification_cache,
506
543
  )
507
544
 
508
- # Make function arguments
509
- self._update_progress(75.0, text="Making argument list")
510
- arg_list = self._make_argument_list()
545
+ # Simplify the entire function for the fourth time
546
+ self._update_progress(78.0, text="Simplifying function 4")
547
+ self._simplify_function(
548
+ ail_graph,
549
+ remove_dead_memdefs=self._remove_dead_memdefs,
550
+ stack_arg_offsets=stackarg_offsets,
551
+ unify_variables=True,
552
+ narrow_expressions=True,
553
+ fold_callexprs_into_conditions=self._fold_callexprs_into_conditions,
554
+ arg_vvars=arg_vvars,
555
+ )
556
+
557
+ # update arg_list
558
+ arg_list = []
559
+ for idx in sorted(arg_vvars):
560
+ arg_list.append(arg_vvars[idx][1])
561
+
562
+ # Get virtual variable mapping that can de-phi the SSA representation
563
+ vvar2vvar = self._collect_dephi_vvar_mapping_and_rewrite_blocks(ail_graph)
511
564
 
512
565
  # Recover variables on AIL blocks
513
566
  self._update_progress(80.0, text="Recovering variables")
514
- variable_kb = self._recover_and_link_variables(ail_graph, arg_list)
567
+ variable_kb = self._recover_and_link_variables(ail_graph, arg_list, arg_vvars, vvar2vvar)
568
+
569
+ # Run simplification passes
570
+ self._update_progress(85.0, text="Running simplifications 4")
571
+ ail_graph = self._run_simplification_passes(ail_graph, stage=OptimizationPassStage.AFTER_VARIABLE_RECOVERY)
515
572
 
516
573
  # Make function prototype
517
574
  self._update_progress(90.0, text="Making function prototype")
518
575
  self._make_function_prototype(arg_list, variable_kb)
519
576
 
520
- # Run simplification passes
521
- self._update_progress(95.0, text="Running simplifications 4")
522
- ail_graph = self._run_simplification_passes(
523
- ail_graph, stage=OptimizationPassStage.AFTER_VARIABLE_RECOVERY, variable_kb=variable_kb
524
- )
525
-
526
577
  # remove empty nodes from the graph
527
578
  ail_graph = self.remove_empty_nodes(ail_graph)
528
579
 
529
580
  self.arg_list = arg_list
581
+ self.arg_vvars = arg_vvars
530
582
  self.variable_kb = variable_kb
531
583
  self.cc_graph = self.copy_graph(ail_graph)
532
584
  self.externs = self._collect_externs(ail_graph, variable_kb)
585
+ self.vvar_to_vvar = vvar2vvar
533
586
  return ail_graph
534
587
 
535
588
  def _analyze_for_data_refs(self):
@@ -660,6 +713,14 @@ class Clinic(Analysis):
660
713
  if self._func_graph.in_degree(node) == 0 and CFGBase._is_noop_block(
661
714
  self.project.arch, self.project.factory.block(node.addr, node.size)
662
715
  ):
716
+ if (node.addr, None) == self._entry_node_addr:
717
+ # this is the entry node. after removing this node, the new entry node will be its successor
718
+ if self._func_graph.out_degree[node] == 1:
719
+ succ = next(iter(self._func_graph.successors(node)))
720
+ self._entry_node_addr = succ.addr, None
721
+ else:
722
+ # we just don't remove this node...
723
+ continue
663
724
  self._func_graph.remove_node(node)
664
725
 
665
726
  @timethis
@@ -756,17 +817,21 @@ class Clinic(Analysis):
756
817
  )
757
818
  if callsite_ail_block is not None and callsite_ail_block.statements:
758
819
  last_stmt = callsite_ail_block.statements[-1]
759
- if isinstance(last_stmt, ailment.Stmt.Call) and last_stmt.ret_expr is None:
760
- if isinstance(cc.cc.RETURN_VAL, SimRegArg):
761
- reg_offset, reg_size = self.project.arch.registers[cc.cc.RETURN_VAL.reg_name]
762
- last_stmt.ret_expr = ailment.Expr.Register(
763
- None,
764
- None,
765
- reg_offset,
766
- reg_size * 8,
767
- ins_addr=callsite_ins_addr,
768
- reg_name=cc.cc.RETURN_VAL.reg_name,
769
- )
820
+ if (
821
+ isinstance(last_stmt, ailment.Stmt.Call)
822
+ and last_stmt.ret_expr is None
823
+ and isinstance(cc.cc.RETURN_VAL, SimRegArg)
824
+ ):
825
+ reg_offset, reg_size = self.project.arch.registers[cc.cc.RETURN_VAL.reg_name]
826
+ last_stmt.ret_expr = ailment.Expr.Register(
827
+ None,
828
+ None,
829
+ reg_offset,
830
+ reg_size * 8,
831
+ ins_addr=callsite_ins_addr,
832
+ reg_name=cc.cc.RETURN_VAL.reg_name,
833
+ )
834
+ last_stmt.bits = reg_size * 8
770
835
 
771
836
  # finally, recover the calling convention of the current function
772
837
  if self.function.prototype is None or self.function.calling_convention is None:
@@ -862,11 +927,9 @@ class Clinic(Analysis):
862
927
  ins_addr=block_node.addr,
863
928
  )
864
929
  ]
865
- ail_block = ailment.Block(block_node.addr, block_node.size, statements=statements)
866
- return ail_block
930
+ return ailment.Block(block_node.addr, block_node.size, statements=statements)
867
931
 
868
- ail_block = ailment.IRSBConverter.convert(block.vex, self._ail_manager)
869
- return ail_block
932
+ return ailment.IRSBConverter.convert(block.vex, self._ail_manager)
870
933
 
871
934
  @timethis
872
935
  def _replace_single_target_indirect_transitions(self, ail_graph: networkx.DiGraph) -> networkx.DiGraph:
@@ -965,8 +1028,7 @@ class Clinic(Analysis):
965
1028
 
966
1029
  @timethis
967
1030
  def _make_ailgraph(self) -> networkx.DiGraph:
968
- graph = self._function_graph_to_ail_graph(self._func_graph)
969
- return graph
1031
+ return self._function_graph_to_ail_graph(self._func_graph)
970
1032
 
971
1033
  @timethis
972
1034
  def _simplify_blocks(
@@ -1055,6 +1117,8 @@ class Clinic(Analysis):
1055
1117
  only_consts=False,
1056
1118
  fold_callexprs_into_conditions=False,
1057
1119
  rewrite_ccalls=True,
1120
+ removed_vvar_ids: set[int] | None = None,
1121
+ arg_vvars: dict[int, tuple[ailment.Expr.VirtualVariable, SimVariable]] | None = None,
1058
1122
  ) -> None:
1059
1123
  """
1060
1124
  Simplify the entire function until it reaches a fixed point.
@@ -1071,6 +1135,8 @@ class Clinic(Analysis):
1071
1135
  only_consts=only_consts,
1072
1136
  fold_callexprs_into_conditions=fold_callexprs_into_conditions,
1073
1137
  rewrite_ccalls=rewrite_ccalls,
1138
+ removed_vvar_ids=removed_vvar_ids,
1139
+ arg_vvars=arg_vvars,
1074
1140
  )
1075
1141
  if not simplified:
1076
1142
  break
@@ -1086,6 +1152,8 @@ class Clinic(Analysis):
1086
1152
  only_consts=False,
1087
1153
  fold_callexprs_into_conditions=False,
1088
1154
  rewrite_ccalls=True,
1155
+ removed_vvar_ids: set[int] | None = None,
1156
+ arg_vvars: dict[int, tuple[ailment.Expr.VirtualVariable, SimVariable]] | None = None,
1089
1157
  ):
1090
1158
  """
1091
1159
  Simplify the entire function once.
@@ -1106,6 +1174,8 @@ class Clinic(Analysis):
1106
1174
  fold_callexprs_into_conditions=fold_callexprs_into_conditions,
1107
1175
  use_callee_saved_regs_at_return=not self._register_save_areas_removed,
1108
1176
  rewrite_ccalls=rewrite_ccalls,
1177
+ removed_vvar_ids=removed_vvar_ids,
1178
+ arg_vvars=arg_vvars,
1109
1179
  )
1110
1180
  # cache the simplifier's RDA analysis
1111
1181
  self.reaching_definitions = simp._reaching_definitions
@@ -1133,7 +1203,7 @@ class Clinic(Analysis):
1133
1203
 
1134
1204
  # Run each pass
1135
1205
  for pass_ in self._optimization_passes:
1136
- if pass_.STAGE != stage:
1206
+ if stage != pass_.STAGE:
1137
1207
  continue
1138
1208
 
1139
1209
  if pass_ in DUPLICATING_OPTS + CONDENSING_OPTS and self.unoptimized_graph is None:
@@ -1141,12 +1211,14 @@ class Clinic(Analysis):
1141
1211
  # of the graph is applied
1142
1212
  self.unoptimized_graph = self._copy_graph(ail_graph)
1143
1213
 
1214
+ pass_ = timethis(pass_)
1144
1215
  a = pass_(
1145
1216
  self.function,
1146
1217
  blocks_by_addr=addr_to_blocks,
1147
1218
  blocks_by_addr_and_idx=addr_and_idx_to_blocks,
1148
1219
  graph=ail_graph,
1149
1220
  variable_kb=variable_kb,
1221
+ vvar_id_start=self.vvar_id_start,
1150
1222
  **kwargs,
1151
1223
  )
1152
1224
  if a.out_graph:
@@ -1157,9 +1229,107 @@ class Clinic(Analysis):
1157
1229
  self._register_save_areas_removed = True
1158
1230
  # clear the cached RDA result
1159
1231
  self.reaching_definitions = None
1232
+ self.vvar_id_start = a.vvar_id_start
1233
+
1234
+ return ail_graph
1235
+
1236
+ @timethis
1237
+ def _create_argument_accessing_statements(
1238
+ self,
1239
+ arg_list: list[SimVariable],
1240
+ ail_graph: networkx.DiGraph,
1241
+ arg_vvars: dict[int, tuple[ailment.Expr.VirtualVariable, SimVariable]],
1242
+ ) -> networkx.DiGraph:
1243
+ entrypoint = next(iter(bb for bb in ail_graph if (bb.addr, bb.idx) == self._entry_node_addr))
1244
+ new_stmts = []
1245
+ for arg in arg_list:
1246
+ if not isinstance(arg, SimRegisterVariable):
1247
+ continue
1248
+
1249
+ # get the full register if needed
1250
+ basereg_offset, basereg_size = self.project.arch.get_base_register(arg.reg, size=arg.size)
1251
+
1252
+ arg_vvar = ailment.Expr.VirtualVariable(
1253
+ self._ail_manager.next_atom(),
1254
+ self.vvar_id_start,
1255
+ arg.bits,
1256
+ ailment.Expr.VirtualVariableCategory.PARAMETER,
1257
+ oident=arg.reg,
1258
+ ins_addr=self.function.addr,
1259
+ )
1260
+ self.vvar_id_start += 1
1261
+ arg_vvars[arg_vvar.varid] = arg_vvar, arg
1262
+
1263
+ if basereg_size != arg.size:
1264
+ # extend the value to the full register
1265
+ arg_vvar = ailment.Expr.Convert(
1266
+ self._ail_manager.next_atom(),
1267
+ arg.size * self.project.arch.byte_width,
1268
+ basereg_size * self.project.arch.byte_width,
1269
+ False,
1270
+ arg_vvar,
1271
+ ins_addr=self.function.addr,
1272
+ )
1273
+
1274
+ fullreg_dst = ailment.Expr.Register(
1275
+ self._ail_manager.next_atom(),
1276
+ None,
1277
+ basereg_offset,
1278
+ basereg_size * self.project.arch.byte_width,
1279
+ ins_addr=self.function.addr,
1280
+ )
1281
+ stmt = ailment.Stmt.Assignment(
1282
+ self._ail_manager.next_atom(),
1283
+ fullreg_dst,
1284
+ arg_vvar,
1285
+ ins_addr=self.function.addr,
1286
+ )
1287
+ new_stmts.append(stmt)
1160
1288
 
1289
+ non_label_stmt_idx = first_nonlabel_statement_id(entrypoint)
1290
+ # update the ail block in-place
1291
+ entrypoint.statements = (
1292
+ entrypoint.statements[:non_label_stmt_idx] + new_stmts + entrypoint.statements[non_label_stmt_idx:]
1293
+ )
1161
1294
  return ail_graph
1162
1295
 
1296
+ @timethis
1297
+ def _transform_to_ssa_level0(self, ail_graph: networkx.DiGraph) -> networkx.DiGraph:
1298
+ ssailification = self.project.analyses.Ssailification(
1299
+ self.function,
1300
+ ail_graph,
1301
+ entry=next(iter(bb for bb in ail_graph if (bb.addr, bb.idx) == self._entry_node_addr)),
1302
+ ail_manager=self._ail_manager,
1303
+ ssa_stackvars=False,
1304
+ vvar_id_start=self.vvar_id_start,
1305
+ )
1306
+ self.vvar_id_start = ssailification.max_vvar_id + 1
1307
+ return ssailification.out_graph
1308
+
1309
+ @timethis
1310
+ def _transform_to_ssa_level1(self, ail_graph: networkx.DiGraph) -> networkx.DiGraph:
1311
+ ssailification = self.project.analyses.Ssailification(
1312
+ self.function,
1313
+ ail_graph,
1314
+ entry=next(iter(bb for bb in ail_graph if (bb.addr, bb.idx) == self._entry_node_addr)),
1315
+ ail_manager=self._ail_manager,
1316
+ ssa_stackvars=True,
1317
+ vvar_id_start=self.vvar_id_start,
1318
+ )
1319
+ self.vvar_id_start = ssailification.max_vvar_id + 1
1320
+ return ssailification.out_graph
1321
+
1322
+ @timethis
1323
+ def _collect_dephi_vvar_mapping_and_rewrite_blocks(self, ail_graph: networkx.DiGraph) -> dict[int, int]:
1324
+ dephication = self.project.analyses.GraphDephicationVVarMapping(
1325
+ self.function,
1326
+ ail_graph,
1327
+ entry=next(iter(bb for bb in ail_graph if (bb.addr, bb.idx) == self._entry_node_addr)),
1328
+ vvar_id_start=self.vvar_id_start,
1329
+ )
1330
+ self.vvar_id_start = dephication.vvar_id_start + 1
1331
+ return dephication.vvar_to_vvar_mapping
1332
+
1163
1333
  @timethis
1164
1334
  def _make_argument_list(self) -> list[SimVariable]:
1165
1335
  if self.function.calling_convention is not None and self.function.prototype is not None:
@@ -1185,15 +1355,13 @@ class Clinic(Analysis):
1185
1355
  name=arg_names[idx],
1186
1356
  region=self.function.addr,
1187
1357
  )
1188
- elif isinstance(arg, SimStructArg):
1358
+ else:
1189
1359
  argvar = SimVariable(
1190
1360
  ident="arg_%d" % idx,
1191
1361
  name=arg_names[idx],
1192
1362
  region=self.function.addr,
1193
1363
  size=arg.size,
1194
1364
  )
1195
- else:
1196
- raise TypeError("Unsupported function argument type %s." % type(arg))
1197
1365
  arg_vars.append(argvar)
1198
1366
  return arg_vars
1199
1367
  return []
@@ -1202,20 +1370,18 @@ class Clinic(Analysis):
1202
1370
  def _make_callsites(self, ail_graph, stack_pointer_tracker=None):
1203
1371
  """
1204
1372
  Simplify all function call statements.
1205
-
1206
- :return: None
1207
1373
  """
1208
1374
 
1209
1375
  # Computing reaching definitions
1210
- rd = self.project.analyses.ReachingDefinitions(
1376
+ rd = self.project.analyses.SReachingDefinitions(
1211
1377
  subject=self.function,
1212
1378
  func_graph=ail_graph,
1213
- observe_callback=self._make_callsites_rd_observe_callback,
1214
- use_callee_saved_regs_at_return=not self._register_save_areas_removed,
1379
+ # use_callee_saved_regs_at_return=not self._register_save_areas_removed, FIXME
1215
1380
  )
1216
1381
 
1217
1382
  class TempClass: # pylint:disable=missing-class-docstring
1218
1383
  stack_arg_offsets = set()
1384
+ removed_vvar_ids = set()
1219
1385
 
1220
1386
  def _handler(block):
1221
1387
  csm = self.project.analyses.AILCallSiteMaker(
@@ -1226,35 +1392,30 @@ class Clinic(Analysis):
1226
1392
  )
1227
1393
  if csm.stack_arg_offsets is not None:
1228
1394
  TempClass.stack_arg_offsets |= csm.stack_arg_offsets
1229
- if csm.result_block:
1230
- if csm.result_block != block:
1231
- ail_block = csm.result_block
1232
- simp = self.project.analyses.AILBlockSimplifier(
1233
- ail_block,
1234
- self.function.addr,
1235
- stack_pointer_tracker=stack_pointer_tracker,
1236
- peephole_optimizations=self.peephole_optimizations,
1237
- stack_arg_offsets=csm.stack_arg_offsets,
1238
- )
1239
- return simp.result_block
1395
+ if csm.removed_vvar_ids:
1396
+ TempClass.removed_vvar_ids |= csm.removed_vvar_ids
1397
+ if csm.result_block and csm.result_block != block:
1398
+ ail_block = csm.result_block
1399
+ simp = self.project.analyses.AILBlockSimplifier(
1400
+ ail_block,
1401
+ self.function.addr,
1402
+ stack_pointer_tracker=stack_pointer_tracker,
1403
+ peephole_optimizations=self.peephole_optimizations,
1404
+ )
1405
+ return simp.result_block
1240
1406
  return None
1241
1407
 
1242
1408
  # rewriting call-sites at this point, pre-inlining, causes issues with incorrect call signatures
1243
1409
  if not self._inlining_parents:
1244
1410
  AILGraphWalker(ail_graph, _handler, replace_nodes=True).walk()
1245
1411
 
1246
- return ail_graph, TempClass.stack_arg_offsets
1412
+ return ail_graph, TempClass.stack_arg_offsets, TempClass.removed_vvar_ids
1247
1413
 
1248
1414
  @timethis
1249
1415
  def _make_returns(self, ail_graph: networkx.DiGraph) -> networkx.DiGraph:
1250
1416
  """
1251
1417
  Work on each return statement and fill in its return expressions.
1252
1418
  """
1253
- if self._inlining_parents:
1254
- # for inlining, we want to keep the return statement separate from the return value, so that
1255
- # the former can be removed while preserving the latter
1256
- return ail_graph
1257
-
1258
1419
  if self.function.calling_convention is None:
1259
1420
  # unknown calling convention. cannot do much about return expressions.
1260
1421
  return ail_graph
@@ -1309,7 +1470,13 @@ class Clinic(Analysis):
1309
1470
  self.function.is_prototype_guessed = False
1310
1471
 
1311
1472
  @timethis
1312
- def _recover_and_link_variables(self, ail_graph, arg_list):
1473
+ def _recover_and_link_variables(
1474
+ self,
1475
+ ail_graph,
1476
+ arg_list: list,
1477
+ arg_vvars: dict[int, tuple[ailment.Expr.VirtualVariable, SimVariable]],
1478
+ vvar2vvar: dict[int, int],
1479
+ ):
1313
1480
  # variable recovery
1314
1481
  tmp_kb = KnowledgeBase(self.project) if self.variable_kb is None else self.variable_kb
1315
1482
  tmp_kb.functions = self.kb.functions
@@ -1320,6 +1487,8 @@ class Clinic(Analysis):
1320
1487
  track_sp=False,
1321
1488
  func_args=arg_list,
1322
1489
  unify_variables=False,
1490
+ func_arg_vvars=arg_vvars,
1491
+ vvar_to_vvar=vvar2vvar,
1323
1492
  )
1324
1493
  # get ground-truth types
1325
1494
  var_manager = tmp_kb.variables[self.function.addr]
@@ -1382,6 +1551,7 @@ class Clinic(Analysis):
1382
1551
  labels=self.kb.labels,
1383
1552
  arg_names=self.function.prototype.arg_names if self.function.prototype else None,
1384
1553
  reset=self._reset_variable_names,
1554
+ func_blocks=list(ail_graph),
1385
1555
  )
1386
1556
 
1387
1557
  # Link variables to each statement
@@ -1406,6 +1576,14 @@ class Clinic(Analysis):
1406
1576
  offset = var.offset
1407
1577
  if offset in variable_manager.stack_offset_to_struct_member_info:
1408
1578
  stmt.tags["struct_member_info"] = variable_manager.stack_offset_to_struct_member_info[offset]
1579
+ elif (
1580
+ isinstance(stmt, ailment.Stmt.Assignment)
1581
+ and isinstance(stmt.dst, ailment.Expr.VirtualVariable)
1582
+ and stmt.dst.was_stack
1583
+ ):
1584
+ offset = stmt.dst.stack_offset
1585
+ if offset in variable_manager.stack_offset_to_struct_member_info:
1586
+ stmt.dst.tags["struct_member_info"] = variable_manager.stack_offset_to_struct_member_info[offset]
1409
1587
 
1410
1588
  def _link_variables_on_block(self, block, kb):
1411
1589
  """
@@ -1499,6 +1677,13 @@ class Clinic(Analysis):
1499
1677
  expr.variable = reg_var
1500
1678
  expr.variable_offset = offset
1501
1679
 
1680
+ elif type(expr) is ailment.Expr.VirtualVariable:
1681
+ vars_ = variable_manager.find_variables_by_atom(block.addr, stmt_idx, expr, block_idx=block.idx)
1682
+ if len(vars_) >= 1:
1683
+ var, offset = next(iter(vars_))
1684
+ expr.variable = var
1685
+ expr.variable_offset = offset
1686
+
1502
1687
  elif type(expr) is ailment.Expr.Load:
1503
1688
  variables = variable_manager.find_variables_by_atom(block.addr, stmt_idx, expr, block_idx=block.idx)
1504
1689
  if len(variables) == 0:
@@ -1510,10 +1695,11 @@ class Clinic(Analysis):
1510
1695
  self._link_variables_on_expr(variable_manager, global_variables, block, stmt_idx, stmt, base_addr)
1511
1696
 
1512
1697
  # if we are accessing the variable directly (offset == 0), we link the variable onto this expression
1513
- if offset == 0 or (isinstance(offset, ailment.Expr.Const) and offset.value == 0):
1514
- if "reference_variable" in base_addr.tags:
1515
- expr.variable = base_addr.reference_variable
1516
- expr.variable_offset = base_addr.reference_variable_offset
1698
+ if (
1699
+ offset == 0 or (isinstance(offset, ailment.Expr.Const) and offset.value == 0)
1700
+ ) and "reference_variable" in base_addr.tags:
1701
+ expr.variable = base_addr.reference_variable
1702
+ expr.variable_offset = base_addr.reference_variable_offset
1517
1703
 
1518
1704
  if base_addr is None and offset is None:
1519
1705
  # this is a local variable
@@ -1588,17 +1774,16 @@ class Clinic(Analysis):
1588
1774
  else:
1589
1775
  # global variable?
1590
1776
  global_vars = global_variables.get_global_variables(expr.value)
1591
- if not global_vars:
1592
- # detect if there is a related symbol
1593
- if self.project.loader.find_object_containing(expr.value):
1594
- symbol = self.project.loader.find_symbol(expr.value)
1595
- if symbol is not None:
1596
- # Create a new global variable if there isn't one already
1597
- global_vars = global_variables.get_global_variables(symbol.rebased_addr)
1598
- if not global_vars:
1599
- global_var = SimMemoryVariable(symbol.rebased_addr, symbol.size, name=symbol.name)
1600
- global_variables.add_variable("global", global_var.addr, global_var)
1601
- global_vars = {global_var}
1777
+ # detect if there is a related symbol
1778
+ if not global_vars and self.project.loader.find_object_containing(expr.value):
1779
+ symbol = self.project.loader.find_symbol(expr.value)
1780
+ if symbol is not None:
1781
+ # Create a new global variable if there isn't one already
1782
+ global_vars = global_variables.get_global_variables(symbol.rebased_addr)
1783
+ if not global_vars:
1784
+ global_var = SimMemoryVariable(symbol.rebased_addr, symbol.size, name=symbol.name)
1785
+ global_variables.add_variable("global", global_var.addr, global_var)
1786
+ global_vars = {global_var}
1602
1787
  if global_vars:
1603
1788
  global_var = next(iter(global_vars))
1604
1789
  expr.tags["reference_variable"] = global_var
@@ -1611,21 +1796,30 @@ class Clinic(Analysis):
1611
1796
  if blocks_by_addr_and_size is None:
1612
1797
  blocks_by_addr_and_size = self._blocks_by_addr_and_size
1613
1798
 
1614
- node_to_block_mapping = {}
1615
1799
  graph = networkx.DiGraph()
1616
1800
 
1617
- for node in func_graph.nodes():
1618
- ail_block = blocks_by_addr_and_size.get((node.addr, node.size), node)
1619
- node_to_block_mapping[node] = ail_block
1620
-
1621
- if ail_block is not None:
1622
- graph.add_node(ail_block)
1623
-
1624
- for src_node, dst_node, data in func_graph.edges(data=True):
1625
- src = node_to_block_mapping[src_node]
1626
- dst = node_to_block_mapping[dst_node]
1801
+ entry_node = next(iter(node for node in func_graph if node.addr == self._entry_node_addr[0]), None)
1802
+ if entry_node is None:
1803
+ raise AngrDecompilationError(
1804
+ f"Entry node with address {self._entry_node_addr[0]:#x} not found in the function graph"
1805
+ )
1627
1806
 
1628
- if dst is not None:
1807
+ # add the entry node into the graph
1808
+ ail_block = blocks_by_addr_and_size.get((entry_node.addr, entry_node.size))
1809
+ if ail_block is None:
1810
+ raise AngrDecompilationError(f"AIL block at address {entry_node.addr:#x} not found")
1811
+ graph.add_node(ail_block)
1812
+
1813
+ # get all descendants and only include them in the AIL graph.
1814
+ # this way all unreachable blocks will be excluded from the AIL graph.
1815
+ descendants = networkx.descendants(func_graph, entry_node) | {entry_node}
1816
+ for src_node, dst_node, data in networkx.subgraph_view(
1817
+ func_graph, filter_node=lambda n: n in descendants
1818
+ ).edges(data=True):
1819
+ src = blocks_by_addr_and_size.get((src_node.addr, src_node.size))
1820
+ dst = blocks_by_addr_and_size.get((dst_node.addr, dst_node.size))
1821
+
1822
+ if src is not None and dst is not None:
1629
1823
  graph.add_edge(src, dst, **data)
1630
1824
 
1631
1825
  return graph
@@ -1638,9 +1832,12 @@ class Clinic(Analysis):
1638
1832
 
1639
1833
  ite_ins_addrs = []
1640
1834
  for stmt in block.statements:
1641
- if isinstance(stmt, ailment.Stmt.Assignment) and isinstance(stmt.src, ailment.Expr.ITE):
1642
- if stmt.ins_addr not in ite_ins_addrs:
1643
- ite_ins_addrs.append(stmt.ins_addr)
1835
+ if (
1836
+ isinstance(stmt, ailment.Stmt.Assignment)
1837
+ and isinstance(stmt.src, ailment.Expr.ITE)
1838
+ and stmt.ins_addr not in ite_ins_addrs
1839
+ ):
1840
+ ite_ins_addrs.append(stmt.ins_addr)
1644
1841
 
1645
1842
  if ite_ins_addrs:
1646
1843
  block_addr = block.addr
@@ -1968,31 +2165,22 @@ class Clinic(Analysis):
1968
2165
  def _next_atom(self) -> int:
1969
2166
  return self._ail_manager.next_atom()
1970
2167
 
1971
- @staticmethod
1972
- def _make_callsites_rd_observe_callback(ob_type, **kwargs):
1973
- if ob_type != "insn":
1974
- return False
1975
- stmt = kwargs.pop("stmt")
1976
- op_type = kwargs.pop("op_type")
1977
- return isinstance(stmt, ailment.Stmt.Call) and op_type == OP_BEFORE
1978
-
1979
2168
  def parse_variable_addr(self, addr: ailment.Expr.Expression) -> tuple[Any, Any] | None:
1980
2169
  if isinstance(addr, ailment.Expr.Const):
1981
2170
  return addr, 0
1982
- if isinstance(addr, ailment.Expr.BinaryOp):
1983
- if addr.op == "Add":
1984
- op0, op1 = addr.operands
1985
- if (
1986
- isinstance(op0, ailment.Expr.Const)
1987
- and self.project.loader.find_object_containing(op0.value) is not None
1988
- ):
1989
- return op0, op1
1990
- elif (
1991
- isinstance(op1, ailment.Expr.Const)
1992
- and self.project.loader.find_object_containing(op1.value) is not None
1993
- ):
1994
- return op1, op0
1995
- return op0, op1 # best-effort guess
2171
+ if isinstance(addr, ailment.Expr.BinaryOp) and addr.op == "Add":
2172
+ op0, op1 = addr.operands
2173
+ if (
2174
+ isinstance(op0, ailment.Expr.Const)
2175
+ and self.project.loader.find_object_containing(op0.value) is not None
2176
+ ):
2177
+ return op0, op1
2178
+ if (
2179
+ isinstance(op1, ailment.Expr.Const)
2180
+ and self.project.loader.find_object_containing(op1.value) is not None
2181
+ ):
2182
+ return op1, op0
2183
+ return op0, op1 # best-effort guess
1996
2184
  return None, None
1997
2185
 
1998
2186
  def new_block_addr(self) -> int:
@@ -2013,8 +2201,8 @@ class Clinic(Analysis):
2013
2201
  def remove_empty_nodes(graph: networkx.DiGraph) -> networkx.DiGraph:
2014
2202
  def handle_node(node: ailment.Block):
2015
2203
  if not node.statements:
2016
- preds = list(pred for pred in graph.predecessors(node) if pred is not node)
2017
- succs = list(succ for succ in graph.successors(node) if succ is not node)
2204
+ preds = [pred for pred in graph.predecessors(node) if pred is not node]
2205
+ succs = [succ for succ in graph.successors(node) if succ is not node]
2018
2206
  if len(preds) == 1 and len(succs) == 1:
2019
2207
  pred = preds[0]
2020
2208
  succ = succs[0]
@@ -2037,7 +2225,7 @@ class Clinic(Analysis):
2037
2225
 
2038
2226
  if value_updated:
2039
2227
  graph.add_edge(pred, succ)
2040
- raise RemoveNodeNotice()
2228
+ raise RemoveNodeNotice
2041
2229
  elif len(preds) >= 1 and len(succs) == 1:
2042
2230
  succ = succs[0]
2043
2231
  branch_updates = 0
@@ -2072,9 +2260,9 @@ class Clinic(Analysis):
2072
2260
  and last_stmt.false_target.value == node.addr
2073
2261
  ):
2074
2262
  last_stmt.false_target.value = succ.addr
2075
- raise RemoveNodeNotice()
2263
+ raise RemoveNodeNotice
2076
2264
  elif not preds or not succs:
2077
- raise RemoveNodeNotice()
2265
+ raise RemoveNodeNotice
2078
2266
 
2079
2267
  AILGraphWalker(graph, handle_node, replace_nodes=True).walk()
2080
2268
  return graph
@@ -2115,50 +2303,49 @@ class Clinic(Analysis):
2115
2303
  for node in ail_graph:
2116
2304
  if ail_graph.in_degree[node] == 2 and ail_graph.out_degree[node] == 2:
2117
2305
  succs = ail_graph.successors(node)
2118
- if node in succs:
2306
+ if node in succs and len(node.statements) >= 6:
2119
2307
  # self loop!
2120
- if len(node.statements) >= 6:
2121
- stmt0 = node.statements[1] # skip the LABEL statement
2122
- stmt1 = node.statements[2]
2123
- last_stmt = node.statements[-1]
2124
- if (
2308
+ stmt0 = node.statements[1] # skip the LABEL statement
2309
+ stmt1 = node.statements[2]
2310
+ last_stmt = node.statements[-1]
2311
+ if (
2312
+ (
2125
2313
  isinstance(stmt0, ailment.Stmt.Assignment)
2126
2314
  and isinstance(stmt0.dst, ailment.Expr.Register)
2127
2315
  and isinstance(stmt0.src, ailment.Expr.StackBaseOffset)
2128
2316
  and stmt0.src.offset == -0x1000
2129
- ):
2130
- if (
2131
- isinstance(stmt1, ailment.Stmt.Store)
2132
- and isinstance(stmt1.addr, ailment.Expr.StackBaseOffset)
2133
- and stmt1.addr.offset == -0x1000
2134
- and isinstance(stmt1.data, ailment.Expr.Load)
2135
- and isinstance(stmt1.data.addr, ailment.Expr.StackBaseOffset)
2136
- and stmt1.data.addr.offset == -0x1000
2137
- ):
2138
- if (
2139
- isinstance(last_stmt, ailment.Stmt.ConditionalJump)
2140
- and isinstance(last_stmt.condition, ailment.Expr.BinaryOp)
2141
- and last_stmt.condition.op == "CmpEQ"
2142
- and isinstance(last_stmt.condition.operands[0], ailment.Expr.StackBaseOffset)
2143
- and last_stmt.condition.operands[0].offset == -0x1000
2144
- and isinstance(last_stmt.condition.operands[1], ailment.Expr.Register)
2145
- and isinstance(last_stmt.false_target, ailment.Expr.Const)
2146
- and last_stmt.false_target.value == node.addr
2147
- ):
2148
- # found it!
2149
- alloca_node = node
2150
- sp_equal_to = ailment.Expr.BinaryOp(
2151
- None,
2152
- "Sub",
2153
- [
2154
- ailment.Expr.Register(
2155
- None, None, self.project.arch.sp_offset, self.project.arch.bits
2156
- ),
2157
- last_stmt.condition.operands[1],
2158
- ],
2159
- False,
2160
- )
2161
- break
2317
+ )
2318
+ and (
2319
+ isinstance(stmt1, ailment.Stmt.Store)
2320
+ and isinstance(stmt1.addr, ailment.Expr.StackBaseOffset)
2321
+ and stmt1.addr.offset == -0x1000
2322
+ and isinstance(stmt1.data, ailment.Expr.Load)
2323
+ and isinstance(stmt1.data.addr, ailment.Expr.StackBaseOffset)
2324
+ and stmt1.data.addr.offset == -0x1000
2325
+ )
2326
+ and (
2327
+ isinstance(last_stmt, ailment.Stmt.ConditionalJump)
2328
+ and isinstance(last_stmt.condition, ailment.Expr.BinaryOp)
2329
+ and last_stmt.condition.op == "CmpEQ"
2330
+ and isinstance(last_stmt.condition.operands[0], ailment.Expr.StackBaseOffset)
2331
+ and last_stmt.condition.operands[0].offset == -0x1000
2332
+ and isinstance(last_stmt.condition.operands[1], ailment.Expr.Register)
2333
+ and isinstance(last_stmt.false_target, ailment.Expr.Const)
2334
+ and last_stmt.false_target.value == node.addr
2335
+ )
2336
+ ):
2337
+ # found it!
2338
+ alloca_node = node
2339
+ sp_equal_to = ailment.Expr.BinaryOp(
2340
+ None,
2341
+ "Sub",
2342
+ [
2343
+ ailment.Expr.Register(None, None, self.project.arch.sp_offset, self.project.arch.bits),
2344
+ last_stmt.condition.operands[1],
2345
+ ],
2346
+ False,
2347
+ )
2348
+ break
2162
2349
 
2163
2350
  if alloca_node is not None:
2164
2351
  stmt0 = alloca_node.statements[1]