svf-tools 1.0.876 → 1.0.877
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.
- package/README.md +1 -1
- package/SVF-doxygen/html/AbstractExecution_8cpp.html +218 -0
- package/SVF-doxygen/html/AbstractExecution_8cpp_source.html +2124 -0
- package/SVF-doxygen/html/AbstractExecution_8h.html +118 -0
- package/SVF-doxygen/html/AbstractExecution_8h_source.html +512 -0
- package/SVF-doxygen/html/BufOverflowChecker_8cpp_source.html +81 -81
- package/SVF-doxygen/html/BufOverflowChecker_8h.html +1 -1
- package/SVF-doxygen/html/BufOverflowChecker_8h_source.html +20 -20
- package/SVF-doxygen/html/CFBasicBlockGBuilder_8cpp_source.html +3 -3
- package/SVF-doxygen/html/CFBasicBlockGBuilder_8h_source.html +1 -1
- package/SVF-doxygen/html/CFBasicBlockGWTO_8h_source.html +2 -2
- package/SVF-doxygen/html/CFBasicBlockG_8h_source.html +318 -367
- package/SVF-doxygen/html/ae_8cpp.html +7 -7
- package/SVF-doxygen/html/ae_8cpp_source.html +7 -7
- package/SVF-doxygen/html/annotated.html +12 -12
- package/SVF-doxygen/html/classSVF_1_1AEAPI-members.html +2 -2
- package/SVF-doxygen/html/classSVF_1_1AEAPI.html +145 -145
- package/SVF-doxygen/html/classSVF_1_1AEStat-members.html +2 -2
- package/SVF-doxygen/html/classSVF_1_1AEStat.html +53 -53
- package/SVF-doxygen/html/classSVF_1_1AbstractExecution-members.html +137 -0
- package/SVF-doxygen/html/classSVF_1_1AbstractExecution.html +2884 -0
- package/SVF-doxygen/html/classSVF_1_1AbstractExecution.png +0 -0
- package/SVF-doxygen/html/classSVF_1_1BufOverflowChecker-members.html +50 -50
- package/SVF-doxygen/html/classSVF_1_1BufOverflowChecker.html +117 -117
- package/SVF-doxygen/html/classSVF_1_1BufOverflowChecker.png +0 -0
- package/SVF-doxygen/html/classSVF_1_1BufOverflowCheckerAPI-members.html +3 -3
- package/SVF-doxygen/html/classSVF_1_1BufOverflowCheckerAPI.html +38 -38
- package/SVF-doxygen/html/classSVF_1_1CFBasicBlockGBuilder.html +2 -2
- package/SVF-doxygen/html/classSVF_1_1CFBasicBlockGWTO.html +1 -1
- package/SVF-doxygen/html/classSVF_1_1CFBasicBlockGraph.html +92 -92
- package/SVF-doxygen/html/classSVF_1_1CFBasicBlockNode-members.html +8 -8
- package/SVF-doxygen/html/classSVF_1_1CFBasicBlockNode.html +51 -309
- package/SVF-doxygen/html/classSVF_1_1GenericNode.html +8 -8
- package/SVF-doxygen/html/classes.html +16 -16
- package/SVF-doxygen/html/dir_81caa96ab1d3de93b353e2bbe80e6067.html +1 -1
- package/SVF-doxygen/html/dir_fbec400583b4bd6c5f2e89c86c5943a6.html +1 -1
- package/SVF-doxygen/html/files.html +2 -2
- package/SVF-doxygen/html/functions.html +21 -21
- package/SVF-doxygen/html/functions_a.html +17 -17
- package/SVF-doxygen/html/functions_b.html +1 -1
- package/SVF-doxygen/html/functions_c.html +16 -16
- package/SVF-doxygen/html/functions_d.html +7 -11
- package/SVF-doxygen/html/functions_e.html +1 -1
- package/SVF-doxygen/html/functions_func.html +13 -13
- package/SVF-doxygen/html/functions_func_c.html +11 -11
- package/SVF-doxygen/html/functions_func_d.html +7 -11
- package/SVF-doxygen/html/functions_func_e.html +1 -1
- package/SVF-doxygen/html/functions_func_g.html +1 -1
- package/SVF-doxygen/html/functions_func_h.html +11 -11
- package/SVF-doxygen/html/functions_func_i.html +8 -8
- package/SVF-doxygen/html/functions_func_m.html +1 -1
- package/SVF-doxygen/html/functions_func_n.html +1 -1
- package/SVF-doxygen/html/functions_func_r.html +2 -2
- package/SVF-doxygen/html/functions_func_s.html +2 -2
- package/SVF-doxygen/html/functions_func_w.html +1 -1
- package/SVF-doxygen/html/functions_func_~.html +3 -3
- package/SVF-doxygen/html/functions_g.html +1 -1
- package/SVF-doxygen/html/functions_h.html +11 -11
- package/SVF-doxygen/html/functions_i.html +8 -8
- package/SVF-doxygen/html/functions_m.html +1 -1
- package/SVF-doxygen/html/functions_n.html +1 -1
- package/SVF-doxygen/html/functions_p.html +7 -7
- package/SVF-doxygen/html/functions_r.html +6 -8
- package/SVF-doxygen/html/functions_rela.html +2 -2
- package/SVF-doxygen/html/functions_s.html +10 -8
- package/SVF-doxygen/html/functions_t.html +7 -7
- package/SVF-doxygen/html/functions_type_c.html +1 -1
- package/SVF-doxygen/html/functions_v.html +1 -3
- package/SVF-doxygen/html/functions_vars.html +21 -21
- package/SVF-doxygen/html/functions_w.html +1 -1
- package/SVF-doxygen/html/functions_~.html +3 -3
- package/SVF-doxygen/html/globals.html +2 -2
- package/SVF-doxygen/html/globals_defs.html +1 -1
- package/SVF-doxygen/html/globals_s.html +1 -1
- package/SVF-doxygen/html/globals_vars.html +2 -2
- package/SVF-doxygen/html/hierarchy.html +12 -12
- package/SVF-doxygen/html/namespaceSVF.html +9 -9
- package/SVF-doxygen/html/search/all_0.js +21 -21
- package/SVF-doxygen/html/search/all_1.js +503 -502
- package/SVF-doxygen/html/search/all_10.js +325 -325
- package/SVF-doxygen/html/search/all_11.js +228 -228
- package/SVF-doxygen/html/search/all_12.js +569 -569
- package/SVF-doxygen/html/search/all_13.js +208 -208
- package/SVF-doxygen/html/search/all_14.js +69 -69
- package/SVF-doxygen/html/search/all_15.js +176 -176
- package/SVF-doxygen/html/search/all_16.js +78 -78
- package/SVF-doxygen/html/search/all_17.js +1 -1
- package/SVF-doxygen/html/search/all_18.js +1 -1
- package/SVF-doxygen/html/search/all_19.js +26 -26
- package/SVF-doxygen/html/search/all_1a.js +182 -182
- package/SVF-doxygen/html/search/all_2.js +182 -182
- package/SVF-doxygen/html/search/all_3.js +654 -654
- package/SVF-doxygen/html/search/all_4.js +237 -237
- package/SVF-doxygen/html/search/all_5.js +128 -128
- package/SVF-doxygen/html/search/all_6.js +232 -232
- package/SVF-doxygen/html/search/all_7.js +1060 -1060
- package/SVF-doxygen/html/search/all_8.js +217 -217
- package/SVF-doxygen/html/search/all_9.js +628 -628
- package/SVF-doxygen/html/search/all_a.js +46 -46
- package/SVF-doxygen/html/search/all_b.js +26 -26
- package/SVF-doxygen/html/search/all_c.js +115 -115
- package/SVF-doxygen/html/search/all_d.js +203 -203
- package/SVF-doxygen/html/search/all_e.js +209 -209
- package/SVF-doxygen/html/search/all_f.js +121 -121
- package/SVF-doxygen/html/search/classes_0.js +29 -29
- package/SVF-doxygen/html/search/classes_1.js +12 -12
- package/SVF-doxygen/html/search/classes_10.js +74 -74
- package/SVF-doxygen/html/search/classes_11.js +14 -14
- package/SVF-doxygen/html/search/classes_12.js +2 -2
- package/SVF-doxygen/html/search/classes_13.js +10 -10
- package/SVF-doxygen/html/search/classes_14.js +20 -20
- package/SVF-doxygen/html/search/classes_15.js +1 -1
- package/SVF-doxygen/html/search/classes_2.js +78 -78
- package/SVF-doxygen/html/search/classes_3.js +37 -37
- package/SVF-doxygen/html/search/classes_4.js +9 -9
- package/SVF-doxygen/html/search/classes_5.js +28 -28
- package/SVF-doxygen/html/search/classes_6.js +104 -104
- package/SVF-doxygen/html/search/classes_7.js +38 -38
- package/SVF-doxygen/html/search/classes_8.js +58 -58
- package/SVF-doxygen/html/search/classes_9.js +1 -1
- package/SVF-doxygen/html/search/classes_a.js +12 -12
- package/SVF-doxygen/html/search/classes_b.js +29 -29
- package/SVF-doxygen/html/search/classes_c.js +6 -6
- package/SVF-doxygen/html/search/classes_d.js +19 -19
- package/SVF-doxygen/html/search/classes_e.js +36 -36
- package/SVF-doxygen/html/search/classes_f.js +25 -25
- package/SVF-doxygen/html/search/defines_0.js +3 -3
- package/SVF-doxygen/html/search/defines_1.js +3 -3
- package/SVF-doxygen/html/search/defines_10.js +2 -2
- package/SVF-doxygen/html/search/defines_2.js +30 -30
- package/SVF-doxygen/html/search/defines_3.js +20 -20
- package/SVF-doxygen/html/search/defines_4.js +3 -3
- package/SVF-doxygen/html/search/defines_5.js +4 -4
- package/SVF-doxygen/html/search/defines_6.js +2 -2
- package/SVF-doxygen/html/search/defines_7.js +5 -5
- package/SVF-doxygen/html/search/defines_8.js +11 -11
- package/SVF-doxygen/html/search/defines_9.js +9 -9
- package/SVF-doxygen/html/search/defines_a.js +2 -2
- package/SVF-doxygen/html/search/defines_b.js +1 -1
- package/SVF-doxygen/html/search/defines_c.js +4 -4
- package/SVF-doxygen/html/search/defines_d.js +2 -2
- package/SVF-doxygen/html/search/defines_e.js +8 -8
- package/SVF-doxygen/html/search/defines_f.js +4 -4
- package/SVF-doxygen/html/search/enums_0.js +4 -4
- package/SVF-doxygen/html/search/enums_1.js +2 -2
- package/SVF-doxygen/html/search/enums_10.js +1 -1
- package/SVF-doxygen/html/search/enums_11.js +1 -1
- package/SVF-doxygen/html/search/enums_2.js +8 -8
- package/SVF-doxygen/html/search/enums_3.js +1 -1
- package/SVF-doxygen/html/search/enums_4.js +4 -4
- package/SVF-doxygen/html/search/enums_5.js +1 -1
- package/SVF-doxygen/html/search/enums_6.js +2 -2
- package/SVF-doxygen/html/search/enums_7.js +2 -2
- package/SVF-doxygen/html/search/enums_8.js +4 -4
- package/SVF-doxygen/html/search/enums_9.js +1 -1
- package/SVF-doxygen/html/search/enums_a.js +1 -1
- package/SVF-doxygen/html/search/enums_b.js +7 -7
- package/SVF-doxygen/html/search/enums_c.js +1 -1
- package/SVF-doxygen/html/search/enums_d.js +4 -4
- package/SVF-doxygen/html/search/enums_e.js +2 -2
- package/SVF-doxygen/html/search/enums_f.js +4 -4
- package/SVF-doxygen/html/search/enumvalues_0.js +15 -15
- package/SVF-doxygen/html/search/enumvalues_1.js +15 -15
- package/SVF-doxygen/html/search/enumvalues_10.js +35 -35
- package/SVF-doxygen/html/search/enumvalues_11.js +4 -4
- package/SVF-doxygen/html/search/enumvalues_12.js +10 -10
- package/SVF-doxygen/html/search/enumvalues_13.js +1 -1
- package/SVF-doxygen/html/search/enumvalues_14.js +1 -1
- package/SVF-doxygen/html/search/enumvalues_15.js +3 -3
- package/SVF-doxygen/html/search/enumvalues_2.js +36 -36
- package/SVF-doxygen/html/search/enumvalues_3.js +13 -13
- package/SVF-doxygen/html/search/enumvalues_4.js +2 -2
- package/SVF-doxygen/html/search/enumvalues_5.js +47 -47
- package/SVF-doxygen/html/search/enumvalues_6.js +6 -6
- package/SVF-doxygen/html/search/enumvalues_7.js +8 -8
- package/SVF-doxygen/html/search/enumvalues_8.js +23 -23
- package/SVF-doxygen/html/search/enumvalues_9.js +6 -6
- package/SVF-doxygen/html/search/enumvalues_a.js +17 -17
- package/SVF-doxygen/html/search/enumvalues_b.js +11 -11
- package/SVF-doxygen/html/search/enumvalues_c.js +5 -5
- package/SVF-doxygen/html/search/enumvalues_d.js +18 -18
- package/SVF-doxygen/html/search/enumvalues_e.js +9 -9
- package/SVF-doxygen/html/search/enumvalues_f.js +47 -47
- package/SVF-doxygen/html/search/files_0.js +16 -15
- package/SVF-doxygen/html/search/files_1.js +9 -9
- package/SVF-doxygen/html/search/files_10.js +8 -8
- package/SVF-doxygen/html/search/files_11.js +8 -8
- package/SVF-doxygen/html/search/files_12.js +2 -2
- package/SVF-doxygen/html/search/files_2.js +58 -58
- package/SVF-doxygen/html/search/files_3.js +14 -14
- package/SVF-doxygen/html/search/files_4.js +5 -5
- package/SVF-doxygen/html/search/files_5.js +13 -13
- package/SVF-doxygen/html/search/files_6.js +10 -10
- package/SVF-doxygen/html/search/files_7.js +15 -15
- package/SVF-doxygen/html/search/files_8.js +13 -13
- package/SVF-doxygen/html/search/files_9.js +18 -18
- package/SVF-doxygen/html/search/files_a.js +3 -3
- package/SVF-doxygen/html/search/files_b.js +4 -4
- package/SVF-doxygen/html/search/files_c.js +20 -20
- package/SVF-doxygen/html/search/files_d.js +4 -4
- package/SVF-doxygen/html/search/files_e.js +62 -62
- package/SVF-doxygen/html/search/files_f.js +8 -8
- package/SVF-doxygen/html/search/functions_0.js +13 -13
- package/SVF-doxygen/html/search/functions_1.js +374 -374
- package/SVF-doxygen/html/search/functions_10.js +140 -140
- package/SVF-doxygen/html/search/functions_11.js +142 -142
- package/SVF-doxygen/html/search/functions_12.js +298 -298
- package/SVF-doxygen/html/search/functions_13.js +74 -74
- package/SVF-doxygen/html/search/functions_14.js +40 -40
- package/SVF-doxygen/html/search/functions_15.js +72 -72
- package/SVF-doxygen/html/search/functions_16.js +38 -38
- package/SVF-doxygen/html/search/functions_17.js +3 -3
- package/SVF-doxygen/html/search/functions_18.js +182 -182
- package/SVF-doxygen/html/search/functions_2.js +95 -95
- package/SVF-doxygen/html/search/functions_3.js +266 -266
- package/SVF-doxygen/html/search/functions_4.js +84 -84
- package/SVF-doxygen/html/search/functions_5.js +57 -57
- package/SVF-doxygen/html/search/functions_6.js +65 -65
- package/SVF-doxygen/html/search/functions_7.js +867 -867
- package/SVF-doxygen/html/search/functions_8.js +164 -164
- package/SVF-doxygen/html/search/functions_9.js +440 -440
- package/SVF-doxygen/html/search/functions_a.js +30 -30
- package/SVF-doxygen/html/search/functions_b.js +2 -2
- package/SVF-doxygen/html/search/functions_c.js +25 -25
- package/SVF-doxygen/html/search/functions_d.js +81 -81
- package/SVF-doxygen/html/search/functions_e.js +36 -36
- package/SVF-doxygen/html/search/functions_f.js +58 -58
- package/SVF-doxygen/html/search/namespaces_0.js +1 -1
- package/SVF-doxygen/html/search/namespaces_1.js +7 -7
- package/SVF-doxygen/html/search/related_0.js +4 -4
- package/SVF-doxygen/html/search/related_1.js +2 -2
- package/SVF-doxygen/html/search/related_2.js +3 -3
- package/SVF-doxygen/html/search/related_3.js +2 -2
- package/SVF-doxygen/html/search/related_4.js +2 -2
- package/SVF-doxygen/html/search/related_5.js +1 -1
- package/SVF-doxygen/html/search/related_6.js +2 -2
- package/SVF-doxygen/html/search/related_7.js +4 -4
- package/SVF-doxygen/html/search/related_8.js +2 -2
- package/SVF-doxygen/html/search/related_9.js +4 -4
- package/SVF-doxygen/html/search/related_a.js +19 -19
- package/SVF-doxygen/html/search/related_b.js +4 -4
- package/SVF-doxygen/html/search/related_c.js +2 -2
- package/SVF-doxygen/html/search/related_d.js +12 -12
- package/SVF-doxygen/html/search/related_e.js +2 -2
- package/SVF-doxygen/html/search/related_f.js +2 -2
- package/SVF-doxygen/html/search/typedefs_0.js +20 -20
- package/SVF-doxygen/html/search/typedefs_1.js +27 -27
- package/SVF-doxygen/html/search/typedefs_10.js +63 -63
- package/SVF-doxygen/html/search/typedefs_11.js +13 -13
- package/SVF-doxygen/html/search/typedefs_12.js +11 -11
- package/SVF-doxygen/html/search/typedefs_13.js +40 -40
- package/SVF-doxygen/html/search/typedefs_14.js +11 -11
- package/SVF-doxygen/html/search/typedefs_2.js +129 -129
- package/SVF-doxygen/html/search/typedefs_3.js +39 -39
- package/SVF-doxygen/html/search/typedefs_4.js +18 -18
- package/SVF-doxygen/html/search/typedefs_5.js +42 -42
- package/SVF-doxygen/html/search/typedefs_6.js +57 -57
- package/SVF-doxygen/html/search/typedefs_7.js +47 -47
- package/SVF-doxygen/html/search/typedefs_8.js +1 -1
- package/SVF-doxygen/html/search/typedefs_9.js +6 -6
- package/SVF-doxygen/html/search/typedefs_a.js +29 -29
- package/SVF-doxygen/html/search/typedefs_b.js +29 -29
- package/SVF-doxygen/html/search/typedefs_c.js +41 -41
- package/SVF-doxygen/html/search/typedefs_d.js +14 -14
- package/SVF-doxygen/html/search/typedefs_e.js +52 -52
- package/SVF-doxygen/html/search/typedefs_f.js +14 -14
- package/SVF-doxygen/html/search/variables_0.js +182 -182
- package/SVF-doxygen/html/search/variables_1.js +76 -76
- package/SVF-doxygen/html/search/variables_10.js +98 -98
- package/SVF-doxygen/html/search/variables_11.js +46 -46
- package/SVF-doxygen/html/search/variables_12.js +93 -93
- package/SVF-doxygen/html/search/variables_13.js +76 -76
- package/SVF-doxygen/html/search/variables_14.js +14 -14
- package/SVF-doxygen/html/search/variables_15.js +49 -49
- package/SVF-doxygen/html/search/variables_16.js +11 -11
- package/SVF-doxygen/html/search/variables_17.js +1 -1
- package/SVF-doxygen/html/search/variables_18.js +17 -17
- package/SVF-doxygen/html/search/variables_2.js +41 -41
- package/SVF-doxygen/html/search/variables_3.js +142 -142
- package/SVF-doxygen/html/search/variables_4.js +51 -51
- package/SVF-doxygen/html/search/variables_5.js +39 -39
- package/SVF-doxygen/html/search/variables_6.js +66 -66
- package/SVF-doxygen/html/search/variables_7.js +34 -34
- package/SVF-doxygen/html/search/variables_8.js +8 -8
- package/SVF-doxygen/html/search/variables_9.js +78 -78
- package/SVF-doxygen/html/search/variables_a.js +4 -4
- package/SVF-doxygen/html/search/variables_b.js +10 -10
- package/SVF-doxygen/html/search/variables_c.js +45 -45
- package/SVF-doxygen/html/search/variables_d.js +57 -57
- package/SVF-doxygen/html/search/variables_e.js +123 -123
- package/SVF-doxygen/html/search/variables_f.js +31 -31
- package/SVF-doxygen/html/structSVF_1_1DOTGraphTraits_3_01SVF_1_1CFBasicBlockGraph_01_5_01_4.html +102 -102
- package/SVF-doxygen/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1CFBasicBlockNode_01_5_01_4_01_4.html +1 -1
- package/SVF-doxygen/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1CFBasicBlockGraph_01_5_01_4.html +2 -2
- package/SVF-doxygen/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1CFBasicBlockNode_01_5_01_4.html +1 -1
- package/package.json +1 -1
- package/svf/include/AE/Svfexe/{AE.h → AbstractExecution.h} +13 -14
- package/svf/include/AE/Svfexe/BufOverflowChecker.h +5 -5
- package/svf/include/Graphs/CFBasicBlockG.h +0 -43
- package/svf/lib/AE/Svfexe/{AE.cpp → AbstractExecution.cpp} +33 -33
- package/svf/lib/AE/Svfexe/BufOverflowChecker.cpp +2 -2
- package/svf-llvm/tools/AE/ae.cpp +1 -1
|
@@ -0,0 +1,2124 @@
|
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
3
|
+
<head>
|
|
4
|
+
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
5
|
+
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
|
6
|
+
<meta name="generator" content="Doxygen 1.8.17"/>
|
|
7
|
+
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
8
|
+
<title>Static Value-Flow Analysis: /home/runner/work/SVF/SVF/svf/lib/AE/Svfexe/AbstractExecution.cpp Source File</title>
|
|
9
|
+
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
|
10
|
+
<script type="text/javascript" src="jquery.js"></script>
|
|
11
|
+
<script type="text/javascript" src="dynsections.js"></script>
|
|
12
|
+
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
|
13
|
+
<script type="text/javascript" src="search/searchdata.js"></script>
|
|
14
|
+
<script type="text/javascript" src="search/search.js"></script>
|
|
15
|
+
<link href="doxygen.css" rel="stylesheet" type="text/css" />
|
|
16
|
+
</head>
|
|
17
|
+
<body>
|
|
18
|
+
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
|
19
|
+
<div id="titlearea">
|
|
20
|
+
<table cellspacing="0" cellpadding="0">
|
|
21
|
+
<tbody>
|
|
22
|
+
<tr style="height: 56px;">
|
|
23
|
+
<td id="projectalign" style="padding-left: 0.5em;">
|
|
24
|
+
<div id="projectname">Static Value-Flow Analysis
|
|
25
|
+
</div>
|
|
26
|
+
</td>
|
|
27
|
+
</tr>
|
|
28
|
+
</tbody>
|
|
29
|
+
</table>
|
|
30
|
+
</div>
|
|
31
|
+
<!-- end header part -->
|
|
32
|
+
<!-- Generated by Doxygen 1.8.17 -->
|
|
33
|
+
<script type="text/javascript">
|
|
34
|
+
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
|
35
|
+
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|
36
|
+
/* @license-end */
|
|
37
|
+
</script>
|
|
38
|
+
<script type="text/javascript" src="menudata.js"></script>
|
|
39
|
+
<script type="text/javascript" src="menu.js"></script>
|
|
40
|
+
<script type="text/javascript">
|
|
41
|
+
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
|
42
|
+
$(function() {
|
|
43
|
+
initMenu('',true,false,'search.php','Search');
|
|
44
|
+
$(document).ready(function() { init_search(); });
|
|
45
|
+
});
|
|
46
|
+
/* @license-end */</script>
|
|
47
|
+
<div id="main-nav"></div>
|
|
48
|
+
<!-- window showing the filter options -->
|
|
49
|
+
<div id="MSearchSelectWindow"
|
|
50
|
+
onmouseover="return searchBox.OnSearchSelectShow()"
|
|
51
|
+
onmouseout="return searchBox.OnSearchSelectHide()"
|
|
52
|
+
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
<!-- iframe showing the search results (closed by default) -->
|
|
56
|
+
<div id="MSearchResultsWindow">
|
|
57
|
+
<iframe src="javascript:void(0)" frameborder="0"
|
|
58
|
+
name="MSearchResults" id="MSearchResults">
|
|
59
|
+
</iframe>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<div id="nav-path" class="navpath">
|
|
63
|
+
<ul>
|
|
64
|
+
<li class="navelem"><a class="el" href="dir_f984cfbe93434e3daf67f2a9bd6d521f.html">svf</a></li><li class="navelem"><a class="el" href="dir_946e55d8e7afdb1629c1e1d7cdc5486a.html">lib</a></li><li class="navelem"><a class="el" href="dir_7e02b97230e2801c6749b0b00985526f.html">AE</a></li><li class="navelem"><a class="el" href="dir_81caa96ab1d3de93b353e2bbe80e6067.html">Svfexe</a></li> </ul>
|
|
65
|
+
</div>
|
|
66
|
+
</div><!-- top -->
|
|
67
|
+
<div class="header">
|
|
68
|
+
<div class="headertitle">
|
|
69
|
+
<div class="title">AbstractExecution.cpp</div> </div>
|
|
70
|
+
</div><!--header-->
|
|
71
|
+
<div class="contents">
|
|
72
|
+
<a href="AbstractExecution_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">//===- AbstractExecution.cpp -- Abstract Execution---------------------------------//</span></div>
|
|
73
|
+
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">//</span></div>
|
|
74
|
+
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">// SVF: Static Value-Flow Analysis</span></div>
|
|
75
|
+
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">//</span></div>
|
|
76
|
+
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">// Copyright (C) <2013-> <Yulei Sui></span></div>
|
|
77
|
+
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">//</span></div>
|
|
78
|
+
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>  </div>
|
|
79
|
+
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">// This program is free software: you can redistribute it and/or modify</span></div>
|
|
80
|
+
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">// it under the terms of the GNU Affero General Public License as published by</span></div>
|
|
81
|
+
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">// the Free Software Foundation, either version 3 of the License, or</span></div>
|
|
82
|
+
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">// (at your option) any later version.</span></div>
|
|
83
|
+
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>  </div>
|
|
84
|
+
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">// This program is distributed in the hope that it will be useful,</span></div>
|
|
85
|
+
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div>
|
|
86
|
+
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span></div>
|
|
87
|
+
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="comment">// GNU Affero General Public License for more details.</span></div>
|
|
88
|
+
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>  </div>
|
|
89
|
+
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="comment">// You should have received a copy of the GNU Affero General Public License</span></div>
|
|
90
|
+
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="comment">// along with this program. If not, see <http://www.gnu.org/licenses/>.</span></div>
|
|
91
|
+
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="comment">//</span></div>
|
|
92
|
+
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="comment">//===----------------------------------------------------------------------===//</span></div>
|
|
93
|
+
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  </div>
|
|
94
|
+
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  </div>
|
|
95
|
+
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment">//</span></div>
|
|
96
|
+
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="comment">// Created by Jiawei Wang on 2024/1/10.</span></div>
|
|
97
|
+
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment">//</span></div>
|
|
98
|
+
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="preprocessor">#include "<a class="code" href="Andersen_8h.html">WPA/Andersen.h</a>"</span></div>
|
|
99
|
+
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="preprocessor">#include "<a class="code" href="CFBasicBlockGBuilder_8h.html">Util/CFBasicBlockGBuilder.h</a>"</span></div>
|
|
100
|
+
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="preprocessor">#include "<a class="code" href="SVFIR_8h.html">SVFIR/SVFIR.h</a>"</span></div>
|
|
101
|
+
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="preprocessor">#include "<a class="code" href="AbstractExecution_8h.html">AE/Svfexe/AbstractExecution.h</a>"</span></div>
|
|
102
|
+
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div>
|
|
103
|
+
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="preprocessor">#include <cmath></span></div>
|
|
104
|
+
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  </div>
|
|
105
|
+
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div>
|
|
106
|
+
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="keyword">using namespace </span>SVFUtil;</div>
|
|
107
|
+
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="keyword">using namespace </span>z3;</div>
|
|
108
|
+
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  </div>
|
|
109
|
+
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  </div>
|
|
110
|
+
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <span class="comment">// according to varieties of cmp insts,</span></div>
|
|
111
|
+
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span> <span class="comment">// maybe var X var, var X const, const X var, const X const</span></div>
|
|
112
|
+
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="comment">// we accept 'var X const' 'var X var' 'const X const'</span></div>
|
|
113
|
+
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="comment">// if 'const X var', we need to reverse op0 op1 and its predicate 'var X' const'</span></div>
|
|
114
|
+
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="comment">// X' is reverse predicate of X</span></div>
|
|
115
|
+
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <span class="comment">// == -> !=, != -> ==, > -> <=, >= -> <, < -> >=, <= -> ></span></div>
|
|
116
|
+
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  </div>
|
|
117
|
+
<div class="line"><a name="l00046"></a><span class="lineno"><a class="line" href="AbstractExecution_8cpp.html#a6baa35cec0782ac3179849752a732e5c"> 46</a></span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<s32_t, s32_t></a> <a class="code" href="AbstractExecution_8cpp.html#a6baa35cec0782ac3179849752a732e5c">_reverse_predicate</a> =</div>
|
|
118
|
+
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span> {</div>
|
|
119
|
+
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  {CmpStmt::Predicate::FCMP_OEQ, CmpStmt::Predicate::FCMP_ONE}, <span class="comment">// == -> !=</span></div>
|
|
120
|
+
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  {CmpStmt::Predicate::FCMP_UEQ, CmpStmt::Predicate::FCMP_UNE}, <span class="comment">// == -> !=</span></div>
|
|
121
|
+
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  {CmpStmt::Predicate::FCMP_OGT, CmpStmt::Predicate::FCMP_OLE}, <span class="comment">// > -> <=</span></div>
|
|
122
|
+
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  {CmpStmt::Predicate::FCMP_OGE, CmpStmt::Predicate::FCMP_OLT}, <span class="comment">// >= -> <</span></div>
|
|
123
|
+
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  {CmpStmt::Predicate::FCMP_OLT, CmpStmt::Predicate::FCMP_OGE}, <span class="comment">// < -> >=</span></div>
|
|
124
|
+
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  {CmpStmt::Predicate::FCMP_OLE, CmpStmt::Predicate::FCMP_OGT}, <span class="comment">// <= -> ></span></div>
|
|
125
|
+
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  {CmpStmt::Predicate::FCMP_ONE, CmpStmt::Predicate::FCMP_OEQ}, <span class="comment">// != -> ==</span></div>
|
|
126
|
+
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  {CmpStmt::Predicate::FCMP_UNE, CmpStmt::Predicate::FCMP_UEQ}, <span class="comment">// != -> ==</span></div>
|
|
127
|
+
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  {CmpStmt::Predicate::ICMP_EQ, CmpStmt::Predicate::ICMP_NE}, <span class="comment">// == -> !=</span></div>
|
|
128
|
+
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  {CmpStmt::Predicate::ICMP_NE, CmpStmt::Predicate::ICMP_EQ}, <span class="comment">// != -> ==</span></div>
|
|
129
|
+
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  {CmpStmt::Predicate::ICMP_UGT, CmpStmt::Predicate::ICMP_ULE}, <span class="comment">// > -> <=</span></div>
|
|
130
|
+
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  {CmpStmt::Predicate::ICMP_ULT, CmpStmt::Predicate::ICMP_UGE}, <span class="comment">// < -> >=</span></div>
|
|
131
|
+
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  {CmpStmt::Predicate::ICMP_UGE, CmpStmt::Predicate::ICMP_ULT}, <span class="comment">// >= -> <</span></div>
|
|
132
|
+
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  {CmpStmt::Predicate::ICMP_SGT, CmpStmt::Predicate::ICMP_SLE}, <span class="comment">// > -> <=</span></div>
|
|
133
|
+
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  {CmpStmt::Predicate::ICMP_SLT, CmpStmt::Predicate::ICMP_SGE}, <span class="comment">// < -> >=</span></div>
|
|
134
|
+
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  {CmpStmt::Predicate::ICMP_SGE, CmpStmt::Predicate::ICMP_SLT}, <span class="comment">// >= -> <</span></div>
|
|
135
|
+
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span> };</div>
|
|
136
|
+
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  </div>
|
|
137
|
+
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  </div>
|
|
138
|
+
<div class="line"><a name="l00067"></a><span class="lineno"><a class="line" href="AbstractExecution_8cpp.html#a3b70282b79998dcb9f6df78370bc1fe9"> 67</a></span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<s32_t, s32_t></a> <a class="code" href="AbstractExecution_8cpp.html#a3b70282b79998dcb9f6df78370bc1fe9">_switch_lhsrhs_predicate</a> =</div>
|
|
139
|
+
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span> {</div>
|
|
140
|
+
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  {CmpStmt::Predicate::FCMP_OEQ, CmpStmt::Predicate::FCMP_OEQ}, <span class="comment">// == -> ==</span></div>
|
|
141
|
+
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  {CmpStmt::Predicate::FCMP_UEQ, CmpStmt::Predicate::FCMP_UEQ}, <span class="comment">// == -> ==</span></div>
|
|
142
|
+
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  {CmpStmt::Predicate::FCMP_OGT, CmpStmt::Predicate::FCMP_OLT}, <span class="comment">// > -> <</span></div>
|
|
143
|
+
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  {CmpStmt::Predicate::FCMP_OGE, CmpStmt::Predicate::FCMP_OLE}, <span class="comment">// >= -> <=</span></div>
|
|
144
|
+
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  {CmpStmt::Predicate::FCMP_OLT, CmpStmt::Predicate::FCMP_OGT}, <span class="comment">// < -> ></span></div>
|
|
145
|
+
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  {CmpStmt::Predicate::FCMP_OLE, CmpStmt::Predicate::FCMP_OGE}, <span class="comment">// <= -> >=</span></div>
|
|
146
|
+
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  {CmpStmt::Predicate::FCMP_ONE, CmpStmt::Predicate::FCMP_ONE}, <span class="comment">// != -> !=</span></div>
|
|
147
|
+
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  {CmpStmt::Predicate::FCMP_UNE, CmpStmt::Predicate::FCMP_UNE}, <span class="comment">// != -> !=</span></div>
|
|
148
|
+
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  {CmpStmt::Predicate::ICMP_EQ, CmpStmt::Predicate::ICMP_EQ}, <span class="comment">// == -> ==</span></div>
|
|
149
|
+
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  {CmpStmt::Predicate::ICMP_NE, CmpStmt::Predicate::ICMP_NE}, <span class="comment">// != -> !=</span></div>
|
|
150
|
+
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  {CmpStmt::Predicate::ICMP_UGT, CmpStmt::Predicate::ICMP_ULT}, <span class="comment">// > -> <</span></div>
|
|
151
|
+
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  {CmpStmt::Predicate::ICMP_ULT, CmpStmt::Predicate::ICMP_UGT}, <span class="comment">// < -> ></span></div>
|
|
152
|
+
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  {CmpStmt::Predicate::ICMP_UGE, CmpStmt::Predicate::ICMP_ULE}, <span class="comment">// >= -> <=</span></div>
|
|
153
|
+
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  {CmpStmt::Predicate::ICMP_SGT, CmpStmt::Predicate::ICMP_SLT}, <span class="comment">// > -> <</span></div>
|
|
154
|
+
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  {CmpStmt::Predicate::ICMP_SLT, CmpStmt::Predicate::ICMP_SGT}, <span class="comment">// < -> ></span></div>
|
|
155
|
+
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  {CmpStmt::Predicate::ICMP_SGE, CmpStmt::Predicate::ICMP_SLE}, <span class="comment">// >= -> <=</span></div>
|
|
156
|
+
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span> };</div>
|
|
157
|
+
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  </div>
|
|
158
|
+
<div class="line"><a name="l00087"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#a4bf7be47ddc0ba53ec4a5e87f300763f"> 87</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AbstractExecution.html#a4bf7be47ddc0ba53ec4a5e87f300763f">AbstractExecution::initExtAPI</a>()</div>
|
|
159
|
+
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span> {</div>
|
|
160
|
+
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  _api = <span class="keyword">new</span> <a class="code" href="classSVF_1_1AEAPI.html">AEAPI</a>(<span class="keyword">this</span>, _stat);</div>
|
|
161
|
+
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span> }</div>
|
|
162
|
+
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  </div>
|
|
163
|
+
<div class="line"><a name="l00092"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#a7a9a6b46b24d044316f609f71344e2bb"> 92</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AbstractExecution.html#a7a9a6b46b24d044316f609f71344e2bb">AbstractExecution::runOnModule</a>(<a class="code" href="classSVF_1_1SVFIR.html">SVF::SVFIR</a> *svfModule)</div>
|
|
164
|
+
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span> {</div>
|
|
165
|
+
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <span class="comment">// 1. Start clock</span></div>
|
|
166
|
+
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  _stat->startClk();</div>
|
|
167
|
+
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  </div>
|
|
168
|
+
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  _svfir = svfModule;</div>
|
|
169
|
+
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  _ander = <a class="code" href="classSVF_1_1AndersenWaveDiff.html#a48ff6fc4badc79ad3204ae9bd95cc540">AndersenWaveDiff::createAndersenWaveDiff</a>(_svfir);</div>
|
|
170
|
+
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  _api->setModule(_svfir);</div>
|
|
171
|
+
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <span class="comment">// init SVF Execution States</span></div>
|
|
172
|
+
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  _svfir2ExeState = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFIR2ItvExeState.html">SVFIR2ItvExeState</a>(_svfir);</div>
|
|
173
|
+
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  </div>
|
|
174
|
+
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <span class="comment">// init SSE External API Handler</span></div>
|
|
175
|
+
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  _callgraph = _ander->getPTACallGraph();</div>
|
|
176
|
+
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  _icfg = _svfir->getICFG();</div>
|
|
177
|
+
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <a class="code" href="classSVF_1_1CFBasicBlockGBuilder.html">CFBasicBlockGBuilder</a> CFBGBuilder;</div>
|
|
178
|
+
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  _icfg->updateCallGraph(_callgraph);</div>
|
|
179
|
+
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  </div>
|
|
180
|
+
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  CFBGBuilder.<a class="code" href="classSVF_1_1CFBasicBlockGBuilder.html#a25f0496187622b156bafc49f34fffeaf">build</a>(_icfg);</div>
|
|
181
|
+
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  _CFBlockG = CFBGBuilder.<a class="code" href="classSVF_1_1CFBasicBlockGBuilder.html#a879d8affb9b113c9d2d976cdd31b60f1">getCFBasicBlockGraph</a>();</div>
|
|
182
|
+
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  _api->collectCheckPoint();</div>
|
|
183
|
+
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  </div>
|
|
184
|
+
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  markRecursiveFuns();</div>
|
|
185
|
+
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* fun: _svfir->getModule()->getFunctionSet())</div>
|
|
186
|
+
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  {</div>
|
|
187
|
+
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <span class="keywordflow">if</span> (_CFBlockG->hasGNode(_icfg->getFunEntryICFGNode(fun)->getId()) )</div>
|
|
188
|
+
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  {</div>
|
|
189
|
+
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CFBasicBlockNode.html">CFBasicBlockNode</a> *node = _CFBlockG->getGNode(_icfg->getFunEntryICFGNode(fun)->getId());</div>
|
|
190
|
+
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <span class="keyword">auto</span> *wto = <span class="keyword">new</span> <a class="code" href="classSVF_1_1CFBasicBlockGWTO.html">CFBasicBlockGWTO</a>(_CFBlockG, node);</div>
|
|
191
|
+
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  wto->init();</div>
|
|
192
|
+
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  _funcToWTO[fun] = wto;</div>
|
|
193
|
+
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  }</div>
|
|
194
|
+
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  }</div>
|
|
195
|
+
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  analyse();</div>
|
|
196
|
+
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  _api->checkPointAllSet();</div>
|
|
197
|
+
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="comment">// 5. Stop clock and report bugs</span></div>
|
|
198
|
+
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  _stat->endClk();</div>
|
|
199
|
+
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  _stat->finializeStat();</div>
|
|
200
|
+
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#ac9d18f2d6853f45548f4f85fa2f661c4">Options::PStat</a>())</div>
|
|
201
|
+
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  {</div>
|
|
202
|
+
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  _stat->performStat();</div>
|
|
203
|
+
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  }</div>
|
|
204
|
+
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  _stat->reportBug();</div>
|
|
205
|
+
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span> }</div>
|
|
206
|
+
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  </div>
|
|
207
|
+
<div class="line"><a name="l00138"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#a84d8fedb7e9d23e92ffcb74b4cfbf78c"> 138</a></span> <a class="code" href="classSVF_1_1AbstractExecution.html#a84d8fedb7e9d23e92ffcb74b4cfbf78c">AbstractExecution::AbstractExecution</a>()</div>
|
|
208
|
+
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span> {</div>
|
|
209
|
+
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  _stat = <span class="keyword">new</span> <a class="code" href="classSVF_1_1AEStat.html">AEStat</a>(<span class="keyword">this</span>);</div>
|
|
210
|
+
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span> }</div>
|
|
211
|
+
<div class="line"><a name="l00143"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#a6771ac262e5fdbac0006b293cde47398"> 143</a></span> <a class="code" href="classSVF_1_1AbstractExecution.html#a6771ac262e5fdbac0006b293cde47398">AbstractExecution::~AbstractExecution</a>()</div>
|
|
212
|
+
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span> {</div>
|
|
213
|
+
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  <span class="keyword">delete</span> _stat;</div>
|
|
214
|
+
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  <span class="keyword">delete</span> _api;</div>
|
|
215
|
+
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  <span class="keyword">delete</span> _svfir2ExeState;</div>
|
|
216
|
+
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> it: _funcToWTO)</div>
|
|
217
|
+
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  <span class="keyword">delete</span> it.second;</div>
|
|
218
|
+
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  </div>
|
|
219
|
+
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span> }</div>
|
|
220
|
+
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  </div>
|
|
221
|
+
<div class="line"><a name="l00153"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#ae641b5687513661a2542e8318430d760"> 153</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AbstractExecution.html#ae641b5687513661a2542e8318430d760">AbstractExecution::markRecursiveFuns</a>()</div>
|
|
222
|
+
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span> {</div>
|
|
223
|
+
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  <span class="comment">// detect if callgraph has cycle</span></div>
|
|
224
|
+
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  <a class="code" href="classSVF_1_1SCCDetection.html">CallGraphSCC</a>* _callGraphScc = _ander->getCallGraphSCC();</div>
|
|
225
|
+
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  _callGraphScc-><a class="code" href="classSVF_1_1SCCDetection.html#a123b5006a6da7053e5e357140da3c5a3">find</a>();</div>
|
|
226
|
+
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  </div>
|
|
227
|
+
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = _callgraph->begin(); it != _callgraph->end(); it++)</div>
|
|
228
|
+
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  {</div>
|
|
229
|
+
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="keywordflow">if</span> (_callGraphScc-><a class="code" href="classSVF_1_1SCCDetection.html#a5d699af73b1e7ad4e3a5f6d26b8b6d15">isInCycle</a>(it->second->getId()))</div>
|
|
230
|
+
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  _recursiveFuns.insert(it->second->getFunction());</div>
|
|
231
|
+
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  }</div>
|
|
232
|
+
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span> }</div>
|
|
233
|
+
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  </div>
|
|
234
|
+
<div class="line"><a name="l00167"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#a46364bb8814f7bf6ddd492aa7dc58ffb"> 167</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AbstractExecution.html#a46364bb8814f7bf6ddd492aa7dc58ffb">AbstractExecution::analyse</a>()</div>
|
|
235
|
+
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span> {</div>
|
|
236
|
+
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  <span class="comment">// handle Global ICFGNode of SVFModule</span></div>
|
|
237
|
+
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  handleGlobalNode();</div>
|
|
238
|
+
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* fun = _svfir->getModule()->getSVFFunction(<span class="stringliteral">"main"</span>))</div>
|
|
239
|
+
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  {</div>
|
|
240
|
+
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  handleFunc(fun);</div>
|
|
241
|
+
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  }</div>
|
|
242
|
+
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span> }</div>
|
|
243
|
+
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  </div>
|
|
244
|
+
<div class="line"><a name="l00178"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#a7efff2047b2b6017fdd210a8679817cd"> 178</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AbstractExecution.html#a7efff2047b2b6017fdd210a8679817cd">AbstractExecution::handleGlobalNode</a>()</div>
|
|
245
|
+
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span> {</div>
|
|
246
|
+
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a> es;</div>
|
|
247
|
+
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1ICFGNode.html">ICFGNode</a>* node = _icfg->getGlobalICFGNode();</div>
|
|
248
|
+
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  _svfir2ExeState->setEs(es);</div>
|
|
249
|
+
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  <span class="comment">// Global Node, we just need to handle addr, load, store, copy and gep</span></div>
|
|
250
|
+
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFStmt.html">SVFStmt</a> *stmt: node-><a class="code" href="classSVF_1_1ICFGNode.html#a6c68f52dd90728073fb79141df9b0661">getSVFStmts</a>())</div>
|
|
251
|
+
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  {</div>
|
|
252
|
+
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1AddrStmt.html">AddrStmt</a> *addr = SVFUtil::dyn_cast<AddrStmt>(stmt))</div>
|
|
253
|
+
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  {</div>
|
|
254
|
+
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  _svfir2ExeState->translateAddr(addr);</div>
|
|
255
|
+
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  }</div>
|
|
256
|
+
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1LoadStmt.html">LoadStmt</a> *load = SVFUtil::dyn_cast<LoadStmt>(stmt))</div>
|
|
257
|
+
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  {</div>
|
|
258
|
+
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  _svfir2ExeState->translateLoad(load);</div>
|
|
259
|
+
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  }</div>
|
|
260
|
+
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1StoreStmt.html">StoreStmt</a> *store = SVFUtil::dyn_cast<StoreStmt>(stmt))</div>
|
|
261
|
+
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  {</div>
|
|
262
|
+
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  _svfir2ExeState->translateStore(store);</div>
|
|
263
|
+
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  }</div>
|
|
264
|
+
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CopyStmt.html">CopyStmt</a> *<a class="code" href="cJSON_8cpp.html#a7669ee67a0563250c1efaa24d130e1ac">copy</a> = SVFUtil::dyn_cast<CopyStmt>(stmt))</div>
|
|
265
|
+
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  {</div>
|
|
266
|
+
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  _svfir2ExeState->translateCopy(<a class="code" href="cJSON_8cpp.html#a7669ee67a0563250c1efaa24d130e1ac">copy</a>);</div>
|
|
267
|
+
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  }</div>
|
|
268
|
+
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1GepStmt.html">GepStmt</a> *gep = SVFUtil::dyn_cast<GepStmt>(stmt))</div>
|
|
269
|
+
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  {</div>
|
|
270
|
+
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  _svfir2ExeState->translateGep(gep);</div>
|
|
271
|
+
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  }</div>
|
|
272
|
+
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  <span class="keywordflow">else</span></div>
|
|
273
|
+
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"implement this part"</span>);</div>
|
|
274
|
+
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  }</div>
|
|
275
|
+
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  <span class="comment">// for stmts in global node, exe state will move to global state to lower memory usage</span></div>
|
|
276
|
+
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  _svfir2ExeState->moveToGlobal();</div>
|
|
277
|
+
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span> }</div>
|
|
278
|
+
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  </div>
|
|
279
|
+
<div class="line"><a name="l00216"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#ac73335ecb1efc6c50775a205c618201f"> 216</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1AbstractExecution.html#ac73335ecb1efc6c50775a205c618201f">AbstractExecution::hasInEdgesES</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CFBasicBlockNode.html">CFBasicBlockNode</a> *block)</div>
|
|
280
|
+
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span> {</div>
|
|
281
|
+
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  <span class="keywordflow">if</span> (isGlobalEntry(block))</div>
|
|
282
|
+
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  {</div>
|
|
283
|
+
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  _preES[block] = <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a>();</div>
|
|
284
|
+
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
285
|
+
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  }</div>
|
|
286
|
+
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <span class="comment">// is common basic block</span></div>
|
|
287
|
+
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <span class="keywordflow">else</span></div>
|
|
288
|
+
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  {</div>
|
|
289
|
+
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a> es;</div>
|
|
290
|
+
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> inEdgeNum = 0;</div>
|
|
291
|
+
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span>& edge: block-><a class="code" href="classSVF_1_1CFBasicBlockNode.html#a6bfafe540f83e097370ca0dc66422214">getInEdges</a>())</div>
|
|
292
|
+
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  {</div>
|
|
293
|
+
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  <span class="keywordflow">if</span> (_postES.find(edge->getSrcNode()) != _postES.end())</div>
|
|
294
|
+
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  {</div>
|
|
295
|
+
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1IntraCFGEdge.html">IntraCFGEdge</a> *intraCfgEdge = SVFUtil::dyn_cast<IntraCFGEdge>(edge->getICFGEdge());</div>
|
|
296
|
+
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  <span class="keywordflow">if</span> (intraCfgEdge && intraCfgEdge-><a class="code" href="classSVF_1_1IntraCFGEdge.html#a2657751b285cb6db8084da38b00dcab9">getCondition</a>())</div>
|
|
297
|
+
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  {</div>
|
|
298
|
+
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a> tmpEs = _postES[edge->getSrcNode()];</div>
|
|
299
|
+
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  <span class="keywordflow">if</span> (hasBranchES(intraCfgEdge, tmpEs))</div>
|
|
300
|
+
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  {</div>
|
|
301
|
+
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  es.<a class="code" href="classSVF_1_1IntervalExeState.html#a46ef74cd1412790b088f1d7320f57a9f">joinWith</a>(tmpEs);</div>
|
|
302
|
+
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  inEdgeNum++;</div>
|
|
303
|
+
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  }</div>
|
|
304
|
+
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <span class="keywordflow">else</span></div>
|
|
305
|
+
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  {</div>
|
|
306
|
+
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  <span class="comment">// do nothing</span></div>
|
|
307
|
+
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  }</div>
|
|
308
|
+
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  }</div>
|
|
309
|
+
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordflow">else</span></div>
|
|
310
|
+
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  {</div>
|
|
311
|
+
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  es.<a class="code" href="classSVF_1_1IntervalExeState.html#a46ef74cd1412790b088f1d7320f57a9f">joinWith</a>(_postES[edge->getSrcNode()]);</div>
|
|
312
|
+
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  inEdgeNum++;</div>
|
|
313
|
+
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  }</div>
|
|
314
|
+
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  }</div>
|
|
315
|
+
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  <span class="keywordflow">else</span></div>
|
|
316
|
+
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  {</div>
|
|
317
|
+
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  </div>
|
|
318
|
+
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  }</div>
|
|
319
|
+
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  }</div>
|
|
320
|
+
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  <span class="keywordflow">if</span> (inEdgeNum == 0)</div>
|
|
321
|
+
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  {</div>
|
|
322
|
+
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
323
|
+
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  }</div>
|
|
324
|
+
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <span class="keywordflow">else</span></div>
|
|
325
|
+
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  {</div>
|
|
326
|
+
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  _preES[block] = es;</div>
|
|
327
|
+
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
328
|
+
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  }</div>
|
|
329
|
+
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  }</div>
|
|
330
|
+
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"implement this part"</span>);</div>
|
|
331
|
+
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span> }</div>
|
|
332
|
+
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  </div>
|
|
333
|
+
<div class="line"><a name="l00270"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#ab807fd4f914cd35a07fe19bb0d7f9860"> 270</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1AbstractExecution.html#ab807fd4f914cd35a07fe19bb0d7f9860">AbstractExecution::isFunEntry</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CFBasicBlockNode.html">SVF::CFBasicBlockNode</a> *block)</div>
|
|
334
|
+
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span> {</div>
|
|
335
|
+
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <span class="keywordflow">if</span> (SVFUtil::isa<FunEntryICFGNode>(*block-><a class="code" href="classSVF_1_1CFBasicBlockNode.html#afdad57a83c392a8b14b838ecb58f9ff7">getICFGNodes</a>().begin()))</div>
|
|
336
|
+
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  {</div>
|
|
337
|
+
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  <span class="keywordflow">if</span> (_preES.find(block) != _preES.end())</div>
|
|
338
|
+
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  {</div>
|
|
339
|
+
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
340
|
+
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  }</div>
|
|
341
|
+
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  }</div>
|
|
342
|
+
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
343
|
+
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span> }</div>
|
|
344
|
+
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  </div>
|
|
345
|
+
<div class="line"><a name="l00282"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#ac8af7bb8a5442ffd885249cecc5c0f02"> 282</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1AbstractExecution.html#ac8af7bb8a5442ffd885249cecc5c0f02">AbstractExecution::isGlobalEntry</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CFBasicBlockNode.html">SVF::CFBasicBlockNode</a> *block)</div>
|
|
346
|
+
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span> {</div>
|
|
347
|
+
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  <span class="keywordflow">if</span> (!block-><a class="code" href="classSVF_1_1CFBasicBlockNode.html#ac468c52cc443f1137f6d5fb510a8ac46">hasIncomingEdge</a>())</div>
|
|
348
|
+
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
349
|
+
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  <span class="keywordflow">else</span></div>
|
|
350
|
+
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
351
|
+
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span> }</div>
|
|
352
|
+
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  </div>
|
|
353
|
+
<div class="line"><a name="l00290"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#ac7a25ad5cbc1a6132869ae54b805f73a"> 290</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1AbstractExecution.html#ac7a25ad5cbc1a6132869ae54b805f73a">AbstractExecution::hasCmpBranchES</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CmpStmt.html">CmpStmt</a>* cmpStmt, <a class="code" href="namespaceSVF.html#ad781b0b14e89773e774072b280658ef3">s64_t</a> succ, <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a>& es)</div>
|
|
354
|
+
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span> {</div>
|
|
355
|
+
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a> new_es = es;</div>
|
|
356
|
+
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  <span class="comment">// get cmp stmt's op0, op1, and predicate</span></div>
|
|
357
|
+
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> op0 = cmpStmt-><a class="code" href="classSVF_1_1MultiOpndStmt.html#a5c6efcc023e90ef2e618586091958c59">getOpVarID</a>(0);</div>
|
|
358
|
+
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> op1 = cmpStmt-><a class="code" href="classSVF_1_1MultiOpndStmt.html#a5c6efcc023e90ef2e618586091958c59">getOpVarID</a>(1);</div>
|
|
359
|
+
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> res_id = cmpStmt-><a class="code" href="classSVF_1_1MultiOpndStmt.html#a71a530eb9fa9f7e273e471b4a75a039e">getResID</a>();</div>
|
|
360
|
+
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  <a class="code" href="namespaceSVF.html#a9b707002523ece2ac54ca893ee9a2d4e">s32_t</a> predicate = cmpStmt-><a class="code" href="classSVF_1_1CmpStmt.html#aa6a21fb1cfbc263bb38651176c495632">getPredicate</a>();</div>
|
|
361
|
+
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  </div>
|
|
362
|
+
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  <span class="comment">// if op0 or op1 is undefined, return;</span></div>
|
|
363
|
+
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  <span class="comment">// skip address compare</span></div>
|
|
364
|
+
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  <span class="keywordflow">if</span> (new_es.<a class="code" href="classSVF_1_1IntervalExeState.html#ad485a35730353c0e945bc84a034d9e45">inVarToAddrsTable</a>(op0) || new_es.<a class="code" href="classSVF_1_1IntervalExeState.html#ad485a35730353c0e945bc84a034d9e45">inVarToAddrsTable</a>(op1))</div>
|
|
365
|
+
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  {</div>
|
|
366
|
+
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  es = new_es;</div>
|
|
367
|
+
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
368
|
+
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  }</div>
|
|
369
|
+
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LoadStmt.html">LoadStmt</a> *load_op0 = <span class="keyword">nullptr</span>;</div>
|
|
370
|
+
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LoadStmt.html">LoadStmt</a> *load_op1 = <span class="keyword">nullptr</span>;</div>
|
|
371
|
+
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  <span class="comment">// get '%1 = load i32 s', and load inst may not exist</span></div>
|
|
372
|
+
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  <a class="code" href="classSVF_1_1SVFVar.html">SVFVar</a>* loadVar0 = _svfir->getGNode(op0);</div>
|
|
373
|
+
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  <span class="keywordflow">if</span> (!loadVar0-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>().empty())</div>
|
|
374
|
+
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  {</div>
|
|
375
|
+
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  <a class="code" href="classSVF_1_1SVFStmt.html">SVFStmt</a> *loadVar0InStmt = *loadVar0-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>().begin();</div>
|
|
376
|
+
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1LoadStmt.html">LoadStmt</a> *loadStmt = SVFUtil::dyn_cast<LoadStmt>(loadVar0InStmt))</div>
|
|
377
|
+
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  {</div>
|
|
378
|
+
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  load_op0 = loadStmt;</div>
|
|
379
|
+
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  }</div>
|
|
380
|
+
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CopyStmt.html">CopyStmt</a> *copyStmt = SVFUtil::dyn_cast<CopyStmt>(loadVar0InStmt))</div>
|
|
381
|
+
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  {</div>
|
|
382
|
+
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  loadVar0 = _svfir->getGNode(copyStmt->getRHSVarID());</div>
|
|
383
|
+
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  <span class="keywordflow">if</span> (!loadVar0-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>().empty())</div>
|
|
384
|
+
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  {</div>
|
|
385
|
+
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <a class="code" href="classSVF_1_1SVFStmt.html">SVFStmt</a> *loadVar0InStmt2 = *loadVar0-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>().begin();</div>
|
|
386
|
+
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1LoadStmt.html">LoadStmt</a> *loadStmt = SVFUtil::dyn_cast<LoadStmt>(loadVar0InStmt2))</div>
|
|
387
|
+
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  {</div>
|
|
388
|
+
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  load_op0 = loadStmt;</div>
|
|
389
|
+
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  }</div>
|
|
390
|
+
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  }</div>
|
|
391
|
+
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  }</div>
|
|
392
|
+
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  }</div>
|
|
393
|
+
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  </div>
|
|
394
|
+
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  <a class="code" href="classSVF_1_1SVFVar.html">SVFVar</a>* loadVar1 = _svfir->getGNode(op1);</div>
|
|
395
|
+
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  <span class="keywordflow">if</span> (!loadVar1-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>().empty())</div>
|
|
396
|
+
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  {</div>
|
|
397
|
+
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  <a class="code" href="classSVF_1_1SVFStmt.html">SVFStmt</a> *loadVar1InStmt = *loadVar1-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>().begin();</div>
|
|
398
|
+
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1LoadStmt.html">LoadStmt</a> *loadStmt = SVFUtil::dyn_cast<LoadStmt>(loadVar1InStmt))</div>
|
|
399
|
+
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  {</div>
|
|
400
|
+
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  load_op1 = loadStmt;</div>
|
|
401
|
+
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  }</div>
|
|
402
|
+
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CopyStmt.html">CopyStmt</a> *copyStmt = SVFUtil::dyn_cast<CopyStmt>(loadVar1InStmt))</div>
|
|
403
|
+
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  {</div>
|
|
404
|
+
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  loadVar1 = _svfir->getGNode(copyStmt->getRHSVarID());</div>
|
|
405
|
+
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  <span class="keywordflow">if</span> (!loadVar1-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>().empty())</div>
|
|
406
|
+
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  {</div>
|
|
407
|
+
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  <a class="code" href="classSVF_1_1SVFStmt.html">SVFStmt</a> *loadVar1InStmt2 = *loadVar1-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>().begin();</div>
|
|
408
|
+
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1LoadStmt.html">LoadStmt</a> *loadStmt = SVFUtil::dyn_cast<LoadStmt>(loadVar1InStmt2))</div>
|
|
409
|
+
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  {</div>
|
|
410
|
+
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  load_op1 = loadStmt;</div>
|
|
411
|
+
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  }</div>
|
|
412
|
+
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  }</div>
|
|
413
|
+
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  }</div>
|
|
414
|
+
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  }</div>
|
|
415
|
+
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  <span class="comment">// for const X const, we may get concrete resVal instantly</span></div>
|
|
416
|
+
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  <span class="comment">// for var X const, we may get [0,1] if the intersection of var and const is not empty set</span></div>
|
|
417
|
+
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> resVal = new_es[res_id];</div>
|
|
418
|
+
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  resVal.<a class="code" href="classSVF_1_1IntervalValue.html#a144e17cec654e83654298b379ed4ce9f">meet_with</a>(<a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>((int64_t) succ, succ));</div>
|
|
419
|
+
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  <span class="comment">// If Var X const generates bottom value, it means this branch path is not feasible.</span></div>
|
|
420
|
+
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  <span class="keywordflow">if</span> (resVal.<a class="code" href="classSVF_1_1IntervalValue.html#af8be90fc1b61103187908dce4ba68001">isBottom</a>())</div>
|
|
421
|
+
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  {</div>
|
|
422
|
+
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
423
|
+
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  }</div>
|
|
424
|
+
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  </div>
|
|
425
|
+
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  <span class="keywordtype">bool</span> b0 = new_es[op0].is_numeral();</div>
|
|
426
|
+
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  <span class="keywordtype">bool</span> b1 = new_es[op1].is_numeral();</div>
|
|
427
|
+
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  </div>
|
|
428
|
+
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  <span class="comment">// if const X var, we should reverse op0 and op1.</span></div>
|
|
429
|
+
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  <span class="keywordflow">if</span> (b0 && !b1)</div>
|
|
430
|
+
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  {</div>
|
|
431
|
+
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  new_es.<a class="code" href="classSVF_1_1IntervalExeState.html#a052d677fb5ee940ed0686f3d67d10d19">cpyItvToLocal</a>(op1);</div>
|
|
432
|
+
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  }</div>
|
|
433
|
+
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!b0 && b1)</div>
|
|
434
|
+
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  {</div>
|
|
435
|
+
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  new_es.<a class="code" href="classSVF_1_1IntervalExeState.html#a052d677fb5ee940ed0686f3d67d10d19">cpyItvToLocal</a>(op0);</div>
|
|
436
|
+
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  }</div>
|
|
437
|
+
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  </div>
|
|
438
|
+
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  <span class="comment">// if const X var, we should reverse op0 and op1.</span></div>
|
|
439
|
+
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  <span class="keywordflow">if</span> (b0 && !b1)</div>
|
|
440
|
+
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  {</div>
|
|
441
|
+
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  std::swap(op0, op1);</div>
|
|
442
|
+
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  std::swap(load_op0, load_op1);</div>
|
|
443
|
+
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  predicate = <a class="code" href="AbstractExecution_8cpp.html#a3b70282b79998dcb9f6df78370bc1fe9">_switch_lhsrhs_predicate</a>[predicate];</div>
|
|
444
|
+
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  }</div>
|
|
445
|
+
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  <span class="keywordflow">else</span></div>
|
|
446
|
+
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  {</div>
|
|
447
|
+
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  <span class="comment">// if var X var, we cannot preset the branch condition to infer the intervals of var0,var1</span></div>
|
|
448
|
+
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  <span class="keywordflow">if</span> (!b0 && !b1)</div>
|
|
449
|
+
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  {</div>
|
|
450
|
+
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  es = new_es;</div>
|
|
451
|
+
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
452
|
+
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  }</div>
|
|
453
|
+
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  <span class="comment">// if const X const, we can instantly get the resVal</span></div>
|
|
454
|
+
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (b0 && b1)</div>
|
|
455
|
+
<div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  {</div>
|
|
456
|
+
<div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  es = new_es;</div>
|
|
457
|
+
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
458
|
+
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  }</div>
|
|
459
|
+
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  }</div>
|
|
460
|
+
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <span class="comment">// if cmp is 'var X const == false', we should reverse predicate 'var X' const == true'</span></div>
|
|
461
|
+
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  <span class="comment">// X' is reverse predicate of X</span></div>
|
|
462
|
+
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  <span class="keywordflow">if</span> (succ == 0)</div>
|
|
463
|
+
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  {</div>
|
|
464
|
+
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  predicate = <a class="code" href="AbstractExecution_8cpp.html#a6baa35cec0782ac3179849752a732e5c">_reverse_predicate</a>[predicate];</div>
|
|
465
|
+
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  }</div>
|
|
466
|
+
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  <span class="keywordflow">else</span> {}</div>
|
|
467
|
+
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  <span class="comment">// change interval range according to the compare predicate</span></div>
|
|
468
|
+
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  <a class="code" href="classSVF_1_1AddressValue.html">ExeState::Addrs</a> addrs;</div>
|
|
469
|
+
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  <span class="keywordflow">if</span>(load_op0 && new_es.<a class="code" href="classSVF_1_1IntervalExeState.html#ad485a35730353c0e945bc84a034d9e45">inVarToAddrsTable</a>(load_op0-><a class="code" href="classSVF_1_1AssignStmt.html#a4cec89489e82c60c287cae3327f3f01d">getRHSVarID</a>()))</div>
|
|
470
|
+
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  addrs = new_es.<a class="code" href="classSVF_1_1IntervalExeState.html#a056e0db56033ac4dc041e6d82d614dbd">getAddrs</a>(load_op0-><a class="code" href="classSVF_1_1AssignStmt.html#a4cec89489e82c60c287cae3327f3f01d">getRHSVarID</a>());</div>
|
|
471
|
+
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  </div>
|
|
472
|
+
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> &lhs = new_es[op0], &rhs = new_es[op1];</div>
|
|
473
|
+
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <span class="keywordflow">switch</span> (predicate)</div>
|
|
474
|
+
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  {</div>
|
|
475
|
+
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::ICMP_EQ:</div>
|
|
476
|
+
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::FCMP_OEQ:</div>
|
|
477
|
+
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::FCMP_UEQ:</div>
|
|
478
|
+
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  {</div>
|
|
479
|
+
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  <span class="comment">// Var == Const, so [var.lb, var.ub].meet_with(const)</span></div>
|
|
480
|
+
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  lhs.<a class="code" href="classSVF_1_1IntervalValue.html#a144e17cec654e83654298b379ed4ce9f">meet_with</a>(rhs);</div>
|
|
481
|
+
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  <span class="comment">// if lhs is register value, we should also change its mem obj</span></div>
|
|
482
|
+
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &addr: addrs)</div>
|
|
483
|
+
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  {</div>
|
|
484
|
+
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> objId = new_es.<a class="code" href="classSVF_1_1ExeState.html#ab72f3bc855feeda75e11768ab03ad84e">getInternalID</a>(addr);</div>
|
|
485
|
+
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  <span class="keywordflow">if</span> (new_es.<a class="code" href="classSVF_1_1IntervalExeState.html#a50aee49f7f34e05f7e2cb28ae55099f8">inLocToValTable</a>(objId))</div>
|
|
486
|
+
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  {</div>
|
|
487
|
+
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  new_es.<a class="code" href="classSVF_1_1IntervalExeState.html#a960ec3359dfcb5e89fb66120c868ac5e">load</a>(addr).<a class="code" href="classSVF_1_1IntervalValue.html#a144e17cec654e83654298b379ed4ce9f">meet_with</a>(rhs);</div>
|
|
488
|
+
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  }</div>
|
|
489
|
+
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  }</div>
|
|
490
|
+
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  <span class="keywordflow">break</span>;</div>
|
|
491
|
+
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  }</div>
|
|
492
|
+
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::ICMP_NE:</div>
|
|
493
|
+
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::FCMP_ONE:</div>
|
|
494
|
+
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::FCMP_UNE:</div>
|
|
495
|
+
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  <span class="comment">// Compliment set</span></div>
|
|
496
|
+
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  <span class="keywordflow">break</span>;</div>
|
|
497
|
+
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::ICMP_UGT:</div>
|
|
498
|
+
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::ICMP_SGT:</div>
|
|
499
|
+
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::FCMP_OGT:</div>
|
|
500
|
+
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::FCMP_UGT:</div>
|
|
501
|
+
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  <span class="comment">// Var > Const, so [var.lb, var.ub].meet_with([Const+1, +INF])</span></div>
|
|
502
|
+
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  lhs.<a class="code" href="classSVF_1_1IntervalValue.html#a144e17cec654e83654298b379ed4ce9f">meet_with</a>(<a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>(rhs.lb() + 1, <a class="code" href="classSVF_1_1IntervalValue.html#a739ab04e16ec1156be71b29d49998a4f">IntervalValue::plus_infinity</a>()));</div>
|
|
503
|
+
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  <span class="comment">// if lhs is register value, we should also change its mem obj</span></div>
|
|
504
|
+
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &addr: addrs)</div>
|
|
505
|
+
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  {</div>
|
|
506
|
+
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> objId = new_es.<a class="code" href="classSVF_1_1ExeState.html#ab72f3bc855feeda75e11768ab03ad84e">getInternalID</a>(addr);</div>
|
|
507
|
+
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  <span class="keywordflow">if</span> (new_es.<a class="code" href="classSVF_1_1IntervalExeState.html#a50aee49f7f34e05f7e2cb28ae55099f8">inLocToValTable</a>(objId))</div>
|
|
508
|
+
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  {</div>
|
|
509
|
+
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  new_es.<a class="code" href="classSVF_1_1IntervalExeState.html#a960ec3359dfcb5e89fb66120c868ac5e">load</a>(addr).<a class="code" href="classSVF_1_1IntervalValue.html#a144e17cec654e83654298b379ed4ce9f">meet_with</a>(</div>
|
|
510
|
+
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>(rhs.lb() + 1, <a class="code" href="classSVF_1_1IntervalValue.html#a739ab04e16ec1156be71b29d49998a4f">IntervalValue::plus_infinity</a>()));</div>
|
|
511
|
+
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  }</div>
|
|
512
|
+
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  }</div>
|
|
513
|
+
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  <span class="keywordflow">break</span>;</div>
|
|
514
|
+
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::ICMP_UGE:</div>
|
|
515
|
+
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::ICMP_SGE:</div>
|
|
516
|
+
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::FCMP_OGE:</div>
|
|
517
|
+
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::FCMP_UGE:</div>
|
|
518
|
+
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  {</div>
|
|
519
|
+
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  <span class="comment">// Var >= Const, so [var.lb, var.ub].meet_with([Const, +INF])</span></div>
|
|
520
|
+
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  lhs.<a class="code" href="classSVF_1_1IntervalValue.html#a144e17cec654e83654298b379ed4ce9f">meet_with</a>(<a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>(rhs.lb(), <a class="code" href="classSVF_1_1IntervalValue.html#a739ab04e16ec1156be71b29d49998a4f">IntervalValue::plus_infinity</a>()));</div>
|
|
521
|
+
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  <span class="comment">// if lhs is register value, we should also change its mem obj</span></div>
|
|
522
|
+
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &addr: addrs)</div>
|
|
523
|
+
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  {</div>
|
|
524
|
+
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> objId = new_es.<a class="code" href="classSVF_1_1ExeState.html#ab72f3bc855feeda75e11768ab03ad84e">getInternalID</a>(addr);</div>
|
|
525
|
+
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  <span class="keywordflow">if</span> (new_es.<a class="code" href="classSVF_1_1IntervalExeState.html#a50aee49f7f34e05f7e2cb28ae55099f8">inLocToValTable</a>(objId))</div>
|
|
526
|
+
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  {</div>
|
|
527
|
+
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  new_es.<a class="code" href="classSVF_1_1IntervalExeState.html#a960ec3359dfcb5e89fb66120c868ac5e">load</a>(addr).<a class="code" href="classSVF_1_1IntervalValue.html#a144e17cec654e83654298b379ed4ce9f">meet_with</a>(</div>
|
|
528
|
+
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>(rhs.lb(), <a class="code" href="classSVF_1_1IntervalValue.html#a739ab04e16ec1156be71b29d49998a4f">IntervalValue::plus_infinity</a>()));</div>
|
|
529
|
+
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  }</div>
|
|
530
|
+
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  }</div>
|
|
531
|
+
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  <span class="keywordflow">break</span>;</div>
|
|
532
|
+
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  }</div>
|
|
533
|
+
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::ICMP_ULT:</div>
|
|
534
|
+
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::ICMP_SLT:</div>
|
|
535
|
+
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::FCMP_OLT:</div>
|
|
536
|
+
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::FCMP_ULT:</div>
|
|
537
|
+
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  {</div>
|
|
538
|
+
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  <span class="comment">// Var < Const, so [var.lb, var.ub].meet_with([-INF, const.ub-1])</span></div>
|
|
539
|
+
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  lhs.<a class="code" href="classSVF_1_1IntervalValue.html#a144e17cec654e83654298b379ed4ce9f">meet_with</a>(<a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>(<a class="code" href="classSVF_1_1IntervalValue.html#a43f48c744f7bda0dc689b8f186449371">IntervalValue::minus_infinity</a>(), rhs.ub() - 1));</div>
|
|
540
|
+
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  <span class="comment">// if lhs is register value, we should also change its mem obj</span></div>
|
|
541
|
+
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &addr: addrs)</div>
|
|
542
|
+
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  {</div>
|
|
543
|
+
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> objId = new_es.<a class="code" href="classSVF_1_1ExeState.html#ab72f3bc855feeda75e11768ab03ad84e">getInternalID</a>(addr);</div>
|
|
544
|
+
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  <span class="keywordflow">if</span> (new_es.<a class="code" href="classSVF_1_1IntervalExeState.html#a50aee49f7f34e05f7e2cb28ae55099f8">inLocToValTable</a>(objId))</div>
|
|
545
|
+
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  {</div>
|
|
546
|
+
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  new_es.<a class="code" href="classSVF_1_1IntervalExeState.html#a960ec3359dfcb5e89fb66120c868ac5e">load</a>(addr).<a class="code" href="classSVF_1_1IntervalValue.html#a144e17cec654e83654298b379ed4ce9f">meet_with</a>(</div>
|
|
547
|
+
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>(<a class="code" href="classSVF_1_1IntervalValue.html#a43f48c744f7bda0dc689b8f186449371">IntervalValue::minus_infinity</a>(), rhs.ub() - 1));</div>
|
|
548
|
+
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  }</div>
|
|
549
|
+
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  }</div>
|
|
550
|
+
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <span class="keywordflow">break</span>;</div>
|
|
551
|
+
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  }</div>
|
|
552
|
+
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::ICMP_ULE:</div>
|
|
553
|
+
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::ICMP_SLE:</div>
|
|
554
|
+
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::FCMP_OLE:</div>
|
|
555
|
+
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::FCMP_ULE:</div>
|
|
556
|
+
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  {</div>
|
|
557
|
+
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  <span class="comment">// Var <= Const, so [var.lb, var.ub].meet_with([-INF, const.ub])</span></div>
|
|
558
|
+
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  lhs.<a class="code" href="classSVF_1_1IntervalValue.html#a144e17cec654e83654298b379ed4ce9f">meet_with</a>(<a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>(<a class="code" href="classSVF_1_1IntervalValue.html#a43f48c744f7bda0dc689b8f186449371">IntervalValue::minus_infinity</a>(), rhs.ub()));</div>
|
|
559
|
+
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  <span class="comment">// if lhs is register value, we should also change its mem obj</span></div>
|
|
560
|
+
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &addr: addrs)</div>
|
|
561
|
+
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  {</div>
|
|
562
|
+
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> objId = new_es.<a class="code" href="classSVF_1_1ExeState.html#ab72f3bc855feeda75e11768ab03ad84e">getInternalID</a>(addr);</div>
|
|
563
|
+
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  <span class="keywordflow">if</span> (new_es.<a class="code" href="classSVF_1_1IntervalExeState.html#a50aee49f7f34e05f7e2cb28ae55099f8">inLocToValTable</a>(objId))</div>
|
|
564
|
+
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  {</div>
|
|
565
|
+
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  new_es.<a class="code" href="classSVF_1_1IntervalExeState.html#a960ec3359dfcb5e89fb66120c868ac5e">load</a>(addr).<a class="code" href="classSVF_1_1IntervalValue.html#a144e17cec654e83654298b379ed4ce9f">meet_with</a>(</div>
|
|
566
|
+
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>(<a class="code" href="classSVF_1_1IntervalValue.html#a43f48c744f7bda0dc689b8f186449371">IntervalValue::minus_infinity</a>(), rhs.ub()));</div>
|
|
567
|
+
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  }</div>
|
|
568
|
+
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  }</div>
|
|
569
|
+
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  <span class="keywordflow">break</span>;</div>
|
|
570
|
+
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  }</div>
|
|
571
|
+
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::FCMP_FALSE:</div>
|
|
572
|
+
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  <span class="keywordflow">break</span>;</div>
|
|
573
|
+
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  <span class="keywordflow">case</span> CmpStmt::Predicate::FCMP_TRUE:</div>
|
|
574
|
+
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  <span class="keywordflow">break</span>;</div>
|
|
575
|
+
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  <span class="keywordflow">default</span>:</div>
|
|
576
|
+
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"implement this part"</span>);</div>
|
|
577
|
+
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  abort();</div>
|
|
578
|
+
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  }</div>
|
|
579
|
+
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  es = new_es;</div>
|
|
580
|
+
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
581
|
+
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span> }</div>
|
|
582
|
+
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  </div>
|
|
583
|
+
<div class="line"><a name="l00520"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#adc740771e712644d08f95fc6c488c1af"> 520</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1AbstractExecution.html#adc740771e712644d08f95fc6c488c1af">AbstractExecution::hasSwitchBranchES</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFVar.html">SVFVar</a>* var, <a class="code" href="namespaceSVF.html#ad781b0b14e89773e774072b280658ef3">s64_t</a> succ, <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a>& es)</div>
|
|
584
|
+
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span> {</div>
|
|
585
|
+
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a> new_es = es;</div>
|
|
586
|
+
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  new_es.<a class="code" href="classSVF_1_1IntervalExeState.html#a052d677fb5ee940ed0686f3d67d10d19">cpyItvToLocal</a>(var-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div>
|
|
587
|
+
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>& switch_cond = new_es[var-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>()];</div>
|
|
588
|
+
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  <a class="code" href="namespaceSVF.html#ad781b0b14e89773e774072b280658ef3">s64_t</a> value = succ;</div>
|
|
589
|
+
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  <a class="code" href="classSVF_1_1FIFOWorkList.html">FIFOWorkList<const SVFStmt*></a> workList;</div>
|
|
590
|
+
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SVFStmt.html">SVFStmt</a> *cmpVarInStmt: var-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>())</div>
|
|
591
|
+
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  {</div>
|
|
592
|
+
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  workList.<a class="code" href="classSVF_1_1FIFOWorkList.html#a0df409a67428e528321869d201f2a474">push</a>(cmpVarInStmt);</div>
|
|
593
|
+
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>  }</div>
|
|
594
|
+
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>  switch_cond.<a class="code" href="classSVF_1_1IntervalValue.html#a144e17cec654e83654298b379ed4ce9f">meet_with</a>(<a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>(value, value));</div>
|
|
595
|
+
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  <span class="keywordflow">if</span> (switch_cond.<a class="code" href="classSVF_1_1IntervalValue.html#af8be90fc1b61103187908dce4ba68001">isBottom</a>())</div>
|
|
596
|
+
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  {</div>
|
|
597
|
+
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
598
|
+
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  }</div>
|
|
599
|
+
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  <span class="keywordflow">while</span>(!workList.<a class="code" href="classSVF_1_1FIFOWorkList.html#a7056704c224dfb4b57287fe90c004aa8">empty</a>())</div>
|
|
600
|
+
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>  {</div>
|
|
601
|
+
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFStmt.html">SVFStmt</a>* stmt = workList.<a class="code" href="classSVF_1_1FIFOWorkList.html#a8fa72918fce7e9c0b2dc34b683a797c6">pop</a>();</div>
|
|
602
|
+
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  <span class="keywordflow">if</span> (SVFUtil::isa<CopyStmt>(stmt))</div>
|
|
603
|
+
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  {</div>
|
|
604
|
+
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>& copy_cond = new_es[var-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>()];</div>
|
|
605
|
+
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  copy_cond.<a class="code" href="classSVF_1_1IntervalValue.html#a144e17cec654e83654298b379ed4ce9f">meet_with</a>(<a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>(value, value));</div>
|
|
606
|
+
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  }</div>
|
|
607
|
+
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1LoadStmt.html">LoadStmt</a>* load = SVFUtil::dyn_cast<LoadStmt>(stmt))</div>
|
|
608
|
+
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  {</div>
|
|
609
|
+
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  <span class="keywordflow">if</span> (new_es.<a class="code" href="classSVF_1_1IntervalExeState.html#ad485a35730353c0e945bc84a034d9e45">inVarToAddrsTable</a>(load->getRHSVarID()))</div>
|
|
610
|
+
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  {</div>
|
|
611
|
+
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  <a class="code" href="classSVF_1_1AddressValue.html">ExeState::Addrs</a> &addrs = new_es.<a class="code" href="classSVF_1_1IntervalExeState.html#a056e0db56033ac4dc041e6d82d614dbd">getAddrs</a>(load->getRHSVarID()); <span class="comment">//3108</span></div>
|
|
612
|
+
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &addr: addrs)</div>
|
|
613
|
+
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  {</div>
|
|
614
|
+
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> objId = new_es.<a class="code" href="classSVF_1_1ExeState.html#ab72f3bc855feeda75e11768ab03ad84e">getInternalID</a>(addr);</div>
|
|
615
|
+
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  <span class="keywordflow">if</span> (new_es.<a class="code" href="classSVF_1_1IntervalExeState.html#a50aee49f7f34e05f7e2cb28ae55099f8">inLocToValTable</a>(objId))</div>
|
|
616
|
+
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  {</div>
|
|
617
|
+
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  new_es.<a class="code" href="classSVF_1_1IntervalExeState.html#a960ec3359dfcb5e89fb66120c868ac5e">load</a>(addr).<a class="code" href="classSVF_1_1IntervalValue.html#a144e17cec654e83654298b379ed4ce9f">meet_with</a>(switch_cond);</div>
|
|
618
|
+
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  }</div>
|
|
619
|
+
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  }</div>
|
|
620
|
+
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  }</div>
|
|
621
|
+
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  }</div>
|
|
622
|
+
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  }</div>
|
|
623
|
+
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  es = new_es;</div>
|
|
624
|
+
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
625
|
+
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span> }</div>
|
|
626
|
+
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  </div>
|
|
627
|
+
<div class="line"><a name="l00564"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#a28df4f2bd5b337468f254cd609adb25f"> 564</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1AbstractExecution.html#a28df4f2bd5b337468f254cd609adb25f">AbstractExecution::hasBranchES</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1IntraCFGEdge.html">IntraCFGEdge</a>* intraEdge, <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a>& es)</div>
|
|
628
|
+
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span> {</div>
|
|
629
|
+
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a> *cond = intraEdge-><a class="code" href="classSVF_1_1IntraCFGEdge.html#a2657751b285cb6db8084da38b00dcab9">getCondition</a>();</div>
|
|
630
|
+
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> cmpID = _svfir->getValueNode(cond);</div>
|
|
631
|
+
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  <a class="code" href="classSVF_1_1SVFVar.html">SVFVar</a> *cmpVar = _svfir->getGNode(cmpID);</div>
|
|
632
|
+
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  <span class="keywordflow">if</span> (cmpVar-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>().empty())</div>
|
|
633
|
+
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  {</div>
|
|
634
|
+
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  <span class="keywordflow">return</span> hasSwitchBranchES(cmpVar, intraEdge-><a class="code" href="classSVF_1_1IntraCFGEdge.html#a106513578790247f9d96e34c8385b3d8">getSuccessorCondValue</a>(), es);</div>
|
|
635
|
+
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  }</div>
|
|
636
|
+
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  <span class="keywordflow">else</span></div>
|
|
637
|
+
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  {</div>
|
|
638
|
+
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  assert(!cmpVar-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>().empty() &&</div>
|
|
639
|
+
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  <span class="stringliteral">"no in edges?"</span>);</div>
|
|
640
|
+
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  <a class="code" href="classSVF_1_1SVFStmt.html">SVFStmt</a> *cmpVarInStmt = *cmpVar-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>().begin();</div>
|
|
641
|
+
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CmpStmt.html">CmpStmt</a> *cmpStmt = SVFUtil::dyn_cast<CmpStmt>(cmpVarInStmt))</div>
|
|
642
|
+
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  {</div>
|
|
643
|
+
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  <span class="keywordflow">return</span> hasCmpBranchES(cmpStmt, intraEdge-><a class="code" href="classSVF_1_1IntraCFGEdge.html#a106513578790247f9d96e34c8385b3d8">getSuccessorCondValue</a>(), es);</div>
|
|
644
|
+
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  }</div>
|
|
645
|
+
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  <span class="keywordflow">else</span></div>
|
|
646
|
+
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  {</div>
|
|
647
|
+
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  <span class="keywordflow">return</span> hasSwitchBranchES(cmpVar, intraEdge-><a class="code" href="classSVF_1_1IntraCFGEdge.html#a106513578790247f9d96e34c8385b3d8">getSuccessorCondValue</a>(), es);</div>
|
|
648
|
+
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  }</div>
|
|
649
|
+
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  }</div>
|
|
650
|
+
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
651
|
+
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span> }</div>
|
|
652
|
+
<div class="line"><a name="l00590"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#a4715ec6b1aefdfd600fda8324cde2a66"> 590</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AbstractExecution.html#a4715ec6b1aefdfd600fda8324cde2a66">AbstractExecution::handleBlock</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CFBasicBlockNode.html">CFBasicBlockNode</a> *block)</div>
|
|
653
|
+
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span> {</div>
|
|
654
|
+
<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  _stat->getBlockTrace()++;</div>
|
|
655
|
+
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  <span class="comment">// Get execution states from in edges</span></div>
|
|
656
|
+
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  <span class="keywordflow">if</span> (!hasInEdgesES(block))</div>
|
|
657
|
+
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  {</div>
|
|
658
|
+
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  <span class="comment">// No ES on the in edges - Infeasible block</span></div>
|
|
659
|
+
<div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  <span class="keywordflow">return</span>;</div>
|
|
660
|
+
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  }</div>
|
|
661
|
+
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  <span class="keywordflow">else</span></div>
|
|
662
|
+
<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  {</div>
|
|
663
|
+
<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  <span class="comment">// Has ES on the in edges - Feasible block</span></div>
|
|
664
|
+
<div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  <span class="comment">// Get execution state from in edges</span></div>
|
|
665
|
+
<div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  _svfir2ExeState->setEs(_preES[block]);</div>
|
|
666
|
+
<div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  }</div>
|
|
667
|
+
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  </div>
|
|
668
|
+
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  std::deque<const ICFGNode*> worklist;</div>
|
|
669
|
+
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = block-><a class="code" href="classSVF_1_1CFBasicBlockNode.html#a439a84d7181616f62d8ebac945dbbd59">begin</a>(); it != block-><a class="code" href="classSVF_1_1CFBasicBlockNode.html#a4eb0886ab2538dbe2a3dcf8ab7fc615e">end</a>(); ++it)</div>
|
|
670
|
+
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  {</div>
|
|
671
|
+
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  worklist.push_back(*it);</div>
|
|
672
|
+
<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  }</div>
|
|
673
|
+
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  <span class="keywordflow">while</span>(!worklist.empty())</div>
|
|
674
|
+
<div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  {</div>
|
|
675
|
+
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1ICFGNode.html">ICFGNode</a>* curICFGNode = worklist.front();</div>
|
|
676
|
+
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  worklist.pop_front();</div>
|
|
677
|
+
<div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  handleICFGNode(curICFGNode);</div>
|
|
678
|
+
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  }</div>
|
|
679
|
+
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  _preES.erase(block);</div>
|
|
680
|
+
<div class="line"><a name="l00618"></a><span class="lineno"> 618</span>  _postES[block] = _svfir2ExeState->getEs();</div>
|
|
681
|
+
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span> }</div>
|
|
682
|
+
<div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  </div>
|
|
683
|
+
<div class="line"><a name="l00621"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#a6cbc336372afb947c783fb14c45426df"> 621</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AbstractExecution.html#a6cbc336372afb947c783fb14c45426df">AbstractExecution::handleCallSite</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1ICFGNode.html">ICFGNode</a>* node)</div>
|
|
684
|
+
<div class="line"><a name="l00622"></a><span class="lineno"> 622</span> {</div>
|
|
685
|
+
<div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a>* callNode = SVFUtil::dyn_cast<CallICFGNode>(node))</div>
|
|
686
|
+
<div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  {</div>
|
|
687
|
+
<div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a22ef185e767ff76c098e75126c885400">isExtCall</a>(callNode))</div>
|
|
688
|
+
<div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  {</div>
|
|
689
|
+
<div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  extCallPass(callNode);</div>
|
|
690
|
+
<div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  }</div>
|
|
691
|
+
<div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (isRecursiveCall(callNode))</div>
|
|
692
|
+
<div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  {</div>
|
|
693
|
+
<div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  recursiveCallPass(callNode);</div>
|
|
694
|
+
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  }</div>
|
|
695
|
+
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (isDirectCall(callNode))</div>
|
|
696
|
+
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  {</div>
|
|
697
|
+
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  directCallFunPass(callNode);</div>
|
|
698
|
+
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  }</div>
|
|
699
|
+
<div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (isIndirectCall(callNode))</div>
|
|
700
|
+
<div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  {</div>
|
|
701
|
+
<div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  indirectCallFunPass(callNode);</div>
|
|
702
|
+
<div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  }</div>
|
|
703
|
+
<div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  <span class="keywordflow">else</span></div>
|
|
704
|
+
<div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  {</div>
|
|
705
|
+
<div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"implement this part"</span>);</div>
|
|
706
|
+
<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  }</div>
|
|
707
|
+
<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  }</div>
|
|
708
|
+
<div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  <span class="keywordflow">else</span></div>
|
|
709
|
+
<div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  {</div>
|
|
710
|
+
<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  assert (<span class="keyword">false</span> && <span class="stringliteral">"it is not call node"</span>);</div>
|
|
711
|
+
<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  }</div>
|
|
712
|
+
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span> }</div>
|
|
713
|
+
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  </div>
|
|
714
|
+
<div class="line"><a name="l00652"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#a319fe24ebb925f70fde574d5b17c3b98"> 652</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1AbstractExecution.html#a319fe24ebb925f70fde574d5b17c3b98">AbstractExecution::isExtCall</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">SVF::CallICFGNode</a> *callNode)</div>
|
|
715
|
+
<div class="line"><a name="l00653"></a><span class="lineno"> 653</span> {</div>
|
|
716
|
+
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *callfun = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">SVFUtil::getCallee</a>(callNode-><a class="code" href="classSVF_1_1CallICFGNode.html#a90fd0b8e44fba1a7eb76d15bce085d66">getCallSite</a>());</div>
|
|
717
|
+
<div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  <span class="keywordflow">return</span> <a class="code" href="namespaceSVF_1_1SVFUtil.html#a22ef185e767ff76c098e75126c885400">SVFUtil::isExtCall</a>(callfun);</div>
|
|
718
|
+
<div class="line"><a name="l00656"></a><span class="lineno"> 656</span> }</div>
|
|
719
|
+
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  </div>
|
|
720
|
+
<div class="line"><a name="l00658"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#acf4a6c3fe5a2239512acb791b9aba854"> 658</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AbstractExecution.html#acf4a6c3fe5a2239512acb791b9aba854">AbstractExecution::extCallPass</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">SVF::CallICFGNode</a> *callNode)</div>
|
|
721
|
+
<div class="line"><a name="l00659"></a><span class="lineno"> 659</span> {</div>
|
|
722
|
+
<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  _callSiteStack.push_back(callNode);</div>
|
|
723
|
+
<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  _api->handleExtAPI(callNode);</div>
|
|
724
|
+
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  _callSiteStack.pop_back();</div>
|
|
725
|
+
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span> }</div>
|
|
726
|
+
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  </div>
|
|
727
|
+
<div class="line"><a name="l00665"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#a6b92cdb6c5d3ae425955864536f2cba7"> 665</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1AbstractExecution.html#a6b92cdb6c5d3ae425955864536f2cba7">AbstractExecution::isRecursiveCall</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">SVF::CallICFGNode</a> *callNode)</div>
|
|
728
|
+
<div class="line"><a name="l00666"></a><span class="lineno"> 666</span> {</div>
|
|
729
|
+
<div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *callfun = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">SVFUtil::getCallee</a>(callNode-><a class="code" href="classSVF_1_1CallICFGNode.html#a90fd0b8e44fba1a7eb76d15bce085d66">getCallSite</a>());</div>
|
|
730
|
+
<div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  <span class="keywordflow">return</span> _recursiveFuns.find(callfun) != _recursiveFuns.end();</div>
|
|
731
|
+
<div class="line"><a name="l00669"></a><span class="lineno"> 669</span> }</div>
|
|
732
|
+
<div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  </div>
|
|
733
|
+
<div class="line"><a name="l00671"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#aa220cdcd1653998d684ec14fe729932d"> 671</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AbstractExecution.html#aa220cdcd1653998d684ec14fe729932d">AbstractExecution::recursiveCallPass</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">SVF::CallICFGNode</a> *callNode)</div>
|
|
734
|
+
<div class="line"><a name="l00672"></a><span class="lineno"> 672</span> {</div>
|
|
735
|
+
<div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  SkipRecursiveCall(callNode);</div>
|
|
736
|
+
<div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1RetICFGNode.html">RetICFGNode</a> *retNode = callNode-><a class="code" href="classSVF_1_1CallICFGNode.html#ae23a7540609879ac0379fc53b4e7eead">getRetICFGNode</a>();</div>
|
|
737
|
+
<div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  <span class="keywordflow">if</span> (retNode-><a class="code" href="classSVF_1_1ICFGNode.html#a6c68f52dd90728073fb79141df9b0661">getSVFStmts</a>().size() > 0)</div>
|
|
738
|
+
<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  {</div>
|
|
739
|
+
<div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1RetPE.html">RetPE</a> *retPE = SVFUtil::dyn_cast<RetPE>(*retNode-><a class="code" href="classSVF_1_1ICFGNode.html#a6c68f52dd90728073fb79141df9b0661">getSVFStmts</a>().begin()))</div>
|
|
740
|
+
<div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  {</div>
|
|
741
|
+
<div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  <span class="keywordflow">if</span> (!retPE->getLHSVar()->isPointer() &&</div>
|
|
742
|
+
<div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  !retPE->getLHSVar()->isConstDataOrAggDataButNotNullPtr())</div>
|
|
743
|
+
<div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  {</div>
|
|
744
|
+
<div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  _svfir2ExeState->getEs()[retPE->getLHSVarID()] = <a class="code" href="classSVF_1_1IntervalValue.html#add3acad151d5af6c9a5f692f7a01e65b">IntervalValue::top</a>();</div>
|
|
745
|
+
<div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  }</div>
|
|
746
|
+
<div class="line"><a name="l00684"></a><span class="lineno"> 684</span>  }</div>
|
|
747
|
+
<div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  }</div>
|
|
748
|
+
<div class="line"><a name="l00686"></a><span class="lineno"> 686</span> }</div>
|
|
749
|
+
<div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  </div>
|
|
750
|
+
<div class="line"><a name="l00688"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#aec702d92bbba9e847a9b3eada060a2c5"> 688</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1AbstractExecution.html#aec702d92bbba9e847a9b3eada060a2c5">AbstractExecution::isDirectCall</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">SVF::CallICFGNode</a> *callNode)</div>
|
|
751
|
+
<div class="line"><a name="l00689"></a><span class="lineno"> 689</span> {</div>
|
|
752
|
+
<div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *callfun = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">SVFUtil::getCallee</a>(callNode-><a class="code" href="classSVF_1_1CallICFGNode.html#a90fd0b8e44fba1a7eb76d15bce085d66">getCallSite</a>());</div>
|
|
753
|
+
<div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  <span class="keywordflow">return</span> _funcToWTO.find(callfun) != _funcToWTO.end();</div>
|
|
754
|
+
<div class="line"><a name="l00692"></a><span class="lineno"> 692</span> }</div>
|
|
755
|
+
<div class="line"><a name="l00693"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#aff1c9582db75361b68aaaf0c4b8b6f0d"> 693</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AbstractExecution.html#aff1c9582db75361b68aaaf0c4b8b6f0d">AbstractExecution::directCallFunPass</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">SVF::CallICFGNode</a> *callNode)</div>
|
|
756
|
+
<div class="line"><a name="l00694"></a><span class="lineno"> 694</span> {</div>
|
|
757
|
+
<div class="line"><a name="l00695"></a><span class="lineno"> 695</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *callfun = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">SVFUtil::getCallee</a>(callNode-><a class="code" href="classSVF_1_1CallICFGNode.html#a90fd0b8e44fba1a7eb76d15bce085d66">getCallSite</a>());</div>
|
|
758
|
+
<div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a> preES = _svfir2ExeState->getEs();</div>
|
|
759
|
+
<div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  _callSiteStack.push_back(callNode);</div>
|
|
760
|
+
<div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  </div>
|
|
761
|
+
<div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  <span class="keyword">auto</span>* curBlockNode = _CFBlockG->getCFBasicBlockNode(callNode-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div>
|
|
762
|
+
<div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  _postES[curBlockNode] = _svfir2ExeState->getEs();</div>
|
|
763
|
+
<div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  </div>
|
|
764
|
+
<div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  handleFunc(callfun);</div>
|
|
765
|
+
<div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  _callSiteStack.pop_back();</div>
|
|
766
|
+
<div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  <span class="comment">// handle Ret node</span></div>
|
|
767
|
+
<div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1RetICFGNode.html">RetICFGNode</a> *retNode = callNode-><a class="code" href="classSVF_1_1CallICFGNode.html#ae23a7540609879ac0379fc53b4e7eead">getRetICFGNode</a>();</div>
|
|
768
|
+
<div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  <span class="comment">// resume ES to callnode</span></div>
|
|
769
|
+
<div class="line"><a name="l00707"></a><span class="lineno"> 707</span>  _postES[_CFBlockG->getCFBasicBlockNode(retNode-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>())] = _postES[_CFBlockG->getCFBasicBlockNode(callNode-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>())];</div>
|
|
770
|
+
<div class="line"><a name="l00708"></a><span class="lineno"> 708</span> }</div>
|
|
771
|
+
<div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  </div>
|
|
772
|
+
<div class="line"><a name="l00710"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#ad1baaa8eaad68b215f63941776e79ccf"> 710</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1AbstractExecution.html#ad1baaa8eaad68b215f63941776e79ccf">AbstractExecution::isIndirectCall</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">SVF::CallICFGNode</a> *callNode)</div>
|
|
773
|
+
<div class="line"><a name="l00711"></a><span class="lineno"> 711</span> {</div>
|
|
774
|
+
<div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  <span class="keyword">const</span> <span class="keyword">auto</span> callsiteMaps = _svfir->getIndirectCallsites();</div>
|
|
775
|
+
<div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  <span class="keywordflow">return</span> callsiteMaps.find(callNode) != callsiteMaps.end();</div>
|
|
776
|
+
<div class="line"><a name="l00714"></a><span class="lineno"> 714</span> }</div>
|
|
777
|
+
<div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  </div>
|
|
778
|
+
<div class="line"><a name="l00716"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#accf5896d39647e41e1408fa90935b650"> 716</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AbstractExecution.html#accf5896d39647e41e1408fa90935b650">AbstractExecution::indirectCallFunPass</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">SVF::CallICFGNode</a> *callNode)</div>
|
|
779
|
+
<div class="line"><a name="l00717"></a><span class="lineno"> 717</span> {</div>
|
|
780
|
+
<div class="line"><a name="l00718"></a><span class="lineno"> 718</span>  <span class="keyword">const</span> <span class="keyword">auto</span> callsiteMaps = _svfir->getIndirectCallsites();</div>
|
|
781
|
+
<div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> call_id = callsiteMaps.at(callNode);</div>
|
|
782
|
+
<div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  <span class="keywordflow">if</span> (!_svfir2ExeState->getEs().inVarToAddrsTable(call_id))</div>
|
|
783
|
+
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  {</div>
|
|
784
|
+
<div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  <span class="keywordflow">return</span>;</div>
|
|
785
|
+
<div class="line"><a name="l00723"></a><span class="lineno"> 723</span>  }</div>
|
|
786
|
+
<div class="line"><a name="l00724"></a><span class="lineno"> 724</span>  <a class="code" href="classSVF_1_1AddressValue.html">ExeState::Addrs</a> Addrs = _svfir2ExeState->getAddrs(call_id);</div>
|
|
787
|
+
<div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> addr = *Addrs.<a class="code" href="classSVF_1_1AddressValue.html#aed0b4789beda4980e4e215a65350f323">begin</a>();</div>
|
|
788
|
+
<div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  <a class="code" href="classSVF_1_1SVFVar.html">SVFVar</a> *func_var = _svfir->getGNode(_svfir2ExeState->getInternalID(addr));</div>
|
|
789
|
+
<div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *callfun = SVFUtil::dyn_cast<SVFFunction>(func_var-><a class="code" href="classSVF_1_1SVFVar.html#ac2db6304ea5526fb446ae882983beeb0">getValue</a>());</div>
|
|
790
|
+
<div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  <span class="keywordflow">if</span> (callfun)</div>
|
|
791
|
+
<div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  {</div>
|
|
792
|
+
<div class="line"><a name="l00730"></a><span class="lineno"> 730</span>  <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a> preES = _svfir2ExeState->getEs();</div>
|
|
793
|
+
<div class="line"><a name="l00731"></a><span class="lineno"> 731</span>  _callSiteStack.push_back(callNode);</div>
|
|
794
|
+
<div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  <span class="keyword">auto</span> *curBlockNode = _CFBlockG->getCFBasicBlockNode(callNode-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div>
|
|
795
|
+
<div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  </div>
|
|
796
|
+
<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  _postES[curBlockNode] = _svfir2ExeState->getEs();</div>
|
|
797
|
+
<div class="line"><a name="l00735"></a><span class="lineno"> 735</span>  </div>
|
|
798
|
+
<div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  handleFunc(callfun);</div>
|
|
799
|
+
<div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  _callSiteStack.pop_back();</div>
|
|
800
|
+
<div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  <span class="comment">// handle Ret node</span></div>
|
|
801
|
+
<div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1RetICFGNode.html">RetICFGNode</a> *retNode = callNode-><a class="code" href="classSVF_1_1CallICFGNode.html#ae23a7540609879ac0379fc53b4e7eead">getRetICFGNode</a>();</div>
|
|
802
|
+
<div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  _postES[_CFBlockG->getCFBasicBlockNode(retNode-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>())] = _postES[_CFBlockG->getCFBasicBlockNode(callNode-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>())];</div>
|
|
803
|
+
<div class="line"><a name="l00741"></a><span class="lineno"> 741</span>  }</div>
|
|
804
|
+
<div class="line"><a name="l00742"></a><span class="lineno"> 742</span> }</div>
|
|
805
|
+
<div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  </div>
|
|
806
|
+
<div class="line"><a name="l00744"></a><span class="lineno"> 744</span>  </div>
|
|
807
|
+
<div class="line"><a name="l00745"></a><span class="lineno"> 745</span>  </div>
|
|
808
|
+
<div class="line"><a name="l00746"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#a714fa1f4794008f630de415414cf8bfd"> 746</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AbstractExecution.html#a714fa1f4794008f630de415414cf8bfd">AbstractExecution::handleICFGNode</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1ICFGNode.html">ICFGNode</a> *curICFGNode)</div>
|
|
809
|
+
<div class="line"><a name="l00747"></a><span class="lineno"> 747</span> {</div>
|
|
810
|
+
<div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  _stat->getICFGNodeTrace()++;</div>
|
|
811
|
+
<div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  <span class="comment">// handle SVF Stmt</span></div>
|
|
812
|
+
<div class="line"><a name="l00750"></a><span class="lineno"> 750</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFStmt.html">SVFStmt</a> *stmt: curICFGNode-><a class="code" href="classSVF_1_1ICFGNode.html#a6c68f52dd90728073fb79141df9b0661">getSVFStmts</a>())</div>
|
|
813
|
+
<div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  {</div>
|
|
814
|
+
<div class="line"><a name="l00752"></a><span class="lineno"> 752</span>  handleSVFStatement(stmt);</div>
|
|
815
|
+
<div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  }</div>
|
|
816
|
+
<div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  <span class="comment">// inlining the callee by calling handleFunc for the callee function</span></div>
|
|
817
|
+
<div class="line"><a name="l00755"></a><span class="lineno"> 755</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a>* callnode = SVFUtil::dyn_cast<CallICFGNode>(curICFGNode))</div>
|
|
818
|
+
<div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  {</div>
|
|
819
|
+
<div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  handleCallSite(callnode);</div>
|
|
820
|
+
<div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  }</div>
|
|
821
|
+
<div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  <span class="keywordflow">else</span></div>
|
|
822
|
+
<div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  {</div>
|
|
823
|
+
<div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  </div>
|
|
824
|
+
<div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  }</div>
|
|
825
|
+
<div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  _stat->countStateSize();</div>
|
|
826
|
+
<div class="line"><a name="l00764"></a><span class="lineno"> 764</span> }</div>
|
|
827
|
+
<div class="line"><a name="l00765"></a><span class="lineno"> 765</span>  </div>
|
|
828
|
+
<div class="line"><a name="l00767"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#af4579490ced0a02537850d62891cf5bc"> 767</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AbstractExecution.html#af4579490ced0a02537850d62891cf5bc">AbstractExecution::handleCycle</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1WTOCycle.html">CFBasicBlockGWTOCycle</a> *cycle)</div>
|
|
829
|
+
<div class="line"><a name="l00768"></a><span class="lineno"> 768</span> {</div>
|
|
830
|
+
<div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  <span class="comment">// Get execution states from in edges</span></div>
|
|
831
|
+
<div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  <span class="keywordflow">if</span> (!hasInEdgesES(cycle-><a class="code" href="classSVF_1_1WTOCycle.html#ace60ecb07603681de5c3020d0d3c5079">head</a>()))</div>
|
|
832
|
+
<div class="line"><a name="l00771"></a><span class="lineno"> 771</span>  {</div>
|
|
833
|
+
<div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  <span class="comment">// No ES on the in edges - Infeasible block</span></div>
|
|
834
|
+
<div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  <span class="keywordflow">return</span>;</div>
|
|
835
|
+
<div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  }</div>
|
|
836
|
+
<div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a> pre_es = _preES[cycle-><a class="code" href="classSVF_1_1WTOCycle.html#ace60ecb07603681de5c3020d0d3c5079">head</a>()];</div>
|
|
837
|
+
<div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  <span class="comment">// set -widen-delay</span></div>
|
|
838
|
+
<div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  <a class="code" href="namespaceSVF.html#a9b707002523ece2ac54ca893ee9a2d4e">s32_t</a> widen_delay = <a class="code" href="classSVF_1_1Options.html#ab25f7ec430ba1d41597fc409b758b193">Options::WidenDelay</a>();</div>
|
|
839
|
+
<div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  <span class="keywordtype">bool</span> incresing = <span class="keyword">true</span>;</div>
|
|
840
|
+
<div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; ; i++)</div>
|
|
841
|
+
<div class="line"><a name="l00780"></a><span class="lineno"> 780</span>  {</div>
|
|
842
|
+
<div class="line"><a name="l00781"></a><span class="lineno"> 781</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CFBasicBlockNode.html">CFBasicBlockNode</a>* cycle_head = cycle-><a class="code" href="classSVF_1_1WTOCycle.html#ace60ecb07603681de5c3020d0d3c5079">head</a>();</div>
|
|
843
|
+
<div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  <span class="comment">// handle cycle head</span></div>
|
|
844
|
+
<div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  handleBlock(cycle_head);</div>
|
|
845
|
+
<div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  <span class="keywordflow">if</span> (i < widen_delay)</div>
|
|
846
|
+
<div class="line"><a name="l00785"></a><span class="lineno"> 785</span>  {</div>
|
|
847
|
+
<div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  <span class="keywordflow">if</span> (i> 0 && pre_es >= _postES[cycle_head])</div>
|
|
848
|
+
<div class="line"><a name="l00787"></a><span class="lineno"> 787</span>  {</div>
|
|
849
|
+
<div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  <span class="keywordflow">break</span>;</div>
|
|
850
|
+
<div class="line"><a name="l00789"></a><span class="lineno"> 789</span>  }</div>
|
|
851
|
+
<div class="line"><a name="l00790"></a><span class="lineno"> 790</span>  pre_es = _postES[cycle_head];</div>
|
|
852
|
+
<div class="line"><a name="l00791"></a><span class="lineno"> 791</span>  }</div>
|
|
853
|
+
<div class="line"><a name="l00792"></a><span class="lineno"> 792</span>  <span class="keywordflow">else</span></div>
|
|
854
|
+
<div class="line"><a name="l00793"></a><span class="lineno"> 793</span>  {</div>
|
|
855
|
+
<div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  <span class="keywordflow">if</span> (i >= widen_delay)</div>
|
|
856
|
+
<div class="line"><a name="l00795"></a><span class="lineno"> 795</span>  {</div>
|
|
857
|
+
<div class="line"><a name="l00796"></a><span class="lineno"> 796</span>  <span class="keywordflow">if</span> (incresing)</div>
|
|
858
|
+
<div class="line"><a name="l00797"></a><span class="lineno"> 797</span>  {</div>
|
|
859
|
+
<div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  <span class="keywordtype">bool</span> is_fixpoint = widenFixpointPass(cycle_head, pre_es);</div>
|
|
860
|
+
<div class="line"><a name="l00799"></a><span class="lineno"> 799</span>  <span class="keywordflow">if</span> (is_fixpoint)</div>
|
|
861
|
+
<div class="line"><a name="l00800"></a><span class="lineno"> 800</span>  incresing = <span class="keyword">false</span>;</div>
|
|
862
|
+
<div class="line"><a name="l00801"></a><span class="lineno"> 801</span>  }</div>
|
|
863
|
+
<div class="line"><a name="l00802"></a><span class="lineno"> 802</span>  <span class="keywordflow">if</span> (!incresing)</div>
|
|
864
|
+
<div class="line"><a name="l00803"></a><span class="lineno"> 803</span>  {</div>
|
|
865
|
+
<div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  <span class="keywordtype">bool</span> is_fixpoint = narrowFixpointPass(cycle_head, pre_es);</div>
|
|
866
|
+
<div class="line"><a name="l00805"></a><span class="lineno"> 805</span>  <span class="keywordflow">if</span> (is_fixpoint)</div>
|
|
867
|
+
<div class="line"><a name="l00806"></a><span class="lineno"> 806</span>  <span class="keywordflow">break</span>;</div>
|
|
868
|
+
<div class="line"><a name="l00807"></a><span class="lineno"> 807</span>  }</div>
|
|
869
|
+
<div class="line"><a name="l00808"></a><span class="lineno"> 808</span>  }</div>
|
|
870
|
+
<div class="line"><a name="l00809"></a><span class="lineno"> 809</span>  }</div>
|
|
871
|
+
<div class="line"><a name="l00810"></a><span class="lineno"> 810</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = cycle-><a class="code" href="classSVF_1_1WTOCycle.html#a807c883d1cfe98c791c903125742f95b">begin</a>(); it != cycle-><a class="code" href="classSVF_1_1WTOCycle.html#a03fd55dd34c48d22cefcaf6dc93f734a">end</a>(); ++it)</div>
|
|
872
|
+
<div class="line"><a name="l00811"></a><span class="lineno"> 811</span>  {</div>
|
|
873
|
+
<div class="line"><a name="l00812"></a><span class="lineno"> 812</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1WTOComponent.html">CFBasicBlockGWTOComp</a>* cur = *it;</div>
|
|
874
|
+
<div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1WTONode.html">CFBasicBlockGWTONode</a>* vertex = SVFUtil::dyn_cast<CFBasicBlockGWTONode>(cur))</div>
|
|
875
|
+
<div class="line"><a name="l00814"></a><span class="lineno"> 814</span>  {</div>
|
|
876
|
+
<div class="line"><a name="l00815"></a><span class="lineno"> 815</span>  handleBlock(vertex->node());</div>
|
|
877
|
+
<div class="line"><a name="l00816"></a><span class="lineno"> 816</span>  }</div>
|
|
878
|
+
<div class="line"><a name="l00817"></a><span class="lineno"> 817</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1WTOCycle.html">CFBasicBlockGWTOCycle</a>* cycle = SVFUtil::dyn_cast<CFBasicBlockGWTOCycle>(cur))</div>
|
|
879
|
+
<div class="line"><a name="l00818"></a><span class="lineno"> 818</span>  {</div>
|
|
880
|
+
<div class="line"><a name="l00819"></a><span class="lineno"> 819</span>  handleCycle(cycle);</div>
|
|
881
|
+
<div class="line"><a name="l00820"></a><span class="lineno"> 820</span>  }</div>
|
|
882
|
+
<div class="line"><a name="l00821"></a><span class="lineno"> 821</span>  <span class="keywordflow">else</span></div>
|
|
883
|
+
<div class="line"><a name="l00822"></a><span class="lineno"> 822</span>  {</div>
|
|
884
|
+
<div class="line"><a name="l00823"></a><span class="lineno"> 823</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"unknown WTO type!"</span>);</div>
|
|
885
|
+
<div class="line"><a name="l00824"></a><span class="lineno"> 824</span>  }</div>
|
|
886
|
+
<div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  }</div>
|
|
887
|
+
<div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  }</div>
|
|
888
|
+
<div class="line"><a name="l00827"></a><span class="lineno"> 827</span> }</div>
|
|
889
|
+
<div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  </div>
|
|
890
|
+
<div class="line"><a name="l00829"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#aa964763a5e9e99276707bd6678d1f37f"> 829</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1AbstractExecution.html#aa964763a5e9e99276707bd6678d1f37f">AbstractExecution::widenFixpointPass</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CFBasicBlockNode.html">CFBasicBlockNode</a>* cycle_head, <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a>& pre_es)</div>
|
|
891
|
+
<div class="line"><a name="l00830"></a><span class="lineno"> 830</span> {</div>
|
|
892
|
+
<div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  <span class="comment">// increasing iterations</span></div>
|
|
893
|
+
<div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a> new_pre_es = pre_es.<a class="code" href="classSVF_1_1IntervalExeState.html#abc8edb74e55f40dbc7bb5182d4ef1199">widening</a>(_postES[cycle_head]);</div>
|
|
894
|
+
<div class="line"><a name="l00833"></a><span class="lineno"> 833</span>  <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a> new_pre_vaddr_es = new_pre_es;</div>
|
|
895
|
+
<div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  _svfir2ExeState->widenAddrs(new_pre_es, _postES[cycle_head]);</div>
|
|
896
|
+
<div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  </div>
|
|
897
|
+
<div class="line"><a name="l00836"></a><span class="lineno"> 836</span>  <span class="keywordflow">if</span> (pre_es >= new_pre_es)</div>
|
|
898
|
+
<div class="line"><a name="l00837"></a><span class="lineno"> 837</span>  {</div>
|
|
899
|
+
<div class="line"><a name="l00838"></a><span class="lineno"> 838</span>  <span class="comment">// increasing iterations - fixpoint reached</span></div>
|
|
900
|
+
<div class="line"><a name="l00839"></a><span class="lineno"> 839</span>  pre_es = new_pre_es;</div>
|
|
901
|
+
<div class="line"><a name="l00840"></a><span class="lineno"> 840</span>  _postES[cycle_head] = pre_es;</div>
|
|
902
|
+
<div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
903
|
+
<div class="line"><a name="l00842"></a><span class="lineno"> 842</span>  }</div>
|
|
904
|
+
<div class="line"><a name="l00843"></a><span class="lineno"> 843</span>  <span class="keywordflow">else</span></div>
|
|
905
|
+
<div class="line"><a name="l00844"></a><span class="lineno"> 844</span>  {</div>
|
|
906
|
+
<div class="line"><a name="l00845"></a><span class="lineno"> 845</span>  pre_es = new_pre_es;</div>
|
|
907
|
+
<div class="line"><a name="l00846"></a><span class="lineno"> 846</span>  _postES[cycle_head] = pre_es;</div>
|
|
908
|
+
<div class="line"><a name="l00847"></a><span class="lineno"> 847</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
909
|
+
<div class="line"><a name="l00848"></a><span class="lineno"> 848</span>  }</div>
|
|
910
|
+
<div class="line"><a name="l00849"></a><span class="lineno"> 849</span> }</div>
|
|
911
|
+
<div class="line"><a name="l00850"></a><span class="lineno"> 850</span>  </div>
|
|
912
|
+
<div class="line"><a name="l00851"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#a331ce1725ac1441f5624a2211021f967"> 851</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1AbstractExecution.html#a331ce1725ac1441f5624a2211021f967">AbstractExecution::narrowFixpointPass</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CFBasicBlockNode.html">SVF::CFBasicBlockNode</a> *cycle_head, <a class="code" href="classSVF_1_1IntervalExeState.html">SVF::IntervalExeState</a> &pre_es)</div>
|
|
913
|
+
<div class="line"><a name="l00852"></a><span class="lineno"> 852</span> {</div>
|
|
914
|
+
<div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  <span class="comment">// decreasing iterations</span></div>
|
|
915
|
+
<div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a> new_pre_es = pre_es.<a class="code" href="classSVF_1_1IntervalExeState.html#a1e8f41b502167283ccb87bd128f232bc">narrowing</a>(_postES[cycle_head]);</div>
|
|
916
|
+
<div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a> new_pre_vaddr_es = new_pre_es;</div>
|
|
917
|
+
<div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  _svfir2ExeState->narrowAddrs(new_pre_es, _postES[cycle_head]);</div>
|
|
918
|
+
<div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  <span class="keywordflow">if</span> (new_pre_es >= pre_es)</div>
|
|
919
|
+
<div class="line"><a name="l00858"></a><span class="lineno"> 858</span>  {</div>
|
|
920
|
+
<div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  <span class="comment">// decreasing iterations - fixpoint reached</span></div>
|
|
921
|
+
<div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  pre_es = new_pre_es;</div>
|
|
922
|
+
<div class="line"><a name="l00861"></a><span class="lineno"> 861</span>  _postES[cycle_head] = pre_es;</div>
|
|
923
|
+
<div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
924
|
+
<div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  }</div>
|
|
925
|
+
<div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  <span class="keywordflow">else</span></div>
|
|
926
|
+
<div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  {</div>
|
|
927
|
+
<div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  pre_es = new_pre_es;</div>
|
|
928
|
+
<div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  _postES[cycle_head] = pre_es;</div>
|
|
929
|
+
<div class="line"><a name="l00868"></a><span class="lineno"> 868</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
930
|
+
<div class="line"><a name="l00869"></a><span class="lineno"> 869</span>  }</div>
|
|
931
|
+
<div class="line"><a name="l00870"></a><span class="lineno"> 870</span> }</div>
|
|
932
|
+
<div class="line"><a name="l00871"></a><span class="lineno"> 871</span>  </div>
|
|
933
|
+
<div class="line"><a name="l00872"></a><span class="lineno"> 872</span>  </div>
|
|
934
|
+
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  </div>
|
|
935
|
+
<div class="line"><a name="l00875"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#adb88a8be0bc1c1ac2d1546e9191c6f93"> 875</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AbstractExecution.html#adb88a8be0bc1c1ac2d1546e9191c6f93">AbstractExecution::handleFunc</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *func)</div>
|
|
936
|
+
<div class="line"><a name="l00876"></a><span class="lineno"> 876</span> {</div>
|
|
937
|
+
<div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  _stat->getFunctionTrace()++;</div>
|
|
938
|
+
<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  <a class="code" href="classSVF_1_1CFBasicBlockGWTO.html">CFBasicBlockGWTO</a>* wto = _funcToWTO[func];</div>
|
|
939
|
+
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  <span class="comment">// set function entry ES</span></div>
|
|
940
|
+
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = wto-><a class="code" href="classSVF_1_1WTO.html#a13e9082913aa4a14065687ccdd47642d">begin</a>(); it!= wto-><a class="code" href="classSVF_1_1WTO.html#a22b67a51964cb1d7882aab7e74b026f2">end</a>(); ++it)</div>
|
|
941
|
+
<div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  {</div>
|
|
942
|
+
<div class="line"><a name="l00882"></a><span class="lineno"> 882</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1WTOComponent.html">CFBasicBlockGWTOComp</a>* cur = *it;</div>
|
|
943
|
+
<div class="line"><a name="l00883"></a><span class="lineno"> 883</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1WTONode.html">CFBasicBlockGWTONode</a>* vertex = SVFUtil::dyn_cast<CFBasicBlockGWTONode>(cur))</div>
|
|
944
|
+
<div class="line"><a name="l00884"></a><span class="lineno"> 884</span>  {</div>
|
|
945
|
+
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span>  handleBlock(vertex->node());</div>
|
|
946
|
+
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span>  }</div>
|
|
947
|
+
<div class="line"><a name="l00887"></a><span class="lineno"> 887</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1WTOCycle.html">CFBasicBlockGWTOCycle</a>* cycle = SVFUtil::dyn_cast<CFBasicBlockGWTOCycle>(cur))</div>
|
|
948
|
+
<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>  {</div>
|
|
949
|
+
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  handleCycle(cycle);</div>
|
|
950
|
+
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  }</div>
|
|
951
|
+
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span>  <span class="keywordflow">else</span></div>
|
|
952
|
+
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>  {</div>
|
|
953
|
+
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"unknown WTO type!"</span>);</div>
|
|
954
|
+
<div class="line"><a name="l00894"></a><span class="lineno"> 894</span>  }</div>
|
|
955
|
+
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  }</div>
|
|
956
|
+
<div class="line"><a name="l00896"></a><span class="lineno"> 896</span> }</div>
|
|
957
|
+
<div class="line"><a name="l00897"></a><span class="lineno"> 897</span>  </div>
|
|
958
|
+
<div class="line"><a name="l00898"></a><span class="lineno"> 898</span>  </div>
|
|
959
|
+
<div class="line"><a name="l00899"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#a1d725fe50a7084bfa18bd47b941af885"> 899</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AbstractExecution.html#a1d725fe50a7084bfa18bd47b941af885">AbstractExecution::handleSVFStatement</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFStmt.html">SVFStmt</a> *stmt)</div>
|
|
960
|
+
<div class="line"><a name="l00900"></a><span class="lineno"> 900</span> {</div>
|
|
961
|
+
<div class="line"><a name="l00901"></a><span class="lineno"> 901</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1AddrStmt.html">AddrStmt</a> *addr = SVFUtil::dyn_cast<AddrStmt>(stmt))</div>
|
|
962
|
+
<div class="line"><a name="l00902"></a><span class="lineno"> 902</span>  {</div>
|
|
963
|
+
<div class="line"><a name="l00903"></a><span class="lineno"> 903</span>  _svfir2ExeState->translateAddr(addr);</div>
|
|
964
|
+
<div class="line"><a name="l00904"></a><span class="lineno"> 904</span>  }</div>
|
|
965
|
+
<div class="line"><a name="l00905"></a><span class="lineno"> 905</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1BinaryOPStmt.html">BinaryOPStmt</a> *binary = SVFUtil::dyn_cast<BinaryOPStmt>(stmt))</div>
|
|
966
|
+
<div class="line"><a name="l00906"></a><span class="lineno"> 906</span>  {</div>
|
|
967
|
+
<div class="line"><a name="l00907"></a><span class="lineno"> 907</span>  _svfir2ExeState->translateBinary(binary);</div>
|
|
968
|
+
<div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  }</div>
|
|
969
|
+
<div class="line"><a name="l00909"></a><span class="lineno"> 909</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CmpStmt.html">CmpStmt</a> *cmp = SVFUtil::dyn_cast<CmpStmt>(stmt))</div>
|
|
970
|
+
<div class="line"><a name="l00910"></a><span class="lineno"> 910</span>  {</div>
|
|
971
|
+
<div class="line"><a name="l00911"></a><span class="lineno"> 911</span>  _svfir2ExeState->translateCmp(cmp);</div>
|
|
972
|
+
<div class="line"><a name="l00912"></a><span class="lineno"> 912</span>  }</div>
|
|
973
|
+
<div class="line"><a name="l00913"></a><span class="lineno"> 913</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa<UnaryOPStmt>(stmt))</div>
|
|
974
|
+
<div class="line"><a name="l00914"></a><span class="lineno"> 914</span>  {</div>
|
|
975
|
+
<div class="line"><a name="l00915"></a><span class="lineno"> 915</span>  }</div>
|
|
976
|
+
<div class="line"><a name="l00916"></a><span class="lineno"> 916</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa<BranchStmt>(stmt))</div>
|
|
977
|
+
<div class="line"><a name="l00917"></a><span class="lineno"> 917</span>  {</div>
|
|
978
|
+
<div class="line"><a name="l00918"></a><span class="lineno"> 918</span>  <span class="comment">// branch stmt is handled in hasBranchES</span></div>
|
|
979
|
+
<div class="line"><a name="l00919"></a><span class="lineno"> 919</span>  }</div>
|
|
980
|
+
<div class="line"><a name="l00920"></a><span class="lineno"> 920</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1LoadStmt.html">LoadStmt</a> *load = SVFUtil::dyn_cast<LoadStmt>(stmt))</div>
|
|
981
|
+
<div class="line"><a name="l00921"></a><span class="lineno"> 921</span>  {</div>
|
|
982
|
+
<div class="line"><a name="l00922"></a><span class="lineno"> 922</span>  _svfir2ExeState->translateLoad(load);</div>
|
|
983
|
+
<div class="line"><a name="l00923"></a><span class="lineno"> 923</span>  }</div>
|
|
984
|
+
<div class="line"><a name="l00924"></a><span class="lineno"> 924</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1StoreStmt.html">StoreStmt</a> *store = SVFUtil::dyn_cast<StoreStmt>(stmt))</div>
|
|
985
|
+
<div class="line"><a name="l00925"></a><span class="lineno"> 925</span>  {</div>
|
|
986
|
+
<div class="line"><a name="l00926"></a><span class="lineno"> 926</span>  _svfir2ExeState->translateStore(store);</div>
|
|
987
|
+
<div class="line"><a name="l00927"></a><span class="lineno"> 927</span>  }</div>
|
|
988
|
+
<div class="line"><a name="l00928"></a><span class="lineno"> 928</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CopyStmt.html">CopyStmt</a> *<a class="code" href="cJSON_8cpp.html#a7669ee67a0563250c1efaa24d130e1ac">copy</a> = SVFUtil::dyn_cast<CopyStmt>(stmt))</div>
|
|
989
|
+
<div class="line"><a name="l00929"></a><span class="lineno"> 929</span>  {</div>
|
|
990
|
+
<div class="line"><a name="l00930"></a><span class="lineno"> 930</span>  _svfir2ExeState->translateCopy(<a class="code" href="cJSON_8cpp.html#a7669ee67a0563250c1efaa24d130e1ac">copy</a>);</div>
|
|
991
|
+
<div class="line"><a name="l00931"></a><span class="lineno"> 931</span>  }</div>
|
|
992
|
+
<div class="line"><a name="l00932"></a><span class="lineno"> 932</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1GepStmt.html">GepStmt</a> *gep = SVFUtil::dyn_cast<GepStmt>(stmt))</div>
|
|
993
|
+
<div class="line"><a name="l00933"></a><span class="lineno"> 933</span>  {</div>
|
|
994
|
+
<div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  _svfir2ExeState->translateGep(gep);</div>
|
|
995
|
+
<div class="line"><a name="l00935"></a><span class="lineno"> 935</span>  }</div>
|
|
996
|
+
<div class="line"><a name="l00936"></a><span class="lineno"> 936</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SelectStmt.html">SelectStmt</a> *select = SVFUtil::dyn_cast<SelectStmt>(stmt))</div>
|
|
997
|
+
<div class="line"><a name="l00937"></a><span class="lineno"> 937</span>  {</div>
|
|
998
|
+
<div class="line"><a name="l00938"></a><span class="lineno"> 938</span>  _svfir2ExeState->translateSelect(select);</div>
|
|
999
|
+
<div class="line"><a name="l00939"></a><span class="lineno"> 939</span>  }</div>
|
|
1000
|
+
<div class="line"><a name="l00940"></a><span class="lineno"> 940</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1PhiStmt.html">PhiStmt</a> *phi = SVFUtil::dyn_cast<PhiStmt>(stmt))</div>
|
|
1001
|
+
<div class="line"><a name="l00941"></a><span class="lineno"> 941</span>  {</div>
|
|
1002
|
+
<div class="line"><a name="l00942"></a><span class="lineno"> 942</span>  _svfir2ExeState->translatePhi(phi);</div>
|
|
1003
|
+
<div class="line"><a name="l00943"></a><span class="lineno"> 943</span>  }</div>
|
|
1004
|
+
<div class="line"><a name="l00944"></a><span class="lineno"> 944</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallPE.html">CallPE</a> *callPE = SVFUtil::dyn_cast<CallPE>(stmt))</div>
|
|
1005
|
+
<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>  {</div>
|
|
1006
|
+
<div class="line"><a name="l00946"></a><span class="lineno"> 946</span>  <span class="comment">// To handle Call Edge</span></div>
|
|
1007
|
+
<div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  _svfir2ExeState->translateCall(callPE);</div>
|
|
1008
|
+
<div class="line"><a name="l00948"></a><span class="lineno"> 948</span>  }</div>
|
|
1009
|
+
<div class="line"><a name="l00949"></a><span class="lineno"> 949</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1RetPE.html">RetPE</a> *retPE = SVFUtil::dyn_cast<RetPE>(stmt))</div>
|
|
1010
|
+
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span>  {</div>
|
|
1011
|
+
<div class="line"><a name="l00951"></a><span class="lineno"> 951</span>  _svfir2ExeState->translateRet(retPE);</div>
|
|
1012
|
+
<div class="line"><a name="l00952"></a><span class="lineno"> 952</span>  }</div>
|
|
1013
|
+
<div class="line"><a name="l00953"></a><span class="lineno"> 953</span>  <span class="keywordflow">else</span></div>
|
|
1014
|
+
<div class="line"><a name="l00954"></a><span class="lineno"> 954</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"implement this part"</span>);</div>
|
|
1015
|
+
<div class="line"><a name="l00955"></a><span class="lineno"> 955</span> }</div>
|
|
1016
|
+
<div class="line"><a name="l00956"></a><span class="lineno"> 956</span>  </div>
|
|
1017
|
+
<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>  </div>
|
|
1018
|
+
<div class="line"><a name="l00958"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#a97c5745ddcd0ce72e65dee09ff7afb42"> 958</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AbstractExecution.html#a97c5745ddcd0ce72e65dee09ff7afb42">AbstractExecution::SkipRecursiveCall</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a> *callNode)</div>
|
|
1019
|
+
<div class="line"><a name="l00959"></a><span class="lineno"> 959</span> {</div>
|
|
1020
|
+
<div class="line"><a name="l00960"></a><span class="lineno"> 960</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *callfun = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">SVFUtil::getCallee</a>(callNode-><a class="code" href="classSVF_1_1CallICFGNode.html#a90fd0b8e44fba1a7eb76d15bce085d66">getCallSite</a>());</div>
|
|
1021
|
+
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1RetICFGNode.html">RetICFGNode</a> *retNode = callNode-><a class="code" href="classSVF_1_1CallICFGNode.html#ae23a7540609879ac0379fc53b4e7eead">getRetICFGNode</a>();</div>
|
|
1022
|
+
<div class="line"><a name="l00962"></a><span class="lineno"> 962</span>  <span class="keywordflow">if</span> (retNode-><a class="code" href="classSVF_1_1ICFGNode.html#a6c68f52dd90728073fb79141df9b0661">getSVFStmts</a>().size() > 0)</div>
|
|
1023
|
+
<div class="line"><a name="l00963"></a><span class="lineno"> 963</span>  {</div>
|
|
1024
|
+
<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1RetPE.html">RetPE</a> *retPE = SVFUtil::dyn_cast<RetPE>(*retNode-><a class="code" href="classSVF_1_1ICFGNode.html#a6c68f52dd90728073fb79141df9b0661">getSVFStmts</a>().begin()))</div>
|
|
1025
|
+
<div class="line"><a name="l00965"></a><span class="lineno"> 965</span>  {</div>
|
|
1026
|
+
<div class="line"><a name="l00966"></a><span class="lineno"> 966</span>  <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a> es;</div>
|
|
1027
|
+
<div class="line"><a name="l00967"></a><span class="lineno"> 967</span>  <span class="keywordflow">if</span> (!retPE->getLHSVar()->isPointer() && !retPE->getLHSVar()->isConstDataOrAggDataButNotNullPtr())</div>
|
|
1028
|
+
<div class="line"><a name="l00968"></a><span class="lineno"> 968</span>  _svfir2ExeState->getEs()[retPE->getLHSVarID()] = <a class="code" href="classSVF_1_1IntervalValue.html#add3acad151d5af6c9a5f692f7a01e65b">IntervalValue::top</a>();</div>
|
|
1029
|
+
<div class="line"><a name="l00969"></a><span class="lineno"> 969</span>  }</div>
|
|
1030
|
+
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>  }</div>
|
|
1031
|
+
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>  <span class="keywordflow">if</span> (!retNode-><a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>().empty())</div>
|
|
1032
|
+
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span>  {</div>
|
|
1033
|
+
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span>  <span class="keywordflow">if</span> (retNode-><a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>().size() == 1)</div>
|
|
1034
|
+
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span>  {</div>
|
|
1035
|
+
<div class="line"><a name="l00975"></a><span class="lineno"> 975</span>  </div>
|
|
1036
|
+
<div class="line"><a name="l00976"></a><span class="lineno"> 976</span>  }</div>
|
|
1037
|
+
<div class="line"><a name="l00977"></a><span class="lineno"> 977</span>  <span class="keywordflow">else</span></div>
|
|
1038
|
+
<div class="line"><a name="l00978"></a><span class="lineno"> 978</span>  {</div>
|
|
1039
|
+
<div class="line"><a name="l00979"></a><span class="lineno"> 979</span>  <span class="keywordflow">return</span>;</div>
|
|
1040
|
+
<div class="line"><a name="l00980"></a><span class="lineno"> 980</span>  }</div>
|
|
1041
|
+
<div class="line"><a name="l00981"></a><span class="lineno"> 981</span>  }</div>
|
|
1042
|
+
<div class="line"><a name="l00982"></a><span class="lineno"> 982</span>  SkipRecursiveFunc(callfun);</div>
|
|
1043
|
+
<div class="line"><a name="l00983"></a><span class="lineno"> 983</span> }</div>
|
|
1044
|
+
<div class="line"><a name="l00984"></a><span class="lineno"> 984</span>  </div>
|
|
1045
|
+
<div class="line"><a name="l00985"></a><span class="lineno"><a class="line" href="classSVF_1_1AbstractExecution.html#a7e1c3edfa546182ad394116b37b834f9"> 985</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AbstractExecution.html#a7e1c3edfa546182ad394116b37b834f9">AbstractExecution::SkipRecursiveFunc</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *func)</div>
|
|
1046
|
+
<div class="line"><a name="l00986"></a><span class="lineno"> 986</span> {</div>
|
|
1047
|
+
<div class="line"><a name="l00987"></a><span class="lineno"> 987</span>  <span class="comment">// handle Recursive Funcs, go throw every relevant funcs/blocks.</span></div>
|
|
1048
|
+
<div class="line"><a name="l00988"></a><span class="lineno"> 988</span>  <span class="comment">// for every Call Argv, Ret , Global Vars, we make it as Top value</span></div>
|
|
1049
|
+
<div class="line"><a name="l00989"></a><span class="lineno"> 989</span>  <a class="code" href="classSVF_1_1FIFOWorkList.html">FIFOWorkList<const SVFBasicBlock *></a> blkWorkList;</div>
|
|
1050
|
+
<div class="line"><a name="l00990"></a><span class="lineno"> 990</span>  <a class="code" href="classSVF_1_1FIFOWorkList.html">FIFOWorkList<const ICFGNode *></a> instWorklist;</div>
|
|
1051
|
+
<div class="line"><a name="l00991"></a><span class="lineno"> 991</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFBasicBlock.html">SVFBasicBlock</a> * bb: func-><a class="code" href="classSVF_1_1SVFFunction.html#a90e39f78f4908f8a8ef3948d9158791c">getReachableBBs</a>())</div>
|
|
1052
|
+
<div class="line"><a name="l00992"></a><span class="lineno"> 992</span>  {</div>
|
|
1053
|
+
<div class="line"><a name="l00993"></a><span class="lineno"> 993</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* inst: bb->getInstructionList())</div>
|
|
1054
|
+
<div class="line"><a name="l00994"></a><span class="lineno"> 994</span>  {</div>
|
|
1055
|
+
<div class="line"><a name="l00995"></a><span class="lineno"> 995</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1ICFGNode.html">ICFGNode</a>* node = _icfg->getICFGNode(inst);</div>
|
|
1056
|
+
<div class="line"><a name="l00996"></a><span class="lineno"> 996</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFStmt.html">SVFStmt</a> *stmt: node-><a class="code" href="classSVF_1_1ICFGNode.html#a6c68f52dd90728073fb79141df9b0661">getSVFStmts</a>())</div>
|
|
1057
|
+
<div class="line"><a name="l00997"></a><span class="lineno"> 997</span>  {</div>
|
|
1058
|
+
<div class="line"><a name="l00998"></a><span class="lineno"> 998</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1StoreStmt.html">StoreStmt</a> *store = SVFUtil::dyn_cast<StoreStmt>(stmt))</div>
|
|
1059
|
+
<div class="line"><a name="l00999"></a><span class="lineno"> 999</span>  {</div>
|
|
1060
|
+
<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFVar.html">SVFVar</a> *rhsVar = store->getRHSVar();</div>
|
|
1061
|
+
<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> lhs = store->getLHSVarID();</div>
|
|
1062
|
+
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>  <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a> &curES = _svfir2ExeState->getEs();</div>
|
|
1063
|
+
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>  <span class="keywordflow">if</span> (curES.<a class="code" href="classSVF_1_1IntervalExeState.html#ad485a35730353c0e945bc84a034d9e45">inVarToAddrsTable</a>(lhs))</div>
|
|
1064
|
+
<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>  {</div>
|
|
1065
|
+
<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>  <span class="keywordflow">if</span> (!rhsVar-><a class="code" href="classSVF_1_1SVFVar.html#a3b61042079a6c9dc395f38925c6a1271">isPointer</a>() && !rhsVar-><a class="code" href="classSVF_1_1SVFVar.html#a091ef22d4fc428985d604b03f287a941">isConstDataOrAggDataButNotNullPtr</a>())</div>
|
|
1066
|
+
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>  {</div>
|
|
1067
|
+
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1AddressValue.html">SVFIR2ItvExeState::Addrs</a> &addrs =curES.<a class="code" href="classSVF_1_1IntervalExeState.html#a056e0db56033ac4dc041e6d82d614dbd">getAddrs</a>(lhs);</div>
|
|
1068
|
+
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>  assert(!addrs.<a class="code" href="classSVF_1_1AddressValue.html#aa7291f4b74bb824fb38b8c383fa0b6a0">empty</a>());</div>
|
|
1069
|
+
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &addr: addrs)</div>
|
|
1070
|
+
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>  {</div>
|
|
1071
|
+
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>  curES.<a class="code" href="classSVF_1_1IntervalESBase.html#adb26b186ee31bce7449a7b36faa24cc2">store</a>(addr, <a class="code" href="classSVF_1_1IntervalValue.html#add3acad151d5af6c9a5f692f7a01e65b">IntervalValue::top</a>());</div>
|
|
1072
|
+
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>  }</div>
|
|
1073
|
+
<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>  }</div>
|
|
1074
|
+
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>  }</div>
|
|
1075
|
+
<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>  }</div>
|
|
1076
|
+
<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>  }</div>
|
|
1077
|
+
<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>  }</div>
|
|
1078
|
+
<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>  }</div>
|
|
1079
|
+
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span> }</div>
|
|
1080
|
+
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>  </div>
|
|
1081
|
+
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span> <span class="comment">// count the size of memory map</span></div>
|
|
1082
|
+
<div class="line"><a name="l01022"></a><span class="lineno"><a class="line" href="classSVF_1_1AEStat.html#ae2cfe939670689a4ec5030c096a5f546"> 1022</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AEStat.html#ae2cfe939670689a4ec5030c096a5f546">AEStat::countStateSize</a>()</div>
|
|
1083
|
+
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span> {</div>
|
|
1084
|
+
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>  <span class="keywordflow">if</span> (<a class="code" href="cJSON_8h.html#ad43c3812e6d13e0518d9f8b8f463ffcf">count</a> == 0)</div>
|
|
1085
|
+
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>  {</div>
|
|
1086
|
+
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>  generalNumMap[<span class="stringliteral">"Global_ES_Var_AVG_Num"</span>] = <a class="code" href="classSVF_1_1IntervalExeState.html#a92b1b163493a74a31d30a261128edd05">IntervalExeState::globalES</a>.<a class="code" href="classSVF_1_1IntervalESBase.html#a903797577ba99ef57879774a3849bbfe">getVarToVal</a>().size();</div>
|
|
1087
|
+
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>  generalNumMap[<span class="stringliteral">"Global_ES_Loc_AVG_Num"</span>] = <a class="code" href="classSVF_1_1IntervalExeState.html#a92b1b163493a74a31d30a261128edd05">IntervalExeState::globalES</a>.<a class="code" href="classSVF_1_1IntervalESBase.html#af7451ea87d5117a90b5912a1e6f34e10">getLocToVal</a>().size();</div>
|
|
1088
|
+
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>  generalNumMap[<span class="stringliteral">"Global_ES_Var_Addr_AVG_Num"</span>] = <a class="code" href="classSVF_1_1IntervalExeState.html#a92b1b163493a74a31d30a261128edd05">IntervalExeState::globalES</a>.<a class="code" href="classSVF_1_1ExeState.html#a0710c9cc1a3c40c95cd362d49bea459b">getVarToAddrs</a>().size();</div>
|
|
1089
|
+
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>  generalNumMap[<span class="stringliteral">"Global_ES_Loc_Addr_AVG_Num"</span>] = <a class="code" href="classSVF_1_1IntervalExeState.html#a92b1b163493a74a31d30a261128edd05">IntervalExeState::globalES</a>.<a class="code" href="classSVF_1_1ExeState.html#aa7b897b107d722909f9de9dcbabad7cf">getLocToAddrs</a>().size();</div>
|
|
1090
|
+
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>  generalNumMap[<span class="stringliteral">"ES_Var_AVG_Num"</span>] = 0;</div>
|
|
1091
|
+
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>  generalNumMap[<span class="stringliteral">"ES_Loc_AVG_Num"</span>] = 0;</div>
|
|
1092
|
+
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>  generalNumMap[<span class="stringliteral">"ES_Var_Addr_AVG_Num"</span>] = 0;</div>
|
|
1093
|
+
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>  generalNumMap[<span class="stringliteral">"ES_Loc_Addr_AVG_Num"</span>] = 0;</div>
|
|
1094
|
+
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>  }</div>
|
|
1095
|
+
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>  ++<a class="code" href="cJSON_8h.html#ad43c3812e6d13e0518d9f8b8f463ffcf">count</a>;</div>
|
|
1096
|
+
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>  generalNumMap[<span class="stringliteral">"ES_Var_AVG_Num"</span>] += _ae->_svfir2ExeState->getEs().getVarToVal().size();</div>
|
|
1097
|
+
<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>  generalNumMap[<span class="stringliteral">"ES_Loc_AVG_Num"</span>] += _ae->_svfir2ExeState->getEs().getLocToVal().size();</div>
|
|
1098
|
+
<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>  generalNumMap[<span class="stringliteral">"ES_Var_Addr_AVG_Num"</span>] += _ae->_svfir2ExeState->getEs().getVarToAddrs().size();</div>
|
|
1099
|
+
<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>  generalNumMap[<span class="stringliteral">"ES_Loc_Addr_AVG_Num"</span>] += _ae->_svfir2ExeState->getEs().getLocToAddrs().size();</div>
|
|
1100
|
+
<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span> }</div>
|
|
1101
|
+
<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>  </div>
|
|
1102
|
+
<div class="line"><a name="l01042"></a><span class="lineno"><a class="line" href="classSVF_1_1AEStat.html#a5b246c2175c44454236242dcf426f21f"> 1042</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AEStat.html#a5b246c2175c44454236242dcf426f21f">AEStat::finializeStat</a>()</div>
|
|
1103
|
+
<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span> {</div>
|
|
1104
|
+
<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>  memUsage = getMemUsage();</div>
|
|
1105
|
+
<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>  <span class="keywordflow">if</span> (<a class="code" href="cJSON_8h.html#ad43c3812e6d13e0518d9f8b8f463ffcf">count</a> > 0)</div>
|
|
1106
|
+
<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>  {</div>
|
|
1107
|
+
<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>  generalNumMap[<span class="stringliteral">"ES_Var_AVG_Num"</span>] /= <a class="code" href="cJSON_8h.html#ad43c3812e6d13e0518d9f8b8f463ffcf">count</a>;</div>
|
|
1108
|
+
<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>  generalNumMap[<span class="stringliteral">"ES_Loc_AVG_Num"</span>] /= <a class="code" href="cJSON_8h.html#ad43c3812e6d13e0518d9f8b8f463ffcf">count</a>;</div>
|
|
1109
|
+
<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>  generalNumMap[<span class="stringliteral">"ES_Var_Addr_AVG_Num"</span>] /= <a class="code" href="cJSON_8h.html#ad43c3812e6d13e0518d9f8b8f463ffcf">count</a>;</div>
|
|
1110
|
+
<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>  generalNumMap[<span class="stringliteral">"ES_Loc_Addr_AVG_Num"</span>] /= <a class="code" href="cJSON_8h.html#ad43c3812e6d13e0518d9f8b8f463ffcf">count</a>;</div>
|
|
1111
|
+
<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>  }</div>
|
|
1112
|
+
<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>  generalNumMap[<span class="stringliteral">"SVF_STMT_NUM"</span>] = <a class="code" href="cJSON_8h.html#ad43c3812e6d13e0518d9f8b8f463ffcf">count</a>;</div>
|
|
1113
|
+
<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>  generalNumMap[<span class="stringliteral">"ICFG_Node_Num"</span>] = _ae->_svfir->getICFG()->nodeNum;</div>
|
|
1114
|
+
<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> callSiteNum = 0;</div>
|
|
1115
|
+
<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> extCallSiteNum = 0;</div>
|
|
1116
|
+
<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const SVFFunction *></a> funs;</div>
|
|
1117
|
+
<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &it: *_ae->_svfir->getICFG())</div>
|
|
1118
|
+
<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>  {</div>
|
|
1119
|
+
<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>  <span class="keywordflow">if</span> (it.second->getFun())</div>
|
|
1120
|
+
<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>  {</div>
|
|
1121
|
+
<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>  funs.insert(it.second->getFun());</div>
|
|
1122
|
+
<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>  }</div>
|
|
1123
|
+
<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a> *callNode = dyn_cast<CallICFGNode>(it.second))</div>
|
|
1124
|
+
<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>  {</div>
|
|
1125
|
+
<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>  <span class="keywordflow">if</span> (!<a class="code" href="namespaceSVF_1_1SVFUtil.html#a22ef185e767ff76c098e75126c885400">isExtCall</a>(callNode->getCallSite()))</div>
|
|
1126
|
+
<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>  {</div>
|
|
1127
|
+
<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>  callSiteNum++;</div>
|
|
1128
|
+
<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>  }</div>
|
|
1129
|
+
<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>  <span class="keywordflow">else</span></div>
|
|
1130
|
+
<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>  {</div>
|
|
1131
|
+
<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>  extCallSiteNum++;</div>
|
|
1132
|
+
<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>  }</div>
|
|
1133
|
+
<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>  }</div>
|
|
1134
|
+
<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>  }</div>
|
|
1135
|
+
<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>  generalNumMap[<span class="stringliteral">"Func_Num"</span>] = funs.size();</div>
|
|
1136
|
+
<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>  generalNumMap[<span class="stringliteral">"EXT_CallSite_Num"</span>] = extCallSiteNum;</div>
|
|
1137
|
+
<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>  generalNumMap[<span class="stringliteral">"NonEXT_CallSite_Num"</span>] = callSiteNum;</div>
|
|
1138
|
+
<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>  generalNumMap[<span class="stringliteral">"VarToAddrSize"</span>] = _ae->_svfir2ExeState->getEs().getVarToAddrs().size();</div>
|
|
1139
|
+
<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>  generalNumMap[<span class="stringliteral">"LocToAddrSize"</span>] = _ae->_svfir2ExeState->getEs().getLocToAddrs().size();</div>
|
|
1140
|
+
<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>  generalNumMap[<span class="stringliteral">"Bug_Num"</span>] = _ae->_nodeToBugInfo.size();</div>
|
|
1141
|
+
<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>  timeStatMap[<span class="stringliteral">"Total_Time(sec)"</span>] = (double)(endTime - startTime) / <a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div>
|
|
1142
|
+
<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>  </div>
|
|
1143
|
+
<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span> }</div>
|
|
1144
|
+
<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>  </div>
|
|
1145
|
+
<div class="line"><a name="l01085"></a><span class="lineno"><a class="line" href="classSVF_1_1AEStat.html#a798d07cc0a36ce0d9010ab86d1ec216f"> 1085</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AEStat.html#a798d07cc0a36ce0d9010ab86d1ec216f">AEStat::performStat</a>()</div>
|
|
1146
|
+
<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span> {</div>
|
|
1147
|
+
<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> fullName(_ae->_moduleName);</div>
|
|
1148
|
+
<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="cJSON_8h.html#a25d22ecc7e656d2c59332072684e8766">name</a>;</div>
|
|
1149
|
+
<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> moduleName;</div>
|
|
1150
|
+
<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>  <span class="keywordflow">if</span> (fullName.find(<span class="charliteral">'/'</span>) == std::string::npos)</div>
|
|
1151
|
+
<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>  {</div>
|
|
1152
|
+
<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="cJSON_8h.html#a25d22ecc7e656d2c59332072684e8766">name</a> = fullName;</div>
|
|
1153
|
+
<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>  moduleName = <a class="code" href="cJSON_8h.html#a25d22ecc7e656d2c59332072684e8766">name</a>.substr(0, fullName.find(<span class="charliteral">'.'</span>));</div>
|
|
1154
|
+
<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>  }</div>
|
|
1155
|
+
<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>  <span class="keywordflow">else</span></div>
|
|
1156
|
+
<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>  {</div>
|
|
1157
|
+
<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="cJSON_8h.html#a25d22ecc7e656d2c59332072684e8766">name</a> = fullName.substr(fullName.find(<span class="charliteral">'/'</span>), fullName.size());</div>
|
|
1158
|
+
<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>  moduleName = <a class="code" href="cJSON_8h.html#a25d22ecc7e656d2c59332072684e8766">name</a>.substr(0, fullName.find(<span class="charliteral">'.'</span>));</div>
|
|
1159
|
+
<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>  }</div>
|
|
1160
|
+
<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>  </div>
|
|
1161
|
+
<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <span class="stringliteral">"\n************************\n"</span>;</div>
|
|
1162
|
+
<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <span class="stringliteral">"################ (program : "</span> << moduleName << <span class="stringliteral">")###############\n"</span>;</div>
|
|
1163
|
+
<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>().flags(std::ios::left);</div>
|
|
1164
|
+
<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>  <span class="keywordtype">unsigned</span> field_width = 30;</div>
|
|
1165
|
+
<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>  <span class="keywordflow">for</span> (NUMStatMap::iterator it = generalNumMap.begin(), eit = generalNumMap.end(); it != eit; ++it)</div>
|
|
1166
|
+
<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>  {</div>
|
|
1167
|
+
<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>  <span class="comment">// format out put with width 20 space</span></div>
|
|
1168
|
+
<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>  std::cout << std::setw(field_width) << it->first << it->second << <span class="stringliteral">"\n"</span>;</div>
|
|
1169
|
+
<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>  }</div>
|
|
1170
|
+
<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <span class="stringliteral">"-------------------------------------------------------\n"</span>;</div>
|
|
1171
|
+
<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>  <span class="keywordflow">for</span> (TIMEStatMap::iterator it = timeStatMap.begin(), eit = timeStatMap.end(); it != eit; ++it)</div>
|
|
1172
|
+
<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>  {</div>
|
|
1173
|
+
<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>  <span class="comment">// format out put with width 20 space</span></div>
|
|
1174
|
+
<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(field_width) << it->first << it->second << <span class="stringliteral">"\n"</span>;</div>
|
|
1175
|
+
<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>  }</div>
|
|
1176
|
+
<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <span class="stringliteral">"Memory usage: "</span> << memUsage << <span class="stringliteral">"\n"</span>;</div>
|
|
1177
|
+
<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>  </div>
|
|
1178
|
+
<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <span class="stringliteral">"#######################################################"</span> << std::endl;</div>
|
|
1179
|
+
<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>().flush();</div>
|
|
1180
|
+
<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span> }</div>
|
|
1181
|
+
<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>  </div>
|
|
1182
|
+
<div class="line"><a name="l01122"></a><span class="lineno"><a class="line" href="classSVF_1_1AEStat.html#ae24590233a864e18a6b0948bef89201a"> 1122</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AEStat.html#ae24590233a864e18a6b0948bef89201a">AEStat::reportBug</a>()</div>
|
|
1183
|
+
<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span> {</div>
|
|
1184
|
+
<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>  </div>
|
|
1185
|
+
<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>  std::ofstream f;</div>
|
|
1186
|
+
<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#ad989eab7d521e9933ac8e46e1c29f662">Options::OutputName</a>().size() == 0)</div>
|
|
1187
|
+
<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>  {</div>
|
|
1188
|
+
<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>  f.open(<span class="stringliteral">"/dev/null"</span>);</div>
|
|
1189
|
+
<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>  }</div>
|
|
1190
|
+
<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>  <span class="keywordflow">else</span></div>
|
|
1191
|
+
<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>  {</div>
|
|
1192
|
+
<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>  f.open(<a class="code" href="classSVF_1_1Options.html#ad989eab7d521e9933ac8e46e1c29f662">Options::OutputName</a>());</div>
|
|
1193
|
+
<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>  }</div>
|
|
1194
|
+
<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>  </div>
|
|
1195
|
+
<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>  std::cerr << <span class="stringliteral">"######################Full Overflow ("</span> + std::to_string(_ae->_nodeToBugInfo.size()) + <span class="stringliteral">" found)######################\n"</span>;</div>
|
|
1196
|
+
<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>  f << <span class="stringliteral">"######################Full Overflow ("</span> + std::to_string(_ae->_nodeToBugInfo.size()) + <span class="stringliteral">" found)######################\n"</span>;</div>
|
|
1197
|
+
<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>  std::cerr << <span class="stringliteral">"---------------------------------------------\n"</span>;</div>
|
|
1198
|
+
<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>  f << <span class="stringliteral">"---------------------------------------------\n"</span>;</div>
|
|
1199
|
+
<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span>& it: _ae->_nodeToBugInfo)</div>
|
|
1200
|
+
<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>  {</div>
|
|
1201
|
+
<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>  std::cerr << it.second << <span class="stringliteral">"---------------------------------------------\n"</span>;</div>
|
|
1202
|
+
<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>  f << it.second << <span class="stringliteral">"---------------------------------------------\n"</span>;</div>
|
|
1203
|
+
<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>  }</div>
|
|
1204
|
+
<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span> }</div>
|
|
1205
|
+
<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>  </div>
|
|
1206
|
+
<div class="line"><a name="l01146"></a><span class="lineno"><a class="line" href="classSVF_1_1AEAPI.html#a243821a56807acf98be9d88f8947e01d"> 1146</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AEAPI.html#a243821a56807acf98be9d88f8947e01d">AEAPI::initExtFunMap</a>()</div>
|
|
1207
|
+
<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span> {</div>
|
|
1208
|
+
<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span> <span class="preprocessor">#define SSE_FUNC_PROCESS(LLVM_NAME ,FUNC_NAME) \</span></div>
|
|
1209
|
+
<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span> <span class="preprocessor"> auto sse_##FUNC_NAME = [this](const CallSite &cs) { \</span></div>
|
|
1210
|
+
<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span> <span class="preprocessor"> </span><span class="comment">/* run real ext function */</span><span class="preprocessor"> \</span></div>
|
|
1211
|
+
<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span> <span class="preprocessor"> IntervalExeState &es = _ae->_svfir2ExeState->getEs(); \</span></div>
|
|
1212
|
+
<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span> <span class="preprocessor"> u32_t rhs_id = _svfir->getValueNode(cs.getArgument(0)); \</span></div>
|
|
1213
|
+
<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span> <span class="preprocessor"> if (!es.inVarToValTable(rhs_id)) return; \</span></div>
|
|
1214
|
+
<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span> <span class="preprocessor"> u32_t rhs = _ae->_svfir2ExeState->getEs()[rhs_id].lb().getNumeral(); \</span></div>
|
|
1215
|
+
<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span> <span class="preprocessor"> s32_t res = FUNC_NAME(rhs); \</span></div>
|
|
1216
|
+
<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span> <span class="preprocessor"> u32_t lhsId = _svfir->getValueNode(cs.getInstruction()); \</span></div>
|
|
1217
|
+
<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span> <span class="preprocessor"> _ae->_svfir2ExeState->getEs()[lhsId] = IntervalValue(res); \</span></div>
|
|
1218
|
+
<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span> <span class="preprocessor"> return; \</span></div>
|
|
1219
|
+
<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span> <span class="preprocessor"> }; \</span></div>
|
|
1220
|
+
<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span> <span class="preprocessor"> _func_map[#FUNC_NAME] = sse_##FUNC_NAME; \</span></div>
|
|
1221
|
+
<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span> <span class="preprocessor"></span> </div>
|
|
1222
|
+
<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>  <a class="code" href="AbstractExecution_8cpp.html#a6ded577f411d8dd34071fba96989f93a">SSE_FUNC_PROCESS</a>(<a class="code" href="extapi_8c.html#abe92a0aebef4717d08c64655ac44c9af">isalnum</a>, <a class="code" href="extapi_8c.html#abe92a0aebef4717d08c64655ac44c9af">isalnum</a>);</div>
|
|
1223
|
+
<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>  <a class="code" href="AbstractExecution_8cpp.html#a6ded577f411d8dd34071fba96989f93a">SSE_FUNC_PROCESS</a>(<a class="code" href="extapi_8c.html#af947cbf1ae303e5297c9d68c68a6b9cb">isalpha</a>, <a class="code" href="extapi_8c.html#af947cbf1ae303e5297c9d68c68a6b9cb">isalpha</a>);</div>
|
|
1224
|
+
<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>  <a class="code" href="AbstractExecution_8cpp.html#a6ded577f411d8dd34071fba96989f93a">SSE_FUNC_PROCESS</a>(<a class="code" href="extapi_8c.html#aaecd098576b00440124c44580144e8d5">isblank</a>, <a class="code" href="extapi_8c.html#aaecd098576b00440124c44580144e8d5">isblank</a>);</div>
|
|
1225
|
+
<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>  <a class="code" href="AbstractExecution_8cpp.html#a6ded577f411d8dd34071fba96989f93a">SSE_FUNC_PROCESS</a>(<a class="code" href="extapi_8c.html#a0008a4e8e7889734dc1d83297de07158">iscntrl</a>, <a class="code" href="extapi_8c.html#a0008a4e8e7889734dc1d83297de07158">iscntrl</a>);</div>
|
|
1226
|
+
<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>  <a class="code" href="AbstractExecution_8cpp.html#a6ded577f411d8dd34071fba96989f93a">SSE_FUNC_PROCESS</a>(<a class="code" href="extapi_8c.html#a3fa45b35c8abf67a950b6d3d4063dede">isdigit</a>, <a class="code" href="extapi_8c.html#a3fa45b35c8abf67a950b6d3d4063dede">isdigit</a>);</div>
|
|
1227
|
+
<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>  <a class="code" href="AbstractExecution_8cpp.html#a6ded577f411d8dd34071fba96989f93a">SSE_FUNC_PROCESS</a>(<a class="code" href="extapi_8c.html#a49f40fd869fd0c90e4497fda08c89561">isgraph</a>, <a class="code" href="extapi_8c.html#a49f40fd869fd0c90e4497fda08c89561">isgraph</a>);</div>
|
|
1228
|
+
<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>  <a class="code" href="AbstractExecution_8cpp.html#a6ded577f411d8dd34071fba96989f93a">SSE_FUNC_PROCESS</a>(<a class="code" href="extapi_8c.html#a99355d8f0fb41ec43effb95189db0ed4">isprint</a>, <a class="code" href="extapi_8c.html#a99355d8f0fb41ec43effb95189db0ed4">isprint</a>);</div>
|
|
1229
|
+
<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>  <a class="code" href="AbstractExecution_8cpp.html#a6ded577f411d8dd34071fba96989f93a">SSE_FUNC_PROCESS</a>(<a class="code" href="extapi_8c.html#a9d60842d6ae065229ba810e6b01110da">ispunct</a>, <a class="code" href="extapi_8c.html#a9d60842d6ae065229ba810e6b01110da">ispunct</a>);</div>
|
|
1230
|
+
<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>  <a class="code" href="AbstractExecution_8cpp.html#a6ded577f411d8dd34071fba96989f93a">SSE_FUNC_PROCESS</a>(<a class="code" href="extapi_8c.html#a84b34b0058324ae5c0eae4956cf00cc5">isspace</a>, <a class="code" href="extapi_8c.html#a84b34b0058324ae5c0eae4956cf00cc5">isspace</a>);</div>
|
|
1231
|
+
<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>  <a class="code" href="AbstractExecution_8cpp.html#a6ded577f411d8dd34071fba96989f93a">SSE_FUNC_PROCESS</a>(<a class="code" href="extapi_8c.html#adadd6582d46775aab6a51e29d16d9f77">isupper</a>, <a class="code" href="extapi_8c.html#adadd6582d46775aab6a51e29d16d9f77">isupper</a>);</div>
|
|
1232
|
+
<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>  <a class="code" href="AbstractExecution_8cpp.html#a6ded577f411d8dd34071fba96989f93a">SSE_FUNC_PROCESS</a>(<a class="code" href="extapi_8c.html#adaf3aadefe3fc4fb07b6be0d7b880f53">isxdigit</a>, <a class="code" href="extapi_8c.html#adaf3aadefe3fc4fb07b6be0d7b880f53">isxdigit</a>);</div>
|
|
1233
|
+
<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>  <a class="code" href="AbstractExecution_8cpp.html#a6ded577f411d8dd34071fba96989f93a">SSE_FUNC_PROCESS</a>(<a class="code" href="namespacellvm.html">llvm</a>.sin.f64, sin);</div>
|
|
1234
|
+
<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>  <a class="code" href="AbstractExecution_8cpp.html#a6ded577f411d8dd34071fba96989f93a">SSE_FUNC_PROCESS</a>(<a class="code" href="namespacellvm.html">llvm</a>.cos.f64, cos);</div>
|
|
1235
|
+
<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>  <a class="code" href="AbstractExecution_8cpp.html#a6ded577f411d8dd34071fba96989f93a">SSE_FUNC_PROCESS</a>(<a class="code" href="namespacellvm.html">llvm</a>.tan.f64, tan);</div>
|
|
1236
|
+
<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>  <a class="code" href="AbstractExecution_8cpp.html#a6ded577f411d8dd34071fba96989f93a">SSE_FUNC_PROCESS</a>(<a class="code" href="namespacellvm.html">llvm</a>.log.f64, log);</div>
|
|
1237
|
+
<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>  <a class="code" href="AbstractExecution_8cpp.html#a6ded577f411d8dd34071fba96989f93a">SSE_FUNC_PROCESS</a>(sinh, sinh);</div>
|
|
1238
|
+
<div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>  <a class="code" href="AbstractExecution_8cpp.html#a6ded577f411d8dd34071fba96989f93a">SSE_FUNC_PROCESS</a>(cosh, cosh);</div>
|
|
1239
|
+
<div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>  <a class="code" href="AbstractExecution_8cpp.html#a6ded577f411d8dd34071fba96989f93a">SSE_FUNC_PROCESS</a>(tanh, tanh);</div>
|
|
1240
|
+
<div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>  </div>
|
|
1241
|
+
<div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>  <span class="keyword">auto</span> sse_svf_assert = [<span class="keyword">this</span>](<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallSite.html">CallSite</a> &cs)</div>
|
|
1242
|
+
<div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>  {</div>
|
|
1243
|
+
<div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a>* callNode = SVFUtil::dyn_cast<CallICFGNode>(_svfir->getICFG()->getICFGNode(cs.getInstruction()));</div>
|
|
1244
|
+
<div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>  _checkpoints.erase(callNode);</div>
|
|
1245
|
+
<div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arg0 = _svfir->getValueNode(cs.getArgument(0));</div>
|
|
1246
|
+
<div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>  <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a> &es = _ae->_svfir2ExeState->getEs();</div>
|
|
1247
|
+
<div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>  es[arg0].meet_with(<a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>(1, 1));</div>
|
|
1248
|
+
<div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>  <span class="keywordflow">if</span> (es[arg0].equals(<a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>(1, 1)))</div>
|
|
1249
|
+
<div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>  {</div>
|
|
1250
|
+
<div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a05dc00b2bd9a8176aae31b6cfffe725d">SVFUtil::sucMsg</a>(<span class="stringliteral">"The assertion is successfully verified!!\n"</span>);</div>
|
|
1251
|
+
<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>  }</div>
|
|
1252
|
+
<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>  <span class="keywordflow">else</span></div>
|
|
1253
|
+
<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>  {</div>
|
|
1254
|
+
<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">SVFUtil::errs</a>() <<<span class="stringliteral">"svf_assert Fail. "</span> << cs.getInstruction()->toString() << <span class="stringliteral">"\n"</span>;</div>
|
|
1255
|
+
<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>  assert(<span class="keyword">false</span>);</div>
|
|
1256
|
+
<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>  }</div>
|
|
1257
|
+
<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>  <span class="keywordflow">return</span>;</div>
|
|
1258
|
+
<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>  };</div>
|
|
1259
|
+
<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>  _func_map[<span class="stringliteral">"svf_assert"</span>] = sse_svf_assert;</div>
|
|
1260
|
+
<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>  </div>
|
|
1261
|
+
<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>  <span class="keyword">auto</span> svf_print = [&](<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallSite.html">CallSite</a> &cs)</div>
|
|
1262
|
+
<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>  {</div>
|
|
1263
|
+
<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>  <span class="keywordflow">if</span> (cs.arg_size() < 2) <span class="keywordflow">return</span>;</div>
|
|
1264
|
+
<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>  <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a> &es = _ae->_svfir2ExeState->getEs();</div>
|
|
1265
|
+
<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> num_id = _svfir->getValueNode(cs.getArgument(0));</div>
|
|
1266
|
+
<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> text = strRead(cs.getArgument(1));</div>
|
|
1267
|
+
<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>  assert(es.<a class="code" href="classSVF_1_1IntervalExeState.html#aab316a63c25483eefc38bed0a86a0e7e">inVarToValTable</a>(num_id) && <span class="stringliteral">"print() should pass integer"</span>);</div>
|
|
1268
|
+
<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> itv = es[num_id];</div>
|
|
1269
|
+
<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>  std::cout << <span class="stringliteral">"Text: "</span> << text <<<span class="stringliteral">", Value: "</span> << cs.getArgument(0)-><a class="code" href="classSVF_1_1IntervalESBase.html#ab5d7ac23f8334fa32ae0a78c8f1d9fa9">toString</a>() << <span class="stringliteral">", PrintVal: "</span> << itv.<a class="code" href="classSVF_1_1IntervalValue.html#a5d73cc2aa0a6ed49e8301fa7b0cd5045">toString</a>() << std::endl;</div>
|
|
1270
|
+
<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>  <span class="keywordflow">return</span>;</div>
|
|
1271
|
+
<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>  };</div>
|
|
1272
|
+
<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>  _func_map[<span class="stringliteral">"svf_print"</span>] = svf_print;</div>
|
|
1273
|
+
<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>  </div>
|
|
1274
|
+
<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>  <span class="comment">// init _checkpoint_names</span></div>
|
|
1275
|
+
<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>  _checkpoint_names.insert(<span class="stringliteral">"svf_assert"</span>);</div>
|
|
1276
|
+
<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span> };</div>
|
|
1277
|
+
<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>  </div>
|
|
1278
|
+
<div class="line"><a name="l01218"></a><span class="lineno"><a class="line" href="classSVF_1_1AEAPI.html#a3df0f1b34893f44904dce62e6641a58e"> 1218</a></span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1AEAPI.html#a3df0f1b34893f44904dce62e6641a58e">AEAPI::strRead</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a>* rhs)</div>
|
|
1279
|
+
<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span> {</div>
|
|
1280
|
+
<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>  <span class="comment">// sse read string nodeID->string</span></div>
|
|
1281
|
+
<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>  <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a> &es = _ae->_svfir2ExeState->getEs();</div>
|
|
1282
|
+
<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> str0;</div>
|
|
1283
|
+
<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>  </div>
|
|
1284
|
+
<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = 0; <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < <a class="code" href="classSVF_1_1Options.html#aaab923c093730b1670a54f09340b1bd5">Options::MaxFieldLimit</a>(); <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>++)</div>
|
|
1285
|
+
<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>  {</div>
|
|
1286
|
+
<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>  <span class="comment">// dead loop for string and break if there's a \0. If no \0, it will throw err.</span></div>
|
|
1287
|
+
<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>  <span class="keywordflow">if</span> (!es.<a class="code" href="classSVF_1_1IntervalExeState.html#ad485a35730353c0e945bc84a034d9e45">inVarToAddrsTable</a>(_svfir->getValueNode(rhs))) <span class="keywordflow">continue</span>;</div>
|
|
1288
|
+
<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>  <a class="code" href="classSVF_1_1AddressValue.html">Addrs</a> expr0 = _ae->_svfir2ExeState->getGepObjAddress(_svfir->getValueNode(rhs), <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
1289
|
+
<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> val = <a class="code" href="classSVF_1_1IntervalValue.html#aa027be2f9243ce4cae799b265b019443">IntervalValue::bottom</a>();</div>
|
|
1290
|
+
<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &addr: expr0)</div>
|
|
1291
|
+
<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>  {</div>
|
|
1292
|
+
<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>  val.<a class="code" href="classSVF_1_1IntervalValue.html#a3771eb932069dcad8212009efc411b99">join_with</a>(es.<a class="code" href="classSVF_1_1IntervalExeState.html#a960ec3359dfcb5e89fb66120c868ac5e">load</a>(addr));</div>
|
|
1293
|
+
<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>  }</div>
|
|
1294
|
+
<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>  <span class="keywordflow">if</span> (!val.<a class="code" href="classSVF_1_1IntervalValue.html#a523826aede7ad22736beed0c8223b6b0">is_numeral</a>())</div>
|
|
1295
|
+
<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>  {</div>
|
|
1296
|
+
<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>  <span class="keywordflow">break</span>;</div>
|
|
1297
|
+
<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>  }</div>
|
|
1298
|
+
<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>  <span class="keywordflow">if</span> ((<span class="keywordtype">char</span>) val.<a class="code" href="classSVF_1_1IntervalValue.html#ae081b5c462f8ed5b306719822e35cea9">getNumeral</a>() == <span class="charliteral">'\0'</span>)</div>
|
|
1299
|
+
<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>  {</div>
|
|
1300
|
+
<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>  <span class="keywordflow">break</span>;</div>
|
|
1301
|
+
<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>  }</div>
|
|
1302
|
+
<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>  str0.push_back((<span class="keywordtype">char</span>) val.<a class="code" href="classSVF_1_1IntervalValue.html#ae081b5c462f8ed5b306719822e35cea9">getNumeral</a>());</div>
|
|
1303
|
+
<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>  }</div>
|
|
1304
|
+
<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>  <span class="keywordflow">return</span> str0;</div>
|
|
1305
|
+
<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span> }</div>
|
|
1306
|
+
<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>  </div>
|
|
1307
|
+
<div class="line"><a name="l01247"></a><span class="lineno"><a class="line" href="classSVF_1_1AEAPI.html#af64d742317f2ddad87b87012225ddaaa"> 1247</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AEAPI.html#af64d742317f2ddad87b87012225ddaaa">AEAPI::handleExtAPI</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a> *call)</div>
|
|
1308
|
+
<div class="line"><a name="l01248"></a><span class="lineno"> 1248</span> {</div>
|
|
1309
|
+
<div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *fun = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">SVFUtil::getCallee</a>(call-><a class="code" href="classSVF_1_1CallICFGNode.html#a90fd0b8e44fba1a7eb76d15bce085d66">getCallSite</a>());</div>
|
|
1310
|
+
<div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>  assert(fun && <span class="stringliteral">"SVFFunction* is nullptr"</span>);</div>
|
|
1311
|
+
<div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>  <a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a9815a5b31ac7dc21239d08e5b9f61106">SVFUtil::getSVFCallSite</a>(call-><a class="code" href="classSVF_1_1CallICFGNode.html#a90fd0b8e44fba1a7eb76d15bce085d66">getCallSite</a>());</div>
|
|
1312
|
+
<div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>  <a class="code" href="classSVF_1_1AEAPI.html#a29ab312d273e6c9c32a40d61861afb04">ExtAPIType</a> extType = UNCLASSIFIED;</div>
|
|
1313
|
+
<div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>  <span class="comment">// get type of mem api</span></div>
|
|
1314
|
+
<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &annotation: fun-><a class="code" href="classSVF_1_1SVFFunction.html#a067bd6dbaf74a028d546fa56b095791b">getAnnotations</a>())</div>
|
|
1315
|
+
<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>  {</div>
|
|
1316
|
+
<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>  <span class="keywordflow">if</span> (annotation.find(<span class="stringliteral">"MEMCPY"</span>) != std::string::npos)</div>
|
|
1317
|
+
<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>  extType = MEMCPY;</div>
|
|
1318
|
+
<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>  <span class="keywordflow">if</span> (annotation.find(<span class="stringliteral">"MEMSET"</span>) != std::string::npos)</div>
|
|
1319
|
+
<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>  extType = MEMSET;</div>
|
|
1320
|
+
<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>  <span class="keywordflow">if</span> (annotation.find(<span class="stringliteral">"STRCPY"</span>) != std::string::npos)</div>
|
|
1321
|
+
<div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>  extType = STRCPY;</div>
|
|
1322
|
+
<div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>  <span class="keywordflow">if</span> (annotation.find(<span class="stringliteral">"STRCAT"</span>) != std::string::npos)</div>
|
|
1323
|
+
<div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>  extType = STRCAT;</div>
|
|
1324
|
+
<div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>  }</div>
|
|
1325
|
+
<div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>  <span class="keywordflow">if</span> (extType == UNCLASSIFIED)</div>
|
|
1326
|
+
<div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>  {</div>
|
|
1327
|
+
<div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>  <span class="keywordflow">if</span> (_func_map.find(fun-><a class="code" href="classSVF_1_1SVFValue.html#a2401b022638769f59f86ab424a189b6e">getName</a>()) != _func_map.end())</div>
|
|
1328
|
+
<div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>  {</div>
|
|
1329
|
+
<div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>  _func_map[fun-><a class="code" href="classSVF_1_1SVFValue.html#a2401b022638769f59f86ab424a189b6e">getName</a>()](cs);</div>
|
|
1330
|
+
<div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>  }</div>
|
|
1331
|
+
<div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>  <span class="keywordflow">else</span></div>
|
|
1332
|
+
<div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>  {</div>
|
|
1333
|
+
<div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> lhsId = _svfir->getValueNode(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a9815a5b31ac7dc21239d08e5b9f61106">SVFUtil::getSVFCallSite</a>(call-><a class="code" href="classSVF_1_1CallICFGNode.html#a90fd0b8e44fba1a7eb76d15bce085d66">getCallSite</a>()).<a class="code" href="classSVF_1_1CallSite.html#ac2a0091dab3543a398da890b947e42ef">getInstruction</a>());</div>
|
|
1334
|
+
<div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>  <span class="keywordflow">if</span> (_ae->_svfir2ExeState->getEs().inVarToAddrsTable(lhsId))</div>
|
|
1335
|
+
<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>  {</div>
|
|
1336
|
+
<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>  </div>
|
|
1337
|
+
<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>  }</div>
|
|
1338
|
+
<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>  <span class="keywordflow">else</span></div>
|
|
1339
|
+
<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>  {</div>
|
|
1340
|
+
<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>  _ae->_svfir2ExeState->getEs()[lhsId] = <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>();</div>
|
|
1341
|
+
<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>  }</div>
|
|
1342
|
+
<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>  <span class="keywordflow">return</span>;</div>
|
|
1343
|
+
<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>  }</div>
|
|
1344
|
+
<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>  }</div>
|
|
1345
|
+
<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>  <span class="comment">// 1. memcpy functions like memcpy_chk, strncpy, annotate("MEMCPY"), annotate("BUF_CHECK:Arg0, Arg2"), annotate("BUF_CHECK:Arg1, Arg2")</span></div>
|
|
1346
|
+
<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extType == MEMCPY)</div>
|
|
1347
|
+
<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>  {</div>
|
|
1348
|
+
<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> len = _ae->_svfir2ExeState->getEs()[_svfir->getValueNode(cs.<a class="code" href="classSVF_1_1CallSite.html#a9e7c94ee7f689466111487e03b2cebcc">getArgument</a>(2))];</div>
|
|
1349
|
+
<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>  handleMemcpy(cs.<a class="code" href="classSVF_1_1CallSite.html#a9e7c94ee7f689466111487e03b2cebcc">getArgument</a>(0), cs.<a class="code" href="classSVF_1_1CallSite.html#a9e7c94ee7f689466111487e03b2cebcc">getArgument</a>(1), len, 0);</div>
|
|
1350
|
+
<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>  }</div>
|
|
1351
|
+
<div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extType == MEMSET)</div>
|
|
1352
|
+
<div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>  {</div>
|
|
1353
|
+
<div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>  <span class="comment">// memset dst is arg0, elem is arg1, size is arg2</span></div>
|
|
1354
|
+
<div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> len = _ae->_svfir2ExeState->getEs()[_svfir->getValueNode(cs.<a class="code" href="classSVF_1_1CallSite.html#a9e7c94ee7f689466111487e03b2cebcc">getArgument</a>(2))];</div>
|
|
1355
|
+
<div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> elem = _ae->_svfir2ExeState->getEs()[_svfir->getValueNode(cs.<a class="code" href="classSVF_1_1CallSite.html#a9e7c94ee7f689466111487e03b2cebcc">getArgument</a>(1))];</div>
|
|
1356
|
+
<div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>  handleMemset(cs.<a class="code" href="classSVF_1_1CallSite.html#a9e7c94ee7f689466111487e03b2cebcc">getArgument</a>(0), elem, len);</div>
|
|
1357
|
+
<div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>  }</div>
|
|
1358
|
+
<div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extType == STRCPY)</div>
|
|
1359
|
+
<div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>  {</div>
|
|
1360
|
+
<div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>  handleStrcpy(call);</div>
|
|
1361
|
+
<div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>  }</div>
|
|
1362
|
+
<div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extType == STRCAT)</div>
|
|
1363
|
+
<div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>  {</div>
|
|
1364
|
+
<div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>  handleStrcat(call);</div>
|
|
1365
|
+
<div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>  }</div>
|
|
1366
|
+
<div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>  <span class="keywordflow">else</span></div>
|
|
1367
|
+
<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>  {</div>
|
|
1368
|
+
<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>  </div>
|
|
1369
|
+
<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>  }</div>
|
|
1370
|
+
<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>  <span class="keywordflow">return</span>;</div>
|
|
1371
|
+
<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span> }</div>
|
|
1372
|
+
<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>  </div>
|
|
1373
|
+
<div class="line"><a name="l01313"></a><span class="lineno"><a class="line" href="classSVF_1_1AEAPI.html#a2dc09f4a21cf629ebe500f856cf86bb4"> 1313</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AEAPI.html#a2dc09f4a21cf629ebe500f856cf86bb4">AEAPI::collectCheckPoint</a>()</div>
|
|
1374
|
+
<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span> {</div>
|
|
1375
|
+
<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>  <span class="comment">// traverse every ICFGNode</span></div>
|
|
1376
|
+
<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = _ae->_svfir->getICFG()->begin(); it != _ae->_svfir->getICFG()->end(); ++it)</div>
|
|
1377
|
+
<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>  {</div>
|
|
1378
|
+
<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1ICFGNode.html">ICFGNode</a>* node = it->second;</div>
|
|
1379
|
+
<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a> *call = SVFUtil::dyn_cast<CallICFGNode>(node))</div>
|
|
1380
|
+
<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>  {</div>
|
|
1381
|
+
<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *fun = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">SVFUtil::getCallee</a>(call->getCallSite()))</div>
|
|
1382
|
+
<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>  {</div>
|
|
1383
|
+
<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>  <span class="keywordflow">if</span> (_checkpoint_names.find(fun->getName()) != _checkpoint_names.end())</div>
|
|
1384
|
+
<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>  {</div>
|
|
1385
|
+
<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>  _checkpoints.insert(call);</div>
|
|
1386
|
+
<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>  }</div>
|
|
1387
|
+
<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>  }</div>
|
|
1388
|
+
<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>  }</div>
|
|
1389
|
+
<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>  }</div>
|
|
1390
|
+
<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span> }</div>
|
|
1391
|
+
<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>  </div>
|
|
1392
|
+
<div class="line"><a name="l01332"></a><span class="lineno"><a class="line" href="classSVF_1_1AEAPI.html#aa2a97be698768ddbcab0fec27bde60c8"> 1332</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AEAPI.html#aa2a97be698768ddbcab0fec27bde60c8">AEAPI::checkPointAllSet</a>()</div>
|
|
1393
|
+
<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span> {</div>
|
|
1394
|
+
<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>  <span class="keywordflow">if</span> (_checkpoints.size() == 0)</div>
|
|
1395
|
+
<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>  {</div>
|
|
1396
|
+
<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>  <span class="keywordflow">return</span>;</div>
|
|
1397
|
+
<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>  }</div>
|
|
1398
|
+
<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>  <span class="keywordflow">else</span></div>
|
|
1399
|
+
<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>  {</div>
|
|
1400
|
+
<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">SVFUtil::errs</a>() << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a05dc00b2bd9a8176aae31b6cfffe725d">SVFUtil::sucMsg</a>(<span class="stringliteral">"There exists checkpoints not checked!!\n"</span>);</div>
|
|
1401
|
+
<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a>* call: _checkpoints)</div>
|
|
1402
|
+
<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>  {</div>
|
|
1403
|
+
<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">SVFUtil::errs</a>() << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a05dc00b2bd9a8176aae31b6cfffe725d">SVFUtil::sucMsg</a>(call->toString() + <span class="stringliteral">"\n"</span>);</div>
|
|
1404
|
+
<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>  }</div>
|
|
1405
|
+
<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>  }</div>
|
|
1406
|
+
<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>  </div>
|
|
1407
|
+
<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span> }</div>
|
|
1408
|
+
<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>  </div>
|
|
1409
|
+
<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>  </div>
|
|
1410
|
+
<div class="line"><a name="l01350"></a><span class="lineno"><a class="line" href="classSVF_1_1AEAPI.html#a13abbe8b8622df63e7f160732bc1cbfc"> 1350</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AEAPI.html#a13abbe8b8622df63e7f160732bc1cbfc">AEAPI::handleStrcpy</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a> *call)</div>
|
|
1411
|
+
<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span> {</div>
|
|
1412
|
+
<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>  <span class="comment">// strcpy, __strcpy_chk, stpcpy , wcscpy, __wcscpy_chk</span></div>
|
|
1413
|
+
<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>  <span class="comment">// get the dst and src</span></div>
|
|
1414
|
+
<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>  <a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a9815a5b31ac7dc21239d08e5b9f61106">SVFUtil::getSVFCallSite</a>(call-><a class="code" href="classSVF_1_1CallICFGNode.html#a90fd0b8e44fba1a7eb76d15bce085d66">getCallSite</a>());</div>
|
|
1415
|
+
<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a>* arg0Val = cs.<a class="code" href="classSVF_1_1CallSite.html#a9e7c94ee7f689466111487e03b2cebcc">getArgument</a>(0);</div>
|
|
1416
|
+
<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a>* arg1Val = cs.<a class="code" href="classSVF_1_1CallSite.html#a9e7c94ee7f689466111487e03b2cebcc">getArgument</a>(1);</div>
|
|
1417
|
+
<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> strLen = getStrlen(arg1Val);</div>
|
|
1418
|
+
<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>  <span class="comment">// no need to -1, since it has \0 as the last byte</span></div>
|
|
1419
|
+
<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>  handleMemcpy(arg0Val, arg1Val, strLen,strLen.<a class="code" href="classSVF_1_1IntervalValue.html#a0df07a2659cbf3a918de5b0d7c407264">lb</a>().<a class="code" href="classSVF_1_1NumericLiteral.html#a4181e5e15e10304ea524e5f8b2a3f576">getNumeral</a>());</div>
|
|
1420
|
+
<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span> }</div>
|
|
1421
|
+
<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>  </div>
|
|
1422
|
+
<div class="line"><a name="l01362"></a><span class="lineno"><a class="line" href="classSVF_1_1AEAPI.html#afe6d49fd36a96bda165654eb393be6f2"> 1362</a></span> <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1AEAPI.html#afe6d49fd36a96bda165654eb393be6f2">AEAPI::getAllocaInstByteSize</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1AddrStmt.html">AddrStmt</a> *addr)</div>
|
|
1423
|
+
<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span> {</div>
|
|
1424
|
+
<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1ObjVar.html">ObjVar</a>* objvar = SVFUtil::dyn_cast<ObjVar>(addr-><a class="code" href="classSVF_1_1AssignStmt.html#ad03d28d16754c9049dd4d0ad3b6c1e28">getRHSVar</a>()))</div>
|
|
1425
|
+
<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>  {</div>
|
|
1426
|
+
<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>  objvar->getType();</div>
|
|
1427
|
+
<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>  <span class="keywordflow">if</span> (objvar->getMemObj()->isConstantByteSize())</div>
|
|
1428
|
+
<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>  {</div>
|
|
1429
|
+
<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> sz = objvar->getMemObj()->getByteSizeOfObj();</div>
|
|
1430
|
+
<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>  <span class="keywordflow">return</span> sz;</div>
|
|
1431
|
+
<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>  }</div>
|
|
1432
|
+
<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>  </div>
|
|
1433
|
+
<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>  <span class="keywordflow">else</span></div>
|
|
1434
|
+
<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>  {</div>
|
|
1435
|
+
<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>  <span class="keyword">const</span> std::vector<SVFValue*>& sizes = addr-><a class="code" href="classSVF_1_1AddrStmt.html#a7fe84b92317fb93914053cc48d313acc">getArrSize</a>();</div>
|
|
1436
|
+
<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>  <span class="comment">// Default element size is set to 1.</span></div>
|
|
1437
|
+
<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> elementSize = 1;</div>
|
|
1438
|
+
<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> res = elementSize;</div>
|
|
1439
|
+
<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a>* value: sizes)</div>
|
|
1440
|
+
<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>  {</div>
|
|
1441
|
+
<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>  <span class="keywordflow">if</span> (!_ae->_svfir2ExeState->inVarToValTable(_svfir->getValueNode(value)))</div>
|
|
1442
|
+
<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>  {</div>
|
|
1443
|
+
<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>  _ae->_svfir2ExeState->getEs()[_svfir->getValueNode(value)] = <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>(<a class="code" href="classSVF_1_1Options.html#aaab923c093730b1670a54f09340b1bd5">Options::MaxFieldLimit</a>());</div>
|
|
1444
|
+
<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>  }</div>
|
|
1445
|
+
<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> itv = _ae->_svfir2ExeState->getEs()[_svfir->getValueNode(value)];</div>
|
|
1446
|
+
<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>  res = res * itv.<a class="code" href="classSVF_1_1IntervalValue.html#adac2dc2c9f744a071ad3f0175ed40cd9">ub</a>().<a class="code" href="classSVF_1_1NumericLiteral.html#a4181e5e15e10304ea524e5f8b2a3f576">getNumeral</a>() > <a class="code" href="classSVF_1_1Options.html#aaab923c093730b1670a54f09340b1bd5">Options::MaxFieldLimit</a>()? <a class="code" href="classSVF_1_1Options.html#aaab923c093730b1670a54f09340b1bd5">Options::MaxFieldLimit</a>(): res * itv.<a class="code" href="classSVF_1_1IntervalValue.html#adac2dc2c9f744a071ad3f0175ed40cd9">ub</a>().<a class="code" href="classSVF_1_1NumericLiteral.html#a4181e5e15e10304ea524e5f8b2a3f576">getNumeral</a>();</div>
|
|
1447
|
+
<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>  }</div>
|
|
1448
|
+
<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>  <span class="keywordflow">return</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a>)res;</div>
|
|
1449
|
+
<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>  }</div>
|
|
1450
|
+
<div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>  }</div>
|
|
1451
|
+
<div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>  assert (<span class="keyword">false</span> && <span class="stringliteral">"Addr rhs value is not ObjVar"</span>);</div>
|
|
1452
|
+
<div class="line"><a name="l01392"></a><span class="lineno"> 1392</span> }</div>
|
|
1453
|
+
<div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>  </div>
|
|
1454
|
+
<div class="line"><a name="l01394"></a><span class="lineno"><a class="line" href="classSVF_1_1AEAPI.html#a4efc7447db13da26ce284218d6c01059"> 1394</a></span> <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> <a class="code" href="classSVF_1_1AEAPI.html#a4efc7447db13da26ce284218d6c01059">AEAPI::traceMemoryAllocationSize</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a> *value)</div>
|
|
1455
|
+
<div class="line"><a name="l01395"></a><span class="lineno"> 1395</span> {</div>
|
|
1456
|
+
<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>  <a class="code" href="classSVF_1_1FILOWorkList.html">SVF::FILOWorkList<const SVFValue *></a> worklist;</div>
|
|
1457
|
+
<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const SVFValue *></a> visited;</div>
|
|
1458
|
+
<div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>  visited.insert(value);</div>
|
|
1459
|
+
<div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<const ICFGNode *, IntervalValue></a> gep_offsets;</div>
|
|
1460
|
+
<div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>  worklist.<a class="code" href="classSVF_1_1FILOWorkList.html#afcf3fcda18e8d3e2bad70a51376c0ce1">push</a>(value);</div>
|
|
1461
|
+
<div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> total_bytes(0);</div>
|
|
1462
|
+
<div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>  <span class="keywordflow">while</span> (!worklist.<a class="code" href="classSVF_1_1FILOWorkList.html#a071a624c91def82a4bbbf3806c7b7eea">empty</a>())</div>
|
|
1463
|
+
<div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>  {</div>
|
|
1464
|
+
<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>  value = worklist.<a class="code" href="classSVF_1_1FILOWorkList.html#a3fd9acb6d09fd142bfd402fdf8cac93b">pop</a>();</div>
|
|
1465
|
+
<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* ins = SVFUtil::dyn_cast<SVFInstruction>(value))</div>
|
|
1466
|
+
<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>  {</div>
|
|
1467
|
+
<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1ICFGNode.html">ICFGNode</a>* node = _svfir->getICFG()->getICFGNode(ins);</div>
|
|
1468
|
+
<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a>* callnode = SVFUtil::dyn_cast<CallICFGNode>(node))</div>
|
|
1469
|
+
<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>  {</div>
|
|
1470
|
+
<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>  <span class="comment">//to handle Ret PE</span></div>
|
|
1471
|
+
<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>  AccessMemoryViaRetNode(callnode, worklist, visited);</div>
|
|
1472
|
+
<div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>  }</div>
|
|
1473
|
+
<div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFStmt.html">SVFStmt</a> *stmt: node-><a class="code" href="classSVF_1_1ICFGNode.html#a6c68f52dd90728073fb79141df9b0661">getSVFStmts</a>())</div>
|
|
1474
|
+
<div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>  {</div>
|
|
1475
|
+
<div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CopyStmt.html">CopyStmt</a> *<a class="code" href="cJSON_8cpp.html#a7669ee67a0563250c1efaa24d130e1ac">copy</a> = SVFUtil::dyn_cast<CopyStmt>(stmt))</div>
|
|
1476
|
+
<div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>  {</div>
|
|
1477
|
+
<div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>  <span class="comment">// Copy Stmt, forward to lhs</span></div>
|
|
1478
|
+
<div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>  AccessMemoryViaCopyStmt(<a class="code" href="cJSON_8cpp.html#a7669ee67a0563250c1efaa24d130e1ac">copy</a>, worklist, visited);</div>
|
|
1479
|
+
<div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>  }</div>
|
|
1480
|
+
<div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1LoadStmt.html">LoadStmt</a> *load = SVFUtil::dyn_cast<LoadStmt>(stmt))</div>
|
|
1481
|
+
<div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>  {</div>
|
|
1482
|
+
<div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>  <span class="comment">// Load Stmt, forward to the Var from last Store Stmt</span></div>
|
|
1483
|
+
<div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>  AccessMemoryViaLoadStmt(load, worklist, visited);</div>
|
|
1484
|
+
<div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>  }</div>
|
|
1485
|
+
<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1GepStmt.html">GepStmt</a> *gep = SVFUtil::dyn_cast<GepStmt>(stmt))</div>
|
|
1486
|
+
<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>  {</div>
|
|
1487
|
+
<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>  <span class="comment">// there are 3 type of gepStmt</span></div>
|
|
1488
|
+
<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>  <span class="comment">// 1. ptr get offset</span></div>
|
|
1489
|
+
<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>  <span class="comment">// 2. struct get field</span></div>
|
|
1490
|
+
<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>  <span class="comment">// 3. array get element</span></div>
|
|
1491
|
+
<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>  <span class="comment">// for array gep, there are two kind of overflow checking</span></div>
|
|
1492
|
+
<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>  <span class="comment">// Arr [Struct.C * 10] arr, Struct.C {i32 a, i32 b}</span></div>
|
|
1493
|
+
<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>  <span class="comment">// arr[11].a = **, it is "lhs = gep *arr, 0 (ptr), 11 (arrIdx), 0 (ptr), 0(struct field)"</span></div>
|
|
1494
|
+
<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>  <span class="comment">// 1) in this case arrIdx 11 is overflow.</span></div>
|
|
1495
|
+
<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>  <span class="comment">// Other case,</span></div>
|
|
1496
|
+
<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>  <span class="comment">// Struct.C {i32 a, [i32*10] b, i32 c}, C.b[11] = 1</span></div>
|
|
1497
|
+
<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>  <span class="comment">// it is "lhs - gep *C, 0(ptr), 1(struct field), 0(ptr), 11(arrIdx)"</span></div>
|
|
1498
|
+
<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>  <span class="comment">// 2) in this case arrIdx 11 is larger than its getOffsetVar.Type Array([i32*10])</span></div>
|
|
1499
|
+
<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>  </div>
|
|
1500
|
+
<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>  <span class="comment">// therefore, if last getOffsetVar.Type is not the Array, just check the overall offset and its</span></div>
|
|
1501
|
+
<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>  <span class="comment">// gep source type size (together with totalOffset along the value flow).</span></div>
|
|
1502
|
+
<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>  <span class="comment">// Alloc Size: TBD, but totalOffset + current Gep offset</span></div>
|
|
1503
|
+
<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>  </div>
|
|
1504
|
+
<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>  <span class="comment">// otherwise, if last getOffsetVar.Type is the Array, check the last idx and array. (just offset,</span></div>
|
|
1505
|
+
<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>  <span class="comment">// not with totalOffset during check)</span></div>
|
|
1506
|
+
<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>  <span class="comment">// Alloc Size: getOffsetVar.TypeByteSize()</span></div>
|
|
1507
|
+
<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>  </div>
|
|
1508
|
+
<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>  <span class="comment">// make sure it has OffsetVarAndGepType Pair</span></div>
|
|
1509
|
+
<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>  <span class="keywordflow">if</span> (gep->getOffsetVarAndGepTypePairVec().size() > 0)</div>
|
|
1510
|
+
<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>  {</div>
|
|
1511
|
+
<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>  <span class="comment">// check if last OffsetVarAndGepType Pair is Array</span></div>
|
|
1512
|
+
<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* gepType = gep->getOffsetVarAndGepTypePairVec().back().second;</div>
|
|
1513
|
+
<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>  <span class="comment">// if its array</span></div>
|
|
1514
|
+
<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>  <span class="keywordflow">if</span> (gepType-><a class="code" href="classSVF_1_1SVFType.html#a330084f9a3deb6e5acb52a8ee3eb7fe4">isArrayTy</a>())</div>
|
|
1515
|
+
<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>  {</div>
|
|
1516
|
+
<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> rhs_type_bytes = gepType-><a class="code" href="classSVF_1_1SVFType.html#a95b8031f1e15d49c7d68628be1d05aae">getByteSize</a>();</div>
|
|
1517
|
+
<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>  <span class="comment">// if gepStmt's base var is Array, compares offset with the arraysize</span></div>
|
|
1518
|
+
<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>(rhs_type_bytes);</div>
|
|
1519
|
+
<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>  }</div>
|
|
1520
|
+
<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>  <span class="keywordflow">else</span></div>
|
|
1521
|
+
<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>  {</div>
|
|
1522
|
+
<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> byteOffset;</div>
|
|
1523
|
+
<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>  <span class="keywordflow">if</span> (gep->isConstantOffset())</div>
|
|
1524
|
+
<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>  {</div>
|
|
1525
|
+
<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>  byteOffset = <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>(gep->accumulateConstantByteOffset());</div>
|
|
1526
|
+
<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>  }</div>
|
|
1527
|
+
<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>  <span class="keywordflow">else</span></div>
|
|
1528
|
+
<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>  {</div>
|
|
1529
|
+
<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> byteOffset = _ae->_svfir2ExeState->getByteOffset(gep);</div>
|
|
1530
|
+
<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>  }</div>
|
|
1531
|
+
<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>  <span class="comment">// for variable offset, join with accumulate gep offset</span></div>
|
|
1532
|
+
<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>  gep_offsets[gep->getICFGNode()] = byteOffset;</div>
|
|
1533
|
+
<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>  total_bytes = total_bytes + byteOffset;</div>
|
|
1534
|
+
<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>  }</div>
|
|
1535
|
+
<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>  }</div>
|
|
1536
|
+
<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>  <span class="keywordflow">if</span> (!visited.count(gep->getRHSVar()->getValue()))</div>
|
|
1537
|
+
<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>  {</div>
|
|
1538
|
+
<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>  visited.insert(gep->getRHSVar()->getValue());</div>
|
|
1539
|
+
<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>  worklist.<a class="code" href="classSVF_1_1FILOWorkList.html#afcf3fcda18e8d3e2bad70a51376c0ce1">push</a>(gep->getRHSVar()->getValue());</div>
|
|
1540
|
+
<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>  }</div>
|
|
1541
|
+
<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>  }</div>
|
|
1542
|
+
<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1AddrStmt.html">AddrStmt</a> *addr = SVFUtil::dyn_cast<AddrStmt>(stmt))</div>
|
|
1543
|
+
<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>  {</div>
|
|
1544
|
+
<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>  <span class="comment">// addrStmt is source node.</span></div>
|
|
1545
|
+
<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arr_type_size = getAllocaInstByteSize(addr);</div>
|
|
1546
|
+
<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>(arr_type_size) - total_bytes;</div>
|
|
1547
|
+
<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>  }</div>
|
|
1548
|
+
<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>  }</div>
|
|
1549
|
+
<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>  }</div>
|
|
1550
|
+
<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFGlobalValue.html">SVF::SVFGlobalValue</a>* gvalue = SVFUtil::dyn_cast<SVF::SVFGlobalValue>(value))</div>
|
|
1551
|
+
<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>  {</div>
|
|
1552
|
+
<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arr_type_size = 0;</div>
|
|
1553
|
+
<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* svftype = gvalue->getType();</div>
|
|
1554
|
+
<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>  <span class="keywordflow">if</span> (SVFUtil::isa<SVFPointerType>(svftype))</div>
|
|
1555
|
+
<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>  {</div>
|
|
1556
|
+
<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>  <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFArrayType.html">SVFArrayType</a>* ptrArrType = SVFUtil::dyn_cast<SVFArrayType>(getPointeeElement(_svfir->getValueNode(value))))</div>
|
|
1557
|
+
<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>  arr_type_size = ptrArrType-><a class="code" href="classSVF_1_1SVFType.html#a95b8031f1e15d49c7d68628be1d05aae">getByteSize</a>();</div>
|
|
1558
|
+
<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>  <span class="keywordflow">else</span></div>
|
|
1559
|
+
<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>  arr_type_size = svftype-><a class="code" href="classSVF_1_1SVFType.html#a95b8031f1e15d49c7d68628be1d05aae">getByteSize</a>();</div>
|
|
1560
|
+
<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>  }</div>
|
|
1561
|
+
<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>  <span class="keywordflow">else</span></div>
|
|
1562
|
+
<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>  arr_type_size = svftype-><a class="code" href="classSVF_1_1SVFType.html#a95b8031f1e15d49c7d68628be1d05aae">getByteSize</a>();</div>
|
|
1563
|
+
<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>(arr_type_size) - total_bytes;</div>
|
|
1564
|
+
<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>  }</div>
|
|
1565
|
+
<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFArgument.html">SVF::SVFArgument</a>* arg = SVFUtil::dyn_cast<SVF::SVFArgument>(value))</div>
|
|
1566
|
+
<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>  {</div>
|
|
1567
|
+
<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>  <span class="comment">// to handle call PE</span></div>
|
|
1568
|
+
<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>  AccessMemoryViaCallArgs(arg, worklist, visited);</div>
|
|
1569
|
+
<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>  }</div>
|
|
1570
|
+
<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>  <span class="keywordflow">else</span></div>
|
|
1571
|
+
<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>  {</div>
|
|
1572
|
+
<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>  <span class="comment">// maybe SVFConstant</span></div>
|
|
1573
|
+
<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>(0);</div>
|
|
1574
|
+
<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>  }</div>
|
|
1575
|
+
<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>  }</div>
|
|
1576
|
+
<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>(0);</div>
|
|
1577
|
+
<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span> }</div>
|
|
1578
|
+
<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>  </div>
|
|
1579
|
+
<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>  </div>
|
|
1580
|
+
<div class="line"><a name="l01526"></a><span class="lineno"><a class="line" href="classSVF_1_1AEAPI.html#ae0519df0b6927a2d077c3d46beeaa9f7"> 1526</a></span> <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> <a class="code" href="classSVF_1_1AEAPI.html#ae0519df0b6927a2d077c3d46beeaa9f7">AEAPI::getStrlen</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFValue.html">SVF::SVFValue</a> *strValue)</div>
|
|
1581
|
+
<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span> {</div>
|
|
1582
|
+
<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>  <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a> &es = _ae->_svfir2ExeState->getEs();</div>
|
|
1583
|
+
<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> dst_size = traceMemoryAllocationSize(strValue);</div>
|
|
1584
|
+
<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> len = 0;</div>
|
|
1585
|
+
<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstid = _svfir->getValueNode(strValue);</div>
|
|
1586
|
+
<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> elemSize = 1;</div>
|
|
1587
|
+
<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>  <span class="keywordflow">if</span> (_ae->_svfir2ExeState->inVarToAddrsTable(dstid))</div>
|
|
1588
|
+
<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>  {</div>
|
|
1589
|
+
<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = 0; <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < dst_size.<a class="code" href="classSVF_1_1IntervalValue.html#a0df07a2659cbf3a918de5b0d7c407264">lb</a>().getNumeral(); <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>++)</div>
|
|
1590
|
+
<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>  {</div>
|
|
1591
|
+
<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>  <a class="code" href="classSVF_1_1AddressValue.html">Addrs</a> expr0 = _ae->_svfir2ExeState->getGepObjAddress(dstid, <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
1592
|
+
<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> val = <a class="code" href="classSVF_1_1IntervalValue.html#aa027be2f9243ce4cae799b265b019443">IntervalValue::bottom</a>();</div>
|
|
1593
|
+
<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &addr: expr0)</div>
|
|
1594
|
+
<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>  {</div>
|
|
1595
|
+
<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>  val.<a class="code" href="classSVF_1_1IntervalValue.html#a3771eb932069dcad8212009efc411b99">join_with</a>(es.<a class="code" href="classSVF_1_1IntervalExeState.html#a960ec3359dfcb5e89fb66120c868ac5e">load</a>(addr));</div>
|
|
1596
|
+
<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>  }</div>
|
|
1597
|
+
<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>  <span class="keywordflow">if</span> (val.<a class="code" href="classSVF_1_1IntervalValue.html#a523826aede7ad22736beed0c8223b6b0">is_numeral</a>() && (<span class="keywordtype">char</span>) val.<a class="code" href="classSVF_1_1IntervalValue.html#ae081b5c462f8ed5b306719822e35cea9">getNumeral</a>() == <span class="charliteral">'\0'</span>)</div>
|
|
1598
|
+
<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>  {</div>
|
|
1599
|
+
<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>  <span class="keywordflow">break</span>;</div>
|
|
1600
|
+
<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>  }</div>
|
|
1601
|
+
<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>  ++len;</div>
|
|
1602
|
+
<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>  }</div>
|
|
1603
|
+
<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>  <span class="keywordflow">if</span> (strValue-><a class="code" href="classSVF_1_1SVFValue.html#a11f2d9b6e969ede6fca2c204cc15b821">getType</a>()-><a class="code" href="classSVF_1_1SVFType.html#a330084f9a3deb6e5acb52a8ee3eb7fe4">isArrayTy</a>())</div>
|
|
1604
|
+
<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>  {</div>
|
|
1605
|
+
<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>  elemSize = SVFUtil::dyn_cast<SVFArrayType>(strValue-><a class="code" href="classSVF_1_1SVFValue.html#a11f2d9b6e969ede6fca2c204cc15b821">getType</a>())->getTypeOfElement()->getByteSize();</div>
|
|
1606
|
+
<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>  }</div>
|
|
1607
|
+
<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strValue-><a class="code" href="classSVF_1_1SVFValue.html#a11f2d9b6e969ede6fca2c204cc15b821">getType</a>()-><a class="code" href="classSVF_1_1SVFType.html#a870b63af2bf9fe43cdf1df3d56b20f6c">isPointerTy</a>())</div>
|
|
1608
|
+
<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>  {</div>
|
|
1609
|
+
<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* elemType = getPointeeElement(_svfir->getValueNode(strValue)))</div>
|
|
1610
|
+
<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>  {</div>
|
|
1611
|
+
<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>  elemSize = elemType->getByteSize();</div>
|
|
1612
|
+
<div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>  }</div>
|
|
1613
|
+
<div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>  <span class="keywordflow">else</span></div>
|
|
1614
|
+
<div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>  {</div>
|
|
1615
|
+
<div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>  elemSize = 1;</div>
|
|
1616
|
+
<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>  }</div>
|
|
1617
|
+
<div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>  }</div>
|
|
1618
|
+
<div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>  <span class="keywordflow">else</span></div>
|
|
1619
|
+
<div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>  {</div>
|
|
1620
|
+
<div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"we cannot support this type"</span>);</div>
|
|
1621
|
+
<div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>  }</div>
|
|
1622
|
+
<div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>  }</div>
|
|
1623
|
+
<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>  <span class="keywordflow">if</span> (len == 0)</div>
|
|
1624
|
+
<div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>  {</div>
|
|
1625
|
+
<div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>((<a class="code" href="namespaceSVF.html#ad781b0b14e89773e774072b280658ef3">s64_t</a>)0, (<a class="code" href="namespaceSVF.html#ad781b0b14e89773e774072b280658ef3">s64_t</a>)<a class="code" href="classSVF_1_1Options.html#aaab923c093730b1670a54f09340b1bd5">Options::MaxFieldLimit</a>());</div>
|
|
1626
|
+
<div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>  }</div>
|
|
1627
|
+
<div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>  <span class="keywordflow">else</span></div>
|
|
1628
|
+
<div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>  {</div>
|
|
1629
|
+
<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>(len * elemSize);</div>
|
|
1630
|
+
<div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>  }</div>
|
|
1631
|
+
<div class="line"><a name="l01577"></a><span class="lineno"> 1577</span> }</div>
|
|
1632
|
+
<div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>  </div>
|
|
1633
|
+
<div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>  </div>
|
|
1634
|
+
<div class="line"><a name="l01580"></a><span class="lineno"><a class="line" href="classSVF_1_1AEAPI.html#a4d160903c3bbedbd486be39c40c2c836"> 1580</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AEAPI.html#a4d160903c3bbedbd486be39c40c2c836">AEAPI::handleStrcat</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">SVF::CallICFGNode</a> *call)</div>
|
|
1635
|
+
<div class="line"><a name="l01581"></a><span class="lineno"> 1581</span> {</div>
|
|
1636
|
+
<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>  <span class="comment">// __strcat_chk, strcat, __wcscat_chk, wcscat, __strncat_chk, strncat, __wcsncat_chk, wcsncat</span></div>
|
|
1637
|
+
<div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>  <span class="comment">// to check it is strcat group or strncat group</span></div>
|
|
1638
|
+
<div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *fun = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">SVFUtil::getCallee</a>(call-><a class="code" href="classSVF_1_1CallICFGNode.html#a90fd0b8e44fba1a7eb76d15bce085d66">getCallSite</a>());</div>
|
|
1639
|
+
<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>  <span class="keyword">const</span> std::vector<std::string> strcatGroup = {<span class="stringliteral">"__strcat_chk"</span>, <span class="stringliteral">"strcat"</span>, <span class="stringliteral">"__wcscat_chk"</span>, <span class="stringliteral">"wcscat"</span>};</div>
|
|
1640
|
+
<div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>  <span class="keyword">const</span> std::vector<std::string> strncatGroup = {<span class="stringliteral">"__strncat_chk"</span>, <span class="stringliteral">"strncat"</span>, <span class="stringliteral">"__wcsncat_chk"</span>, <span class="stringliteral">"wcsncat"</span>};</div>
|
|
1641
|
+
<div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>  <span class="keywordflow">if</span> (std::find(strcatGroup.begin(), strcatGroup.end(), fun-><a class="code" href="classSVF_1_1SVFValue.html#a2401b022638769f59f86ab424a189b6e">getName</a>()) != strcatGroup.end())</div>
|
|
1642
|
+
<div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>  {</div>
|
|
1643
|
+
<div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>  <a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a9815a5b31ac7dc21239d08e5b9f61106">SVFUtil::getSVFCallSite</a>(call-><a class="code" href="classSVF_1_1CallICFGNode.html#a90fd0b8e44fba1a7eb76d15bce085d66">getCallSite</a>());</div>
|
|
1644
|
+
<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a>* arg0Val = cs.<a class="code" href="classSVF_1_1CallSite.html#a9e7c94ee7f689466111487e03b2cebcc">getArgument</a>(0);</div>
|
|
1645
|
+
<div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a>* arg1Val = cs.<a class="code" href="classSVF_1_1CallSite.html#a9e7c94ee7f689466111487e03b2cebcc">getArgument</a>(1);</div>
|
|
1646
|
+
<div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> strLen0 = getStrlen(arg0Val);</div>
|
|
1647
|
+
<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> strLen1 = getStrlen(arg1Val);</div>
|
|
1648
|
+
<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> totalLen = strLen0 + strLen1;</div>
|
|
1649
|
+
<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>  handleMemcpy(arg0Val, arg1Val, strLen1, strLen0.<a class="code" href="classSVF_1_1IntervalValue.html#a0df07a2659cbf3a918de5b0d7c407264">lb</a>().<a class="code" href="classSVF_1_1NumericLiteral.html#a4181e5e15e10304ea524e5f8b2a3f576">getNumeral</a>());</div>
|
|
1650
|
+
<div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>  <span class="comment">// do memcpy</span></div>
|
|
1651
|
+
<div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>  }</div>
|
|
1652
|
+
<div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (std::find(strncatGroup.begin(), strncatGroup.end(), fun-><a class="code" href="classSVF_1_1SVFValue.html#a2401b022638769f59f86ab424a189b6e">getName</a>()) != strncatGroup.end())</div>
|
|
1653
|
+
<div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>  {</div>
|
|
1654
|
+
<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>  <a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a9815a5b31ac7dc21239d08e5b9f61106">SVFUtil::getSVFCallSite</a>(call-><a class="code" href="classSVF_1_1CallICFGNode.html#a90fd0b8e44fba1a7eb76d15bce085d66">getCallSite</a>());</div>
|
|
1655
|
+
<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a>* arg0Val = cs.<a class="code" href="classSVF_1_1CallSite.html#a9e7c94ee7f689466111487e03b2cebcc">getArgument</a>(0);</div>
|
|
1656
|
+
<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a>* arg1Val = cs.<a class="code" href="classSVF_1_1CallSite.html#a9e7c94ee7f689466111487e03b2cebcc">getArgument</a>(1);</div>
|
|
1657
|
+
<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a>* arg2Val = cs.<a class="code" href="classSVF_1_1CallSite.html#a9e7c94ee7f689466111487e03b2cebcc">getArgument</a>(2);</div>
|
|
1658
|
+
<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> arg2Num = _ae->_svfir2ExeState->getEs()[_svfir->getValueNode(arg2Val)];</div>
|
|
1659
|
+
<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> strLen0 = getStrlen(arg0Val);</div>
|
|
1660
|
+
<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> totalLen = strLen0 + arg2Num;</div>
|
|
1661
|
+
<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>  handleMemcpy(arg0Val, arg1Val, arg2Num, strLen0.<a class="code" href="classSVF_1_1IntervalValue.html#a0df07a2659cbf3a918de5b0d7c407264">lb</a>().<a class="code" href="classSVF_1_1NumericLiteral.html#a4181e5e15e10304ea524e5f8b2a3f576">getNumeral</a>());</div>
|
|
1662
|
+
<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>  <span class="comment">// do memcpy</span></div>
|
|
1663
|
+
<div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>  }</div>
|
|
1664
|
+
<div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>  <span class="keywordflow">else</span></div>
|
|
1665
|
+
<div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>  {</div>
|
|
1666
|
+
<div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"unknown strcat function, please add it to strcatGroup or strncatGroup"</span>);</div>
|
|
1667
|
+
<div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>  }</div>
|
|
1668
|
+
<div class="line"><a name="l01614"></a><span class="lineno"> 1614</span> }</div>
|
|
1669
|
+
<div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>  </div>
|
|
1670
|
+
<div class="line"><a name="l01616"></a><span class="lineno"><a class="line" href="classSVF_1_1AEAPI.html#ae0847fb421538982bfd50cc280d1a65b"> 1616</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AEAPI.html#ae0847fb421538982bfd50cc280d1a65b">AEAPI::handleMemcpy</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFValue.html">SVF::SVFValue</a> *dst, <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFValue.html">SVF::SVFValue</a> *src, <a class="code" href="classSVF_1_1IntervalValue.html">SVF::IntervalValue</a> len, <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> start_idx)</div>
|
|
1671
|
+
<div class="line"><a name="l01617"></a><span class="lineno"> 1617</span> {</div>
|
|
1672
|
+
<div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>  <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a> &es = _ae->_svfir2ExeState->getEs();</div>
|
|
1673
|
+
<div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> dstId = _svfir->getValueNode(dst); <span class="comment">// pts(dstId) = {objid} objbar objtypeinfo->getType().</span></div>
|
|
1674
|
+
<div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> srcId = _svfir->getValueNode(src);</div>
|
|
1675
|
+
<div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> elemSize = 1;</div>
|
|
1676
|
+
<div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>  <span class="keywordflow">if</span> (dst-><a class="code" href="classSVF_1_1SVFValue.html#a11f2d9b6e969ede6fca2c204cc15b821">getType</a>()-><a class="code" href="classSVF_1_1SVFType.html#a330084f9a3deb6e5acb52a8ee3eb7fe4">isArrayTy</a>())</div>
|
|
1677
|
+
<div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>  {</div>
|
|
1678
|
+
<div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>  elemSize = SVFUtil::dyn_cast<SVFArrayType>(dst-><a class="code" href="classSVF_1_1SVFValue.html#a11f2d9b6e969ede6fca2c204cc15b821">getType</a>())->getTypeOfElement()->getByteSize();</div>
|
|
1679
|
+
<div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>  }</div>
|
|
1680
|
+
<div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>  <span class="comment">// memcpy(i32*, i32*, 40)</span></div>
|
|
1681
|
+
<div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dst-><a class="code" href="classSVF_1_1SVFValue.html#a11f2d9b6e969ede6fca2c204cc15b821">getType</a>()-><a class="code" href="classSVF_1_1SVFType.html#a870b63af2bf9fe43cdf1df3d56b20f6c">isPointerTy</a>())</div>
|
|
1682
|
+
<div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>  {</div>
|
|
1683
|
+
<div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* elemType = getPointeeElement(_svfir->getValueNode(dst)))</div>
|
|
1684
|
+
<div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>  {</div>
|
|
1685
|
+
<div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>  <span class="keywordflow">if</span> (elemType->isArrayTy())</div>
|
|
1686
|
+
<div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>  elemSize = SVFUtil::dyn_cast<SVFArrayType>(elemType)->getTypeOfElement()->getByteSize();</div>
|
|
1687
|
+
<div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>  <span class="keywordflow">else</span></div>
|
|
1688
|
+
<div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>  elemSize = elemType->getByteSize();</div>
|
|
1689
|
+
<div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>  }</div>
|
|
1690
|
+
<div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>  <span class="keywordflow">else</span></div>
|
|
1691
|
+
<div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>  {</div>
|
|
1692
|
+
<div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>  elemSize = 1;</div>
|
|
1693
|
+
<div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>  }</div>
|
|
1694
|
+
<div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>  }</div>
|
|
1695
|
+
<div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>  <span class="keywordflow">else</span></div>
|
|
1696
|
+
<div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>  {</div>
|
|
1697
|
+
<div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"we cannot support this type"</span>);</div>
|
|
1698
|
+
<div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>  }</div>
|
|
1699
|
+
<div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> size = std::min((<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a>)<a class="code" href="classSVF_1_1Options.html#aaab923c093730b1670a54f09340b1bd5">Options::MaxFieldLimit</a>(), (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a>) len.<a class="code" href="classSVF_1_1IntervalValue.html#a0df07a2659cbf3a918de5b0d7c407264">lb</a>().<a class="code" href="classSVF_1_1NumericLiteral.html#a4181e5e15e10304ea524e5f8b2a3f576">getNumeral</a>());</div>
|
|
1700
|
+
<div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> range_val = size / elemSize;</div>
|
|
1701
|
+
<div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>  <span class="keywordflow">if</span> (_ae->_svfir2ExeState->inVarToAddrsTable(srcId) && _ae->_svfir2ExeState->inVarToAddrsTable(dstId))</div>
|
|
1702
|
+
<div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>  {</div>
|
|
1703
|
+
<div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = 0; <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < range_val; <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>++)</div>
|
|
1704
|
+
<div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>  {</div>
|
|
1705
|
+
<div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>  <span class="comment">// dead loop for string and break if there's a \0. If no \0, it will throw err.</span></div>
|
|
1706
|
+
<div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>  <a class="code" href="classSVF_1_1AddressValue.html">Addrs</a> expr_src = _ae->_svfir2ExeState->getGepObjAddress(srcId, <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
1707
|
+
<div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>  <a class="code" href="classSVF_1_1AddressValue.html">Addrs</a> expr_dst = _ae->_svfir2ExeState->getGepObjAddress(dstId, <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> + start_idx);</div>
|
|
1708
|
+
<div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &dst: expr_dst)</div>
|
|
1709
|
+
<div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>  {</div>
|
|
1710
|
+
<div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &src: expr_src)</div>
|
|
1711
|
+
<div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>  {</div>
|
|
1712
|
+
<div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> objId = <a class="code" href="classSVF_1_1ExeState.html#ab72f3bc855feeda75e11768ab03ad84e">ExeState::getInternalID</a>(src);</div>
|
|
1713
|
+
<div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>  <span class="keywordflow">if</span> (es.<a class="code" href="classSVF_1_1IntervalExeState.html#a50aee49f7f34e05f7e2cb28ae55099f8">inLocToValTable</a>(objId))</div>
|
|
1714
|
+
<div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>  {</div>
|
|
1715
|
+
<div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>  es.<a class="code" href="classSVF_1_1IntervalESBase.html#adb26b186ee31bce7449a7b36faa24cc2">store</a>(dst, es.<a class="code" href="classSVF_1_1IntervalExeState.html#a960ec3359dfcb5e89fb66120c868ac5e">load</a>(src));</div>
|
|
1716
|
+
<div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>  }</div>
|
|
1717
|
+
<div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (es.<a class="code" href="classSVF_1_1IntervalExeState.html#af61110c081ca71f9348e8dfff5aa76e4">inLocToAddrsTable</a>(objId))</div>
|
|
1718
|
+
<div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>  {</div>
|
|
1719
|
+
<div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>  es.<a class="code" href="classSVF_1_1ExeState.html#a99f4437a7e350fec131d48f52082d672">storeAddrs</a>(dst, es.<a class="code" href="classSVF_1_1IntervalExeState.html#ad17ceaf8058043151ae0f23b3415458a">loadAddrs</a>(src));</div>
|
|
1720
|
+
<div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>  }</div>
|
|
1721
|
+
<div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>  }</div>
|
|
1722
|
+
<div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>  }</div>
|
|
1723
|
+
<div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>  }</div>
|
|
1724
|
+
<div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>  }</div>
|
|
1725
|
+
<div class="line"><a name="l01671"></a><span class="lineno"> 1671</span> }</div>
|
|
1726
|
+
<div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>  </div>
|
|
1727
|
+
<div class="line"><a name="l01673"></a><span class="lineno"><a class="line" href="classSVF_1_1AEAPI.html#a112519b672206ac552273666949eeb3b"> 1673</a></span> <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* <a class="code" href="classSVF_1_1AEAPI.html#a112519b672206ac552273666949eeb3b">AEAPI::getPointeeElement</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <span class="keywordtype">id</span>)</div>
|
|
1728
|
+
<div class="line"><a name="l01674"></a><span class="lineno"> 1674</span> {</div>
|
|
1729
|
+
<div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>  assert(_ae->_svfir2ExeState->inVarToAddrsTable(<span class="keywordtype">id</span>) && <span class="stringliteral">"id is not in varToAddrsTable"</span>);</div>
|
|
1730
|
+
<div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>  <span class="keywordflow">if</span> (_ae->_svfir2ExeState->inVarToAddrsTable(<span class="keywordtype">id</span>))</div>
|
|
1731
|
+
<div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>  {</div>
|
|
1732
|
+
<div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1AddressValue.html">Addrs</a>& addrs = _ae->_svfir2ExeState->getAddrs(<span class="keywordtype">id</span>);</div>
|
|
1733
|
+
<div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> addr: addrs)</div>
|
|
1734
|
+
<div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>  {</div>
|
|
1735
|
+
<div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> addr_id = _ae->_svfir2ExeState-><a class="code" href="classSVF_1_1AddressValue.html#a3be7a2e3ec3215b67cd60f122d2cd10e">getInternalID</a>(addr);</div>
|
|
1736
|
+
<div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>  <span class="keywordflow">if</span> (addr_id == 0) <span class="comment">// nullptr has no memobj, skip</span></div>
|
|
1737
|
+
<div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>  <span class="keywordflow">continue</span>;</div>
|
|
1738
|
+
<div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>  <span class="keywordflow">return</span> SVFUtil::dyn_cast<ObjVar>(_svfir->getGNode(addr_id))->getMemObj()->getType();</div>
|
|
1739
|
+
<div class="line"><a name="l01685"></a><span class="lineno"> 1685</span>  }</div>
|
|
1740
|
+
<div class="line"><a name="l01686"></a><span class="lineno"> 1686</span>  }</div>
|
|
1741
|
+
<div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
1742
|
+
<div class="line"><a name="l01688"></a><span class="lineno"> 1688</span> }</div>
|
|
1743
|
+
<div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>  </div>
|
|
1744
|
+
<div class="line"><a name="l01690"></a><span class="lineno"><a class="line" href="classSVF_1_1AEAPI.html#a185e694007f4d69b0030c65fb54c9c6d"> 1690</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AEAPI.html#a185e694007f4d69b0030c65fb54c9c6d">AEAPI::handleMemset</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFValue.html">SVF::SVFValue</a> *dst, <a class="code" href="classSVF_1_1IntervalValue.html">SVF::IntervalValue</a> elem, <a class="code" href="classSVF_1_1IntervalValue.html">SVF::IntervalValue</a> len)</div>
|
|
1745
|
+
<div class="line"><a name="l01691"></a><span class="lineno"> 1691</span> {</div>
|
|
1746
|
+
<div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>  <a class="code" href="classSVF_1_1IntervalExeState.html">IntervalExeState</a> &es = _ae->_svfir2ExeState->getEs();</div>
|
|
1747
|
+
<div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> dstId = _svfir->getValueNode(dst);</div>
|
|
1748
|
+
<div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> size = std::min((<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a>)<a class="code" href="classSVF_1_1Options.html#aaab923c093730b1670a54f09340b1bd5">Options::MaxFieldLimit</a>(), (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a>) len.<a class="code" href="classSVF_1_1IntervalValue.html#a0df07a2659cbf3a918de5b0d7c407264">lb</a>().<a class="code" href="classSVF_1_1NumericLiteral.html#a4181e5e15e10304ea524e5f8b2a3f576">getNumeral</a>());</div>
|
|
1749
|
+
<div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> elemSize = 1;</div>
|
|
1750
|
+
<div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>  <span class="keywordflow">if</span> (dst-><a class="code" href="classSVF_1_1SVFValue.html#a11f2d9b6e969ede6fca2c204cc15b821">getType</a>()-><a class="code" href="classSVF_1_1SVFType.html#a330084f9a3deb6e5acb52a8ee3eb7fe4">isArrayTy</a>())</div>
|
|
1751
|
+
<div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>  {</div>
|
|
1752
|
+
<div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>  elemSize = SVFUtil::dyn_cast<SVFArrayType>(dst-><a class="code" href="classSVF_1_1SVFValue.html#a11f2d9b6e969ede6fca2c204cc15b821">getType</a>())->getTypeOfElement()->getByteSize();</div>
|
|
1753
|
+
<div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>  }</div>
|
|
1754
|
+
<div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dst-><a class="code" href="classSVF_1_1SVFValue.html#a11f2d9b6e969ede6fca2c204cc15b821">getType</a>()-><a class="code" href="classSVF_1_1SVFType.html#a870b63af2bf9fe43cdf1df3d56b20f6c">isPointerTy</a>())</div>
|
|
1755
|
+
<div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>  {</div>
|
|
1756
|
+
<div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* elemType = getPointeeElement(_svfir->getValueNode(dst)))</div>
|
|
1757
|
+
<div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>  {</div>
|
|
1758
|
+
<div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>  elemSize = elemType->getByteSize();</div>
|
|
1759
|
+
<div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>  }</div>
|
|
1760
|
+
<div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>  <span class="keywordflow">else</span></div>
|
|
1761
|
+
<div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>  {</div>
|
|
1762
|
+
<div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>  elemSize = 1;</div>
|
|
1763
|
+
<div class="line"><a name="l01709"></a><span class="lineno"> 1709</span>  }</div>
|
|
1764
|
+
<div class="line"><a name="l01710"></a><span class="lineno"> 1710</span>  }</div>
|
|
1765
|
+
<div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>  <span class="keywordflow">else</span></div>
|
|
1766
|
+
<div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>  {</div>
|
|
1767
|
+
<div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"we cannot support this type"</span>);</div>
|
|
1768
|
+
<div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>  }</div>
|
|
1769
|
+
<div class="line"><a name="l01715"></a><span class="lineno"> 1715</span>  </div>
|
|
1770
|
+
<div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> range_val = size / elemSize;</div>
|
|
1771
|
+
<div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = 0; <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < range_val; <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>++)</div>
|
|
1772
|
+
<div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>  {</div>
|
|
1773
|
+
<div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>  <span class="comment">// dead loop for string and break if there's a \0. If no \0, it will throw err.</span></div>
|
|
1774
|
+
<div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>  <span class="keywordflow">if</span> (_ae->_svfir2ExeState->inVarToAddrsTable(dstId))</div>
|
|
1775
|
+
<div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>  {</div>
|
|
1776
|
+
<div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>  <a class="code" href="classSVF_1_1AddressValue.html">Addrs</a> lhs_gep = _ae->_svfir2ExeState->getGepObjAddress(dstId, <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
1777
|
+
<div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &addr: lhs_gep)</div>
|
|
1778
|
+
<div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>  {</div>
|
|
1779
|
+
<div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> objId = <a class="code" href="classSVF_1_1ExeState.html#ab72f3bc855feeda75e11768ab03ad84e">ExeState::getInternalID</a>(addr);</div>
|
|
1780
|
+
<div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>  <span class="keywordflow">if</span> (es.<a class="code" href="classSVF_1_1IntervalExeState.html#a50aee49f7f34e05f7e2cb28ae55099f8">inLocToValTable</a>(objId))</div>
|
|
1781
|
+
<div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>  {</div>
|
|
1782
|
+
<div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>  <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a> tmp = es.<a class="code" href="classSVF_1_1IntervalExeState.html#a960ec3359dfcb5e89fb66120c868ac5e">load</a>(addr);</div>
|
|
1783
|
+
<div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>  tmp.<a class="code" href="classSVF_1_1IntervalValue.html#a3771eb932069dcad8212009efc411b99">join_with</a>(<a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>(elem));</div>
|
|
1784
|
+
<div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>  es.<a class="code" href="classSVF_1_1IntervalESBase.html#adb26b186ee31bce7449a7b36faa24cc2">store</a>(addr, tmp);</div>
|
|
1785
|
+
<div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>  }</div>
|
|
1786
|
+
<div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>  <span class="keywordflow">else</span></div>
|
|
1787
|
+
<div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>  {</div>
|
|
1788
|
+
<div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>  es.<a class="code" href="classSVF_1_1IntervalESBase.html#adb26b186ee31bce7449a7b36faa24cc2">store</a>(addr, <a class="code" href="classSVF_1_1IntervalValue.html">IntervalValue</a>(elem));</div>
|
|
1789
|
+
<div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>  }</div>
|
|
1790
|
+
<div class="line"><a name="l01736"></a><span class="lineno"> 1736</span>  }</div>
|
|
1791
|
+
<div class="line"><a name="l01737"></a><span class="lineno"> 1737</span>  }</div>
|
|
1792
|
+
<div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>  <span class="keywordflow">else</span></div>
|
|
1793
|
+
<div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>  <span class="keywordflow">break</span>;</div>
|
|
1794
|
+
<div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>  }</div>
|
|
1795
|
+
<div class="line"><a name="l01741"></a><span class="lineno"> 1741</span> }</div>
|
|
1796
|
+
<div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>  </div>
|
|
1797
|
+
<div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>  </div>
|
|
1798
|
+
<div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>  </div>
|
|
1799
|
+
<div class="line"><a name="l01745"></a><span class="lineno"><a class="line" href="classSVF_1_1AEAPI.html#a7be3da80bedb1077a99d67daa124afde"> 1745</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AEAPI.html#a7be3da80bedb1077a99d67daa124afde">AEAPI::AccessMemoryViaRetNode</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a> *callnode, <a class="code" href="classSVF_1_1FILOWorkList.html">SVF::FILOWorkList<const SVFValue *></a>& worklist, <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const SVFValue *></a>& visited)</div>
|
|
1800
|
+
<div class="line"><a name="l01746"></a><span class="lineno"> 1746</span> {</div>
|
|
1801
|
+
<div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>  <span class="keywordflow">if</span> (callnode-><a class="code" href="classSVF_1_1CallICFGNode.html#ae23a7540609879ac0379fc53b4e7eead">getRetICFGNode</a>()-><a class="code" href="classSVF_1_1ICFGNode.html#a6c68f52dd90728073fb79141df9b0661">getSVFStmts</a>().size() > 0)</div>
|
|
1802
|
+
<div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>  {</div>
|
|
1803
|
+
<div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1RetPE.html">RetPE</a> *ret = SVFUtil::dyn_cast<RetPE>(*callnode-><a class="code" href="classSVF_1_1CallICFGNode.html#ae23a7540609879ac0379fc53b4e7eead">getRetICFGNode</a>()-><a class="code" href="classSVF_1_1ICFGNode.html#a6c68f52dd90728073fb79141df9b0661">getSVFStmts</a>().begin());</div>
|
|
1804
|
+
<div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>  <a class="code" href="classSVF_1_1ValVar.html">SVF::ValVar</a> *ret_gnode = SVFUtil::dyn_cast<ValVar>(_svfir->getGNode(ret-><a class="code" href="classSVF_1_1AssignStmt.html#ad03d28d16754c9049dd4d0ad3b6c1e28">getRHSVar</a>()-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>()));</div>
|
|
1805
|
+
<div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>  <span class="keywordflow">if</span> (ret_gnode-><a class="code" href="classSVF_1_1SVFVar.html#a747b2c92c81d32fcd357e80d2d8fe7cc">hasIncomingEdges</a>(SVFStmt::PEDGEK::Phi))</div>
|
|
1806
|
+
<div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>  {</div>
|
|
1807
|
+
<div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFStmt.html#a8cd7b6c6fd8b030b1421d95a086359f4">SVFStmt::SVFStmtSetTy</a> &stmt_set = ret_gnode-><a class="code" href="classSVF_1_1SVFVar.html#a76964ef7d4842a469d7720881499d8a6">getIncomingEdges</a>(SVFStmt::PEDGEK::Phi);</div>
|
|
1808
|
+
<div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = stmt_set.begin(); it != stmt_set.end(); ++it)</div>
|
|
1809
|
+
<div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>  {</div>
|
|
1810
|
+
<div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFStmt.html">SVFStmt</a> *stmt = *it;</div>
|
|
1811
|
+
<div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1PhiStmt.html">PhiStmt</a> *phi = SVFUtil::dyn_cast<PhiStmt>(stmt))</div>
|
|
1812
|
+
<div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>  {</div>
|
|
1813
|
+
<div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>  <span class="keywordflow">if</span> (!visited.count(phi->getOpVar(0)->getValue()))</div>
|
|
1814
|
+
<div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>  {</div>
|
|
1815
|
+
<div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>  worklist.<a class="code" href="classSVF_1_1FILOWorkList.html#afcf3fcda18e8d3e2bad70a51376c0ce1">push</a>(phi->getOpVar(0)->getValue());</div>
|
|
1816
|
+
<div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>  visited.insert(phi->getOpVar(0)->getValue());</div>
|
|
1817
|
+
<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>  }</div>
|
|
1818
|
+
<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>  }</div>
|
|
1819
|
+
<div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>  }</div>
|
|
1820
|
+
<div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>  }</div>
|
|
1821
|
+
<div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>  }</div>
|
|
1822
|
+
<div class="line"><a name="l01768"></a><span class="lineno"> 1768</span> }</div>
|
|
1823
|
+
<div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>  </div>
|
|
1824
|
+
<div class="line"><a name="l01770"></a><span class="lineno"><a class="line" href="classSVF_1_1AEAPI.html#a3665513f6e8f8b93ef3f9d273d03ee70"> 1770</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AEAPI.html#a3665513f6e8f8b93ef3f9d273d03ee70">AEAPI::AccessMemoryViaCopyStmt</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CopyStmt.html">CopyStmt</a> *<a class="code" href="cJSON_8cpp.html#a7669ee67a0563250c1efaa24d130e1ac">copy</a>, <a class="code" href="classSVF_1_1FILOWorkList.html">SVF::FILOWorkList<const SVFValue *></a>& worklist, <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const SVFValue *></a>& visited)</div>
|
|
1825
|
+
<div class="line"><a name="l01771"></a><span class="lineno"> 1771</span> {</div>
|
|
1826
|
+
<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>  <span class="keywordflow">if</span> (!visited.count(<a class="code" href="cJSON_8cpp.html#a7669ee67a0563250c1efaa24d130e1ac">copy</a>->getRHSVar()->getValue()))</div>
|
|
1827
|
+
<div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>  {</div>
|
|
1828
|
+
<div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>  visited.insert(<a class="code" href="cJSON_8cpp.html#a7669ee67a0563250c1efaa24d130e1ac">copy</a>->getRHSVar()->getValue());</div>
|
|
1829
|
+
<div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>  worklist.<a class="code" href="classSVF_1_1FILOWorkList.html#afcf3fcda18e8d3e2bad70a51376c0ce1">push</a>(<a class="code" href="cJSON_8cpp.html#a7669ee67a0563250c1efaa24d130e1ac">copy</a>->getRHSVar()->getValue());</div>
|
|
1830
|
+
<div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>  }</div>
|
|
1831
|
+
<div class="line"><a name="l01777"></a><span class="lineno"> 1777</span> }</div>
|
|
1832
|
+
<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>  </div>
|
|
1833
|
+
<div class="line"><a name="l01779"></a><span class="lineno"><a class="line" href="classSVF_1_1AEAPI.html#afa34cb2ee3fc1ca5aa04a2afe7c2d6e8"> 1779</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AEAPI.html#afa34cb2ee3fc1ca5aa04a2afe7c2d6e8">AEAPI::AccessMemoryViaLoadStmt</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1LoadStmt.html">LoadStmt</a> *load, <a class="code" href="classSVF_1_1FILOWorkList.html">SVF::FILOWorkList<const SVFValue *></a>& worklist, <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const SVFValue *></a>& visited)</div>
|
|
1834
|
+
<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span> {</div>
|
|
1835
|
+
<div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>  <span class="keywordflow">if</span> (_ae->_svfir2ExeState->inVarToAddrsTable(load-><a class="code" href="classSVF_1_1AssignStmt.html#a98f731be7be9bc8e7fd09f5c2204c840">getLHSVarID</a>()))</div>
|
|
1836
|
+
<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>  {</div>
|
|
1837
|
+
<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1AddressValue.html">ExeState::Addrs</a> &<a class="code" href="classSVF_1_1AddressValue.html">Addrs</a> = _ae->_svfir2ExeState->getAddrs(load-><a class="code" href="classSVF_1_1AssignStmt.html#a98f731be7be9bc8e7fd09f5c2204c840">getLHSVarID</a>());</div>
|
|
1838
|
+
<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> vaddr: <a class="code" href="classSVF_1_1AddressValue.html">Addrs</a>)</div>
|
|
1839
|
+
<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>  {</div>
|
|
1840
|
+
<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <span class="keywordtype">id</span> = _ae->_svfir2ExeState-><a class="code" href="classSVF_1_1AddressValue.html#a3be7a2e3ec3215b67cd60f122d2cd10e">getInternalID</a>(vaddr);</div>
|
|
1841
|
+
<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>  <span class="keywordflow">if</span> (<span class="keywordtype">id</span> == 0) <span class="comment">// nullptr has no memobj, skip</span></div>
|
|
1842
|
+
<div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>  <span class="keywordflow">continue</span>;</div>
|
|
1843
|
+
<div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>  <span class="keyword">const</span> <span class="keyword">auto</span> *val = _svfir->getGNode(<span class="keywordtype">id</span>);</div>
|
|
1844
|
+
<div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>  <span class="keywordflow">if</span> (!visited.count(val->getValue()))</div>
|
|
1845
|
+
<div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>  {</div>
|
|
1846
|
+
<div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>  visited.insert(val->getValue());</div>
|
|
1847
|
+
<div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>  worklist.<a class="code" href="classSVF_1_1FILOWorkList.html#afcf3fcda18e8d3e2bad70a51376c0ce1">push</a>(val->getValue());</div>
|
|
1848
|
+
<div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>  }</div>
|
|
1849
|
+
<div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>  }</div>
|
|
1850
|
+
<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>  }</div>
|
|
1851
|
+
<div class="line"><a name="l01797"></a><span class="lineno"> 1797</span> }</div>
|
|
1852
|
+
<div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>  </div>
|
|
1853
|
+
<div class="line"><a name="l01799"></a><span class="lineno"><a class="line" href="classSVF_1_1AEAPI.html#ac49859a7848fbef0e29492e95b031f1f"> 1799</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AEAPI.html#ac49859a7848fbef0e29492e95b031f1f">AEAPI::AccessMemoryViaCallArgs</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFArgument.html">SVF::SVFArgument</a> *arg,</div>
|
|
1854
|
+
<div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>  <a class="code" href="classSVF_1_1FILOWorkList.html">SVF::FILOWorkList<const SVFValue *></a> &worklist,</div>
|
|
1855
|
+
<div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const SVF::SVFValue *></a> &visited)</div>
|
|
1856
|
+
<div class="line"><a name="l01802"></a><span class="lineno"> 1802</span> {</div>
|
|
1857
|
+
<div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>  std::vector<const CallICFGNode *> callstack = _ae->_callSiteStack;</div>
|
|
1858
|
+
<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>  <a class="code" href="classSVF_1_1ValVar.html">SVF::ValVar</a> *arg_gnode = SVFUtil::cast<ValVar>(_svfir->getGNode(_svfir->getValueNode(arg)));</div>
|
|
1859
|
+
<div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>  <span class="keywordflow">if</span> (arg_gnode-><a class="code" href="classSVF_1_1SVFVar.html#a747b2c92c81d32fcd357e80d2d8fe7cc">hasIncomingEdges</a>(SVFStmt::PEDGEK::Call))</div>
|
|
1860
|
+
<div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>  {</div>
|
|
1861
|
+
<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>  <span class="keywordflow">while</span> (!callstack.empty())</div>
|
|
1862
|
+
<div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>  {</div>
|
|
1863
|
+
<div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a> *cur_call = callstack.back();</div>
|
|
1864
|
+
<div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>  callstack.pop_back();</div>
|
|
1865
|
+
<div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFStmt.html">SVFStmt</a> *stmt: cur_call-><a class="code" href="classSVF_1_1ICFGNode.html#a6c68f52dd90728073fb79141df9b0661">getSVFStmts</a>())</div>
|
|
1866
|
+
<div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>  {</div>
|
|
1867
|
+
<div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallPE.html">CallPE</a> *callPE = SVFUtil::dyn_cast<CallPE>(stmt))</div>
|
|
1868
|
+
<div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>  {</div>
|
|
1869
|
+
<div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>  <span class="keywordflow">if</span> (callPE->getLHSVarID() == _svfir->getValueNode(arg))</div>
|
|
1870
|
+
<div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>  {</div>
|
|
1871
|
+
<div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>  <span class="keywordflow">if</span> (!SVFUtil::isa<DummyObjVar>(callPE->getRHSVar()) &&</div>
|
|
1872
|
+
<div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>  !SVFUtil::isa<DummyValVar>(callPE->getRHSVar()))</div>
|
|
1873
|
+
<div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>  {</div>
|
|
1874
|
+
<div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>  <span class="keywordflow">if</span> (!visited.count(callPE->getRHSVar()->getValue()))</div>
|
|
1875
|
+
<div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>  {</div>
|
|
1876
|
+
<div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>  visited.insert(callPE->getRHSVar()->getValue());</div>
|
|
1877
|
+
<div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>  worklist.<a class="code" href="classSVF_1_1FILOWorkList.html#afcf3fcda18e8d3e2bad70a51376c0ce1">push</a>(callPE->getRHSVar()->getValue());</div>
|
|
1878
|
+
<div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>  <span class="keywordflow">break</span>;</div>
|
|
1879
|
+
<div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>  }</div>
|
|
1880
|
+
<div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>  }</div>
|
|
1881
|
+
<div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>  }</div>
|
|
1882
|
+
<div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>  }</div>
|
|
1883
|
+
<div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>  }</div>
|
|
1884
|
+
<div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>  }</div>
|
|
1885
|
+
<div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>  }</div>
|
|
1886
|
+
<div class="line"><a name="l01832"></a><span class="lineno"> 1832</span> }</div>
|
|
1887
|
+
<div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>  </div>
|
|
1888
|
+
</div><!-- fragment --></div><!-- contents -->
|
|
1889
|
+
<div class="ttc" id="aclassSVF_1_1FIFOWorkList_html_a0df409a67428e528321869d201f2a474"><div class="ttname"><a href="classSVF_1_1FIFOWorkList.html#a0df409a67428e528321869d201f2a474">SVF::FIFOWorkList::push</a></div><div class="ttdeci">bool push(const Data &data)</div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00165">WorkList.h:165</a></div></div>
|
|
1890
|
+
<div class="ttc" id="aclassSVF_1_1AEAPI_html_afe6d49fd36a96bda165654eb393be6f2"><div class="ttname"><a href="classSVF_1_1AEAPI.html#afe6d49fd36a96bda165654eb393be6f2">SVF::AEAPI::getAllocaInstByteSize</a></div><div class="ttdeci">u32_t getAllocaInstByteSize(const AddrStmt *addr)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l01362">AbstractExecution.cpp:1362</a></div></div>
|
|
1891
|
+
<div class="ttc" id="aclassSVF_1_1SVFValue_html_a2401b022638769f59f86ab424a189b6e"><div class="ttname"><a href="classSVF_1_1SVFValue.html#a2401b022638769f59f86ab424a189b6e">SVF::SVFValue::getName</a></div><div class="ttdeci">const std::string & getName() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00243">SVFValue.h:243</a></div></div>
|
|
1892
|
+
<div class="ttc" id="aclassSVF_1_1CopyStmt_html"><div class="ttname"><a href="classSVF_1_1CopyStmt.html">SVF::CopyStmt</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00364">SVFStatements.h:364</a></div></div>
|
|
1893
|
+
<div class="ttc" id="aclassSVF_1_1SVFType_html_a95b8031f1e15d49c7d68628be1d05aae"><div class="ttname"><a href="classSVF_1_1SVFType.html#a95b8031f1e15d49c7d68628be1d05aae">SVF::SVFType::getByteSize</a></div><div class="ttdeci">u32_t getByteSize() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00244">SVFType.h:244</a></div></div>
|
|
1894
|
+
<div class="ttc" id="aclassSVF_1_1SVFFunction_html_a90e39f78f4908f8a8ef3948d9158791c"><div class="ttname"><a href="classSVF_1_1SVFFunction.html#a90e39f78f4908f8a8ef3948d9158791c">SVF::SVFFunction::getReachableBBs</a></div><div class="ttdeci">const std::vector< const SVFBasicBlock * > & getReachableBBs() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00451">SVFValue.h:451</a></div></div>
|
|
1895
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_a28df4f2bd5b337468f254cd609adb25f"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#a28df4f2bd5b337468f254cd609adb25f">SVF::AbstractExecution::hasBranchES</a></div><div class="ttdeci">bool hasBranchES(const IntraCFGEdge *intraEdge, IntervalExeState &es)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00564">AbstractExecution.cpp:564</a></div></div>
|
|
1896
|
+
<div class="ttc" id="aclassSVF_1_1FIFOWorkList_html_a8fa72918fce7e9c0b2dc34b683a797c6"><div class="ttname"><a href="classSVF_1_1FIFOWorkList.html#a8fa72918fce7e9c0b2dc34b683a797c6">SVF::FIFOWorkList::pop</a></div><div class="ttdeci">Data pop()</div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00200">WorkList.h:200</a></div></div>
|
|
1897
|
+
<div class="ttc" id="aclassSVF_1_1ExeState_html_aa7b897b107d722909f9de9dcbabad7cf"><div class="ttname"><a href="classSVF_1_1ExeState.html#aa7b897b107d722909f9de9dcbabad7cf">SVF::ExeState::getLocToAddrs</a></div><div class="ttdeci">virtual const VarToAddrs & getLocToAddrs() const</div><div class="ttdef"><b>Definition:</b> <a href="ExeState_8h_source.html#l00125">ExeState.h:125</a></div></div>
|
|
1898
|
+
<div class="ttc" id="anamespacellvm_html"><div class="ttname"><a href="namespacellvm.html">llvm</a></div><div class="ttdef"><b>Definition:</b> <a href="GEPTypeBridgeIterator_8h_source.html#l00013">GEPTypeBridgeIterator.h:13</a></div></div>
|
|
1899
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_adc740771e712644d08f95fc6c488c1af"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#adc740771e712644d08f95fc6c488c1af">SVF::AbstractExecution::hasSwitchBranchES</a></div><div class="ttdeci">bool hasSwitchBranchES(const SVFVar *var, s64_t succ, IntervalExeState &es)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00520">AbstractExecution.cpp:520</a></div></div>
|
|
1900
|
+
<div class="ttc" id="aAbstractExecution_8h_html"><div class="ttname"><a href="AbstractExecution_8h.html">AbstractExecution.h</a></div></div>
|
|
1901
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_aff1c9582db75361b68aaaf0c4b8b6f0d"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#aff1c9582db75361b68aaaf0c4b8b6f0d">SVF::AbstractExecution::directCallFunPass</a></div><div class="ttdeci">void directCallFunPass(const CallICFGNode *callNode)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00693">AbstractExecution.cpp:693</a></div></div>
|
|
1902
|
+
<div class="ttc" id="aextapi_8c_html_a49f40fd869fd0c90e4497fda08c89561"><div class="ttname"><a href="extapi_8c.html#a49f40fd869fd0c90e4497fda08c89561">isgraph</a></div><div class="ttdeci">int isgraph(int c)</div><div class="ttdef"><b>Definition:</b> <a href="extapi_8c_source.html#l00857">extapi.c:857</a></div></div>
|
|
1903
|
+
<div class="ttc" id="aclassSVF_1_1IntervalExeState_html_a960ec3359dfcb5e89fb66120c868ac5e"><div class="ttname"><a href="classSVF_1_1IntervalExeState.html#a960ec3359dfcb5e89fb66120c868ac5e">SVF::IntervalExeState::load</a></div><div class="ttdeci">IntervalValue & load(u32_t addr) override</div><div class="ttdef"><b>Definition:</b> <a href="IntervalExeState_8h_source.html#l00547">IntervalExeState.h:547</a></div></div>
|
|
1904
|
+
<div class="ttc" id="aclassSVF_1_1IntervalExeState_html_a056e0db56033ac4dc041e6d82d614dbd"><div class="ttname"><a href="classSVF_1_1IntervalExeState.html#a056e0db56033ac4dc041e6d82d614dbd">SVF::IntervalExeState::getAddrs</a></div><div class="ttdeci">Addrs & getAddrs(u32_t id) override</div><div class="ttdoc">get memory addresses of variable</div><div class="ttdef"><b>Definition:</b> <a href="IntervalExeState_8h_source.html#l00452">IntervalExeState.h:452</a></div></div>
|
|
1905
|
+
<div class="ttc" id="aclassSVF_1_1AddrStmt_html"><div class="ttname"><a href="classSVF_1_1AddrStmt.html">SVF::AddrStmt</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00313">SVFStatements.h:313</a></div></div>
|
|
1906
|
+
<div class="ttc" id="aclassSVF_1_1IntervalValue_html_a739ab04e16ec1156be71b29d49998a4f"><div class="ttname"><a href="classSVF_1_1IntervalValue.html#a739ab04e16ec1156be71b29d49998a4f">SVF::IntervalValue::plus_infinity</a></div><div class="ttdeci">static NumericLiteral plus_infinity()</div><div class="ttdoc">Get plus infinity +oo.</div><div class="ttdef"><b>Definition:</b> <a href="IntervalValue_8h_source.html#l00072">IntervalValue.h:72</a></div></div>
|
|
1907
|
+
<div class="ttc" id="aclassSVF_1_1CFBasicBlockGBuilder_html"><div class="ttname"><a href="classSVF_1_1CFBasicBlockGBuilder.html">SVF::CFBasicBlockGBuilder</a></div><div class="ttdef"><b>Definition:</b> <a href="CFBasicBlockGBuilder_8h_source.html#l00035">CFBasicBlockGBuilder.h:35</a></div></div>
|
|
1908
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_a319fe24ebb925f70fde574d5b17c3b98"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#a319fe24ebb925f70fde574d5b17c3b98">SVF::AbstractExecution::isExtCall</a></div><div class="ttdeci">bool isExtCall(const CallICFGNode *callNode)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00652">AbstractExecution.cpp:652</a></div></div>
|
|
1909
|
+
<div class="ttc" id="aclassSVF_1_1PhiStmt_html"><div class="ttname"><a href="classSVF_1_1PhiStmt.html">SVF::PhiStmt</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00761">SVFStatements.h:761</a></div></div>
|
|
1910
|
+
<div class="ttc" id="aclassSVF_1_1MultiOpndStmt_html_a5c6efcc023e90ef2e618586091958c59"><div class="ttname"><a href="classSVF_1_1MultiOpndStmt.html#a5c6efcc023e90ef2e618586091958c59">SVF::MultiOpndStmt::getOpVarID</a></div><div class="ttdeci">NodeID getOpVarID(u32_t pos) const</div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8cpp_source.html#l00284">SVFStatements.cpp:284</a></div></div>
|
|
1911
|
+
<div class="ttc" id="aclassSVF_1_1RetICFGNode_html"><div class="ttname"><a href="classSVF_1_1RetICFGNode.html">SVF::RetICFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="ICFGNode_8h_source.html#l00487">ICFGNode.h:487</a></div></div>
|
|
1912
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_a6cbc336372afb947c783fb14c45426df"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#a6cbc336372afb947c783fb14c45426df">SVF::AbstractExecution::handleCallSite</a></div><div class="ttdeci">virtual void handleCallSite(const ICFGNode *node)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00621">AbstractExecution.cpp:621</a></div></div>
|
|
1913
|
+
<div class="ttc" id="anamespaceSVF_html_af739db846e47ba6b2fd15eaad31ab7fb"><div class="ttname"><a href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">SVF::Set</a></div><div class="ttdeci">std::unordered_set< Key, Hash, KeyEqual, Allocator > Set</div><div class="ttdef"><b>Definition:</b> <a href="GeneralType_8h_source.html#l00092">GeneralType.h:92</a></div></div>
|
|
1914
|
+
<div class="ttc" id="aclassSVF_1_1CallICFGNode_html_a90fd0b8e44fba1a7eb76d15bce085d66"><div class="ttname"><a href="classSVF_1_1CallICFGNode.html#a90fd0b8e44fba1a7eb76d15bce085d66">SVF::CallICFGNode::getCallSite</a></div><div class="ttdeci">const SVFInstruction * getCallSite() const</div><div class="ttdoc">Return callsite.</div><div class="ttdef"><b>Definition:</b> <a href="ICFGNode_8h_source.html#l00409">ICFGNode.h:409</a></div></div>
|
|
1915
|
+
<div class="ttc" id="aclassSVF_1_1ObjVar_html"><div class="ttname"><a href="classSVF_1_1ObjVar.html">SVF::ObjVar</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFVariables_8h_source.html#l00315">SVFVariables.h:315</a></div></div>
|
|
1916
|
+
<div class="ttc" id="aclassSVF_1_1IntervalValue_html_a0df07a2659cbf3a918de5b0d7c407264"><div class="ttname"><a href="classSVF_1_1IntervalValue.html#a0df07a2659cbf3a918de5b0d7c407264">SVF::IntervalValue::lb</a></div><div class="ttdeci">const NumericLiteral & lb() const</div><div class="ttdoc">Return the lower bound.</div><div class="ttdef"><b>Definition:</b> <a href="IntervalValue_8h_source.html#l00218">IntervalValue.h:218</a></div></div>
|
|
1917
|
+
<div class="ttc" id="anamespaceSVF_html"><div class="ttname"><a href="namespaceSVF.html">SVF</a></div><div class="ttdoc">for isBitcode</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00066">BasicTypes.h:66</a></div></div>
|
|
1918
|
+
<div class="ttc" id="aclassSVF_1_1CFBasicBlockNode_html_ac468c52cc443f1137f6d5fb510a8ac46"><div class="ttname"><a href="classSVF_1_1CFBasicBlockNode.html#ac468c52cc443f1137f6d5fb510a8ac46">SVF::CFBasicBlockNode::hasIncomingEdge</a></div><div class="ttdeci">bool hasIncomingEdge() const</div><div class="ttdoc">Has incoming/outgoing edge set.</div><div class="ttdef"><b>Definition:</b> <a href="CFBasicBlockG_8h_source.html#l00207">CFBasicBlockG.h:207</a></div></div>
|
|
1919
|
+
<div class="ttc" id="anamespaceSVF_1_1SVFUtil_html_a9815a5b31ac7dc21239d08e5b9f61106"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a9815a5b31ac7dc21239d08e5b9f61106">SVF::SVFUtil::getSVFCallSite</a></div><div class="ttdeci">CallSite getSVFCallSite(const SVFInstruction *inst)</div><div class="ttdoc">Return LLVM callsite given an instruction.</div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00196">SVFUtil.h:196</a></div></div>
|
|
1920
|
+
<div class="ttc" id="aclassSVF_1_1AEAPI_html_a4d160903c3bbedbd486be39c40c2c836"><div class="ttname"><a href="classSVF_1_1AEAPI.html#a4d160903c3bbedbd486be39c40c2c836">SVF::AEAPI::handleStrcat</a></div><div class="ttdeci">virtual void handleStrcat(const CallICFGNode *call)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l01580">AbstractExecution.cpp:1580</a></div></div>
|
|
1921
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_ac7a25ad5cbc1a6132869ae54b805f73a"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#ac7a25ad5cbc1a6132869ae54b805f73a">SVF::AbstractExecution::hasCmpBranchES</a></div><div class="ttdeci">bool hasCmpBranchES(const CmpStmt *cmpStmt, s64_t succ, IntervalExeState &es)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00290">AbstractExecution.cpp:290</a></div></div>
|
|
1922
|
+
<div class="ttc" id="aSVFType_8h_html_a1aeda3370621dc00e9a0fe8e7aabc736"><div class="ttname"><a href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a></div><div class="ttdeci">#define TIMEINTERVAL</div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00512">SVFType.h:512</a></div></div>
|
|
1923
|
+
<div class="ttc" id="aclassSVF_1_1IntervalExeState_html_aab316a63c25483eefc38bed0a86a0e7e"><div class="ttname"><a href="classSVF_1_1IntervalExeState.html#aab316a63c25483eefc38bed0a86a0e7e">SVF::IntervalExeState::inVarToValTable</a></div><div class="ttdeci">bool inVarToValTable(u32_t id) const override</div><div class="ttdoc">whether the variable is in varToVal table</div><div class="ttdef"><b>Definition:</b> <a href="IntervalExeState_8h_source.html#l00481">IntervalExeState.h:481</a></div></div>
|
|
1924
|
+
<div class="ttc" id="aclassSVF_1_1ICFGNode_html_a6c68f52dd90728073fb79141df9b0661"><div class="ttname"><a href="classSVF_1_1ICFGNode.html#a6c68f52dd90728073fb79141df9b0661">SVF::ICFGNode::getSVFStmts</a></div><div class="ttdeci">const SVFStmtList & getSVFStmts() const</div><div class="ttdef"><b>Definition:</b> <a href="ICFGNode_8h_source.html#l00127">ICFGNode.h:127</a></div></div>
|
|
1925
|
+
<div class="ttc" id="aclassSVF_1_1SelectStmt_html"><div class="ttname"><a href="classSVF_1_1SelectStmt.html">SVF::SelectStmt</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00829">SVFStatements.h:829</a></div></div>
|
|
1926
|
+
<div class="ttc" id="aclassSVF_1_1IntervalValue_html_a144e17cec654e83654298b379ed4ce9f"><div class="ttname"><a href="classSVF_1_1IntervalValue.html#a144e17cec654e83654298b379ed4ce9f">SVF::IntervalValue::meet_with</a></div><div class="ttdeci">void meet_with(const IntervalValue &other)</div><div class="ttdoc">Return a intersected IntervalValue.</div><div class="ttdef"><b>Definition:</b> <a href="IntervalValue_8h_source.html#l00408">IntervalValue.h:408</a></div></div>
|
|
1927
|
+
<div class="ttc" id="aclassSVF_1_1RetPE_html"><div class="ttname"><a href="classSVF_1_1RetPE.html">SVF::RetPE</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00618">SVFStatements.h:618</a></div></div>
|
|
1928
|
+
<div class="ttc" id="aclassSVF_1_1CmpStmt_html"><div class="ttname"><a href="classSVF_1_1CmpStmt.html">SVF::CmpStmt</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00884">SVFStatements.h:884</a></div></div>
|
|
1929
|
+
<div class="ttc" id="aextapi_8c_html_abe92a0aebef4717d08c64655ac44c9af"><div class="ttname"><a href="extapi_8c.html#abe92a0aebef4717d08c64655ac44c9af">isalnum</a></div><div class="ttdeci">int isalnum(int character)</div><div class="ttdef"><b>Definition:</b> <a href="extapi_8c_source.html#l00832">extapi.c:832</a></div></div>
|
|
1930
|
+
<div class="ttc" id="aextapi_8c_html_a3fa45b35c8abf67a950b6d3d4063dede"><div class="ttname"><a href="extapi_8c.html#a3fa45b35c8abf67a950b6d3d4063dede">isdigit</a></div><div class="ttdeci">int isdigit(int c)</div><div class="ttdef"><b>Definition:</b> <a href="extapi_8c_source.html#l00852">extapi.c:852</a></div></div>
|
|
1931
|
+
<div class="ttc" id="aclassSVF_1_1SVFValue_html_a11f2d9b6e969ede6fca2c204cc15b821"><div class="ttname"><a href="classSVF_1_1SVFValue.html#a11f2d9b6e969ede6fca2c204cc15b821">SVF::SVFValue::getType</a></div><div class="ttdeci">virtual const SVFType * getType() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00256">SVFValue.h:256</a></div></div>
|
|
1932
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_aa220cdcd1653998d684ec14fe729932d"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#aa220cdcd1653998d684ec14fe729932d">SVF::AbstractExecution::recursiveCallPass</a></div><div class="ttdeci">void recursiveCallPass(const CallICFGNode *callNode)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00671">AbstractExecution.cpp:671</a></div></div>
|
|
1933
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_aa964763a5e9e99276707bd6678d1f37f"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#aa964763a5e9e99276707bd6678d1f37f">SVF::AbstractExecution::widenFixpointPass</a></div><div class="ttdeci">bool widenFixpointPass(const CFBasicBlockNode *cycle_head, IntervalExeState &pre_es)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00829">AbstractExecution.cpp:829</a></div></div>
|
|
1934
|
+
<div class="ttc" id="aclassSVF_1_1FIFOWorkList_html_a7056704c224dfb4b57287fe90c004aa8"><div class="ttname"><a href="classSVF_1_1FIFOWorkList.html#a7056704c224dfb4b57287fe90c004aa8">SVF::FIFOWorkList::empty</a></div><div class="ttdeci">bool empty() const</div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00146">WorkList.h:146</a></div></div>
|
|
1935
|
+
<div class="ttc" id="aclassSVF_1_1SVFVar_html_ac2db6304ea5526fb446ae882983beeb0"><div class="ttname"><a href="classSVF_1_1SVFVar.html#ac2db6304ea5526fb446ae882983beeb0">SVF::SVFVar::getValue</a></div><div class="ttdeci">const SVFValue * getValue() const</div><div class="ttdoc">Get/has methods of the components.</div><div class="ttdef"><b>Definition:</b> <a href="SVFVariables_8h_source.html#l00094">SVFVariables.h:94</a></div></div>
|
|
1936
|
+
<div class="ttc" id="aclassSVF_1_1AEAPI_html_a2dc09f4a21cf629ebe500f856cf86bb4"><div class="ttname"><a href="classSVF_1_1AEAPI.html#a2dc09f4a21cf629ebe500f856cf86bb4">SVF::AEAPI::collectCheckPoint</a></div><div class="ttdeci">void collectCheckPoint()</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l01313">AbstractExecution.cpp:1313</a></div></div>
|
|
1937
|
+
<div class="ttc" id="acJSON_8h_html_a25d22ecc7e656d2c59332072684e8766"><div class="ttname"><a href="cJSON_8h.html#a25d22ecc7e656d2c59332072684e8766">name</a></div><div class="ttdeci">const char *const name</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00264">cJSON.h:264</a></div></div>
|
|
1938
|
+
<div class="ttc" id="anamespaceSVF_html_a366625858f450a1ea5f985a3c83e0f14"><div class="ttname"><a href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">SVF::u64_t</a></div><div class="ttdeci">unsigned long long u64_t</div><div class="ttdef"><b>Definition:</b> <a href="GeneralType_8h_source.html#l00048">GeneralType.h:48</a></div></div>
|
|
1939
|
+
<div class="ttc" id="aclassSVF_1_1ICFGNode_html"><div class="ttname"><a href="classSVF_1_1ICFGNode.html">SVF::ICFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="ICFGNode_8h_source.html#l00054">ICFGNode.h:54</a></div></div>
|
|
1940
|
+
<div class="ttc" id="aclassSVF_1_1AEStat_html_a798d07cc0a36ce0d9010ab86d1ec216f"><div class="ttname"><a href="classSVF_1_1AEStat.html#a798d07cc0a36ce0d9010ab86d1ec216f">SVF::AEStat::performStat</a></div><div class="ttdeci">void performStat() override</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l01085">AbstractExecution.cpp:1085</a></div></div>
|
|
1941
|
+
<div class="ttc" id="aclassSVF_1_1SCCDetection_html_a123b5006a6da7053e5e357140da3c5a3"><div class="ttname"><a href="classSVF_1_1SCCDetection.html#a123b5006a6da7053e5e357140da3c5a3">SVF::SCCDetection::find</a></div><div class="ttdeci">void find(void)</div><div class="ttdef"><b>Definition:</b> <a href="SCC_8h_source.html#l00308">SCC.h:308</a></div></div>
|
|
1942
|
+
<div class="ttc" id="aclassSVF_1_1IntervalValue_html_a43f48c744f7bda0dc689b8f186449371"><div class="ttname"><a href="classSVF_1_1IntervalValue.html#a43f48c744f7bda0dc689b8f186449371">SVF::IntervalValue::minus_infinity</a></div><div class="ttdeci">static NumericLiteral minus_infinity()</div><div class="ttdoc">Get minus infinity -oo.</div><div class="ttdef"><b>Definition:</b> <a href="IntervalValue_8h_source.html#l00066">IntervalValue.h:66</a></div></div>
|
|
1943
|
+
<div class="ttc" id="aclassSVF_1_1SVFType_html_a330084f9a3deb6e5acb52a8ee3eb7fe4"><div class="ttname"><a href="classSVF_1_1SVFType.html#a330084f9a3deb6e5acb52a8ee3eb7fe4">SVF::SVFType::isArrayTy</a></div><div class="ttdeci">bool isArrayTy() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00254">SVFType.h:254</a></div></div>
|
|
1944
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_ac8af7bb8a5442ffd885249cecc5c0f02"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#ac8af7bb8a5442ffd885249cecc5c0f02">SVF::AbstractExecution::isGlobalEntry</a></div><div class="ttdeci">bool isGlobalEntry(const CFBasicBlockNode *block)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00282">AbstractExecution.cpp:282</a></div></div>
|
|
1945
|
+
<div class="ttc" id="aclassSVF_1_1SVFStmt_html_a8cd7b6c6fd8b030b1421d95a086359f4"><div class="ttname"><a href="classSVF_1_1SVFStmt.html#a8cd7b6c6fd8b030b1421d95a086359f4">SVF::SVFStmt::SVFStmtSetTy</a></div><div class="ttdeci">GenericNode< SVFVar, SVFStmt >::GEdgeSetTy SVFStmtSetTy</div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00217">SVFStatements.h:217</a></div></div>
|
|
1946
|
+
<div class="ttc" id="aclassSVF_1_1IntervalValue_html_a5d73cc2aa0a6ed49e8301fa7b0cd5045"><div class="ttname"><a href="classSVF_1_1IntervalValue.html#a5d73cc2aa0a6ed49e8301fa7b0cd5045">SVF::IntervalValue::toString</a></div><div class="ttdeci">const std::string toString() const</div><div class="ttdef"><b>Definition:</b> <a href="IntervalValue_8h_source.html#l00441">IntervalValue.h:441</a></div></div>
|
|
1947
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_a97c5745ddcd0ce72e65dee09ff7afb42"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#a97c5745ddcd0ce72e65dee09ff7afb42">SVF::AbstractExecution::SkipRecursiveCall</a></div><div class="ttdeci">virtual void SkipRecursiveCall(const CallICFGNode *callnode)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00958">AbstractExecution.cpp:958</a></div></div>
|
|
1948
|
+
<div class="ttc" id="aclassSVF_1_1IntervalValue_html_af8be90fc1b61103187908dce4ba68001"><div class="ttname"><a href="classSVF_1_1IntervalValue.html#af8be90fc1b61103187908dce4ba68001">SVF::IntervalValue::isBottom</a></div><div class="ttdeci">bool isBottom() const override</div><div class="ttdef"><b>Definition:</b> <a href="IntervalValue_8h_source.html#l00060">IntervalValue.h:60</a></div></div>
|
|
1949
|
+
<div class="ttc" id="aclassSVF_1_1SVFVar_html_a3b61042079a6c9dc395f38925c6a1271"><div class="ttname"><a href="classSVF_1_1SVFVar.html#a3b61042079a6c9dc395f38925c6a1271">SVF::SVFVar::isPointer</a></div><div class="ttdeci">virtual bool isPointer() const</div><div class="ttdoc">Whether it is a pointer.</div><div class="ttdef"><b>Definition:</b> <a href="SVFVariables_8h_source.html#l00117">SVFVariables.h:117</a></div></div>
|
|
1950
|
+
<div class="ttc" id="aclassSVF_1_1AEAPI_html_ac49859a7848fbef0e29492e95b031f1f"><div class="ttname"><a href="classSVF_1_1AEAPI.html#ac49859a7848fbef0e29492e95b031f1f">SVF::AEAPI::AccessMemoryViaCallArgs</a></div><div class="ttdeci">void AccessMemoryViaCallArgs(const SVF::SVFArgument *arg, SVF::FILOWorkList< const SVFValue * > &worklist, Set< const SVFValue * > &visited)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l01799">AbstractExecution.cpp:1799</a></div></div>
|
|
1951
|
+
<div class="ttc" id="aclassSVF_1_1IntervalESBase_html_ab5d7ac23f8334fa32ae0a78c8f1d9fa9"><div class="ttname"><a href="classSVF_1_1IntervalESBase.html#ab5d7ac23f8334fa32ae0a78c8f1d9fa9">SVF::IntervalESBase::toString</a></div><div class="ttdeci">std::string toString() const override</div><div class="ttdef"><b>Definition:</b> <a href="IntervalExeState_8h_source.html#l00317">IntervalExeState.h:317</a></div></div>
|
|
1952
|
+
<div class="ttc" id="aclassSVF_1_1CallPE_html"><div class="ttname"><a href="classSVF_1_1CallPE.html">SVF::CallPE</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00558">SVFStatements.h:558</a></div></div>
|
|
1953
|
+
<div class="ttc" id="aclassSVF_1_1AEAPI_html_a3df0f1b34893f44904dce62e6641a58e"><div class="ttname"><a href="classSVF_1_1AEAPI.html#a3df0f1b34893f44904dce62e6641a58e">SVF::AEAPI::strRead</a></div><div class="ttdeci">std::string strRead(const SVFValue *rhs)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l01218">AbstractExecution.cpp:1218</a></div></div>
|
|
1954
|
+
<div class="ttc" id="acJSON_8h_html_a750b5d744c39a06bfb13e6eb010e35d0"><div class="ttname"><a href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a></div><div class="ttdeci">int index</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00170">cJSON.h:170</a></div></div>
|
|
1955
|
+
<div class="ttc" id="aclassSVF_1_1GenericNode_html_ac3e55ef37aefb411ea4c87b1aa3b1895"><div class="ttname"><a href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">SVF::GenericNode::getId</a></div><div class="ttdeci">NodeID getId() const</div><div class="ttdoc">Get ID.</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00180">GenericGraph.h:180</a></div></div>
|
|
1956
|
+
<div class="ttc" id="aclassSVF_1_1WTOComponent_html"><div class="ttname"><a href="classSVF_1_1WTOComponent.html">SVF::WTOComponent</a></div><div class="ttdef"><b>Definition:</b> <a href="WTO_8h_source.html#l00271">WTO.h:271</a></div></div>
|
|
1957
|
+
<div class="ttc" id="aclassSVF_1_1IntervalValue_html_a523826aede7ad22736beed0c8223b6b0"><div class="ttname"><a href="classSVF_1_1IntervalValue.html#a523826aede7ad22736beed0c8223b6b0">SVF::IntervalValue::is_numeral</a></div><div class="ttdeci">bool is_numeral() const</div><div class="ttdoc">Return true if the IntervalValue is a number [num, num].</div><div class="ttdef"><b>Definition:</b> <a href="IntervalValue_8h_source.html#l00270">IntervalValue.h:270</a></div></div>
|
|
1958
|
+
<div class="ttc" id="aclassSVF_1_1IntervalValue_html_add3acad151d5af6c9a5f692f7a01e65b"><div class="ttname"><a href="classSVF_1_1IntervalValue.html#add3acad151d5af6c9a5f692f7a01e65b">SVF::IntervalValue::top</a></div><div class="ttdeci">static IntervalValue top()</div><div class="ttdoc">Create the IntervalValue [-oo, +oo].</div><div class="ttdef"><b>Definition:</b> <a href="IntervalValue_8h_source.html#l00083">IntervalValue.h:83</a></div></div>
|
|
1959
|
+
<div class="ttc" id="aclassSVF_1_1WTO_html_a13e9082913aa4a14065687ccdd47642d"><div class="ttname"><a href="classSVF_1_1WTO.html#a13e9082913aa4a14065687ccdd47642d">SVF::WTO::begin</a></div><div class="ttdeci">Iterator begin() const</div><div class="ttdef"><b>Definition:</b> <a href="WTO_8h_source.html#l00583">WTO.h:583</a></div></div>
|
|
1960
|
+
<div class="ttc" id="aclassSVF_1_1AEAPI_html_afa34cb2ee3fc1ca5aa04a2afe7c2d6e8"><div class="ttname"><a href="classSVF_1_1AEAPI.html#afa34cb2ee3fc1ca5aa04a2afe7c2d6e8">SVF::AEAPI::AccessMemoryViaLoadStmt</a></div><div class="ttdeci">void AccessMemoryViaLoadStmt(const LoadStmt *load, SVF::FILOWorkList< const SVFValue * > &worklist, Set< const SVFValue * > &visited)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l01779">AbstractExecution.cpp:1779</a></div></div>
|
|
1961
|
+
<div class="ttc" id="aOptions_8h_html"><div class="ttname"><a href="Options_8h.html">Options.h</a></div></div>
|
|
1962
|
+
<div class="ttc" id="aclassSVF_1_1SVFFunction_html_a067bd6dbaf74a028d546fa56b095791b"><div class="ttname"><a href="classSVF_1_1SVFFunction.html#a067bd6dbaf74a028d546fa56b095791b">SVF::SVFFunction::getAnnotations</a></div><div class="ttdeci">const std::vector< std::string > & getAnnotations() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00466">SVFValue.h:466</a></div></div>
|
|
1963
|
+
<div class="ttc" id="aclassSVF_1_1AssignStmt_html_a4cec89489e82c60c287cae3327f3f01d"><div class="ttname"><a href="classSVF_1_1AssignStmt.html#a4cec89489e82c60c287cae3327f3f01d">SVF::AssignStmt::getRHSVarID</a></div><div class="ttdeci">NodeID getRHSVarID() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00298">SVFStatements.h:298</a></div></div>
|
|
1964
|
+
<div class="ttc" id="anamespaceSVF_1_1SVFUtil_html_a145abbd2958629718fbca41d25c3124d"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">SVF::SVFUtil::getCallee</a></div><div class="ttdeci">const SVFFunction * getCallee(const CallSite cs)</div><div class="ttdoc">Return callee of a callsite. Return null if this is an indirect call.</div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00241">SVFUtil.h:241</a></div></div>
|
|
1965
|
+
<div class="ttc" id="aclassSVF_1_1ValVar_html"><div class="ttname"><a href="classSVF_1_1ValVar.html">SVF::ValVar</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFVariables_8h_source.html#l00262">SVFVariables.h:262</a></div></div>
|
|
1966
|
+
<div class="ttc" id="aclassSVF_1_1SVFIR2ItvExeState_html"><div class="ttname"><a href="classSVF_1_1SVFIR2ItvExeState.html">SVF::SVFIR2ItvExeState</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFIR2ItvExeState_8h_source.html#l00041">SVFIR2ItvExeState.h:41</a></div></div>
|
|
1967
|
+
<div class="ttc" id="aclassSVF_1_1NumericLiteral_html_a4181e5e15e10304ea524e5f8b2a3f576"><div class="ttname"><a href="classSVF_1_1NumericLiteral.html#a4181e5e15e10304ea524e5f8b2a3f576">SVF::NumericLiteral::getNumeral</a></div><div class="ttdeci">s64_t getNumeral() const</div><div class="ttdoc">Return Numeral.</div><div class="ttdef"><b>Definition:</b> <a href="NumericLiteral_8h_source.html#l00118">NumericLiteral.h:118</a></div></div>
|
|
1968
|
+
<div class="ttc" id="aclassSVF_1_1WTO_html_a22b67a51964cb1d7882aab7e74b026f2"><div class="ttname"><a href="classSVF_1_1WTO.html#a22b67a51964cb1d7882aab7e74b026f2">SVF::WTO::end</a></div><div class="ttdeci">Iterator end() const</div><div class="ttdoc">End iterator over the components.</div><div class="ttdef"><b>Definition:</b> <a href="WTO_8h_source.html#l00589">WTO.h:589</a></div></div>
|
|
1969
|
+
<div class="ttc" id="aclassSVF_1_1BinaryOPStmt_html"><div class="ttname"><a href="classSVF_1_1BinaryOPStmt.html">SVF::BinaryOPStmt</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00970">SVFStatements.h:970</a></div></div>
|
|
1970
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_a1d725fe50a7084bfa18bd47b941af885"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#a1d725fe50a7084bfa18bd47b941af885">SVF::AbstractExecution::handleSVFStatement</a></div><div class="ttdeci">virtual void handleSVFStatement(const SVFStmt *stmt)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00899">AbstractExecution.cpp:899</a></div></div>
|
|
1971
|
+
<div class="ttc" id="aclassSVF_1_1AEAPI_html_a243821a56807acf98be9d88f8947e01d"><div class="ttname"><a href="classSVF_1_1AEAPI.html#a243821a56807acf98be9d88f8947e01d">SVF::AEAPI::initExtFunMap</a></div><div class="ttdeci">virtual void initExtFunMap()</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l01146">AbstractExecution.cpp:1146</a></div></div>
|
|
1972
|
+
<div class="ttc" id="aclassSVF_1_1SVFBasicBlock_html"><div class="ttname"><a href="classSVF_1_1SVFBasicBlock.html">SVF::SVFBasicBlock</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00527">SVFValue.h:527</a></div></div>
|
|
1973
|
+
<div class="ttc" id="aclassSVF_1_1StoreStmt_html"><div class="ttname"><a href="classSVF_1_1StoreStmt.html">SVF::StoreStmt</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00400">SVFStatements.h:400</a></div></div>
|
|
1974
|
+
<div class="ttc" id="aclassSVF_1_1SVFValue_html"><div class="ttname"><a href="classSVF_1_1SVFValue.html">SVF::SVFValue</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00177">SVFValue.h:177</a></div></div>
|
|
1975
|
+
<div class="ttc" id="aclassSVF_1_1Options_html_ad989eab7d521e9933ac8e46e1c29f662"><div class="ttname"><a href="classSVF_1_1Options.html#ad989eab7d521e9933ac8e46e1c29f662">SVF::Options::OutputName</a></div><div class="ttdeci">static const Option< std::string > OutputName</div><div class="ttdoc">bug info output file, Default: output.db</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00269">Options.h:269</a></div></div>
|
|
1976
|
+
<div class="ttc" id="aextapi_8c_html_adadd6582d46775aab6a51e29d16d9f77"><div class="ttname"><a href="extapi_8c.html#adadd6582d46775aab6a51e29d16d9f77">isupper</a></div><div class="ttdeci">int isupper(int c)</div><div class="ttdef"><b>Definition:</b> <a href="extapi_8c_source.html#l00882">extapi.c:882</a></div></div>
|
|
1977
|
+
<div class="ttc" id="aclassSVF_1_1AEAPI_html_ae0519df0b6927a2d077c3d46beeaa9f7"><div class="ttname"><a href="classSVF_1_1AEAPI.html#ae0519df0b6927a2d077c3d46beeaa9f7">SVF::AEAPI::getStrlen</a></div><div class="ttdeci">IntervalValue getStrlen(const SVF::SVFValue *strValue)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l01526">AbstractExecution.cpp:1526</a></div></div>
|
|
1978
|
+
<div class="ttc" id="acJSON_8h_html_ad4c68ea99a26b0a98ad9a79982960458"><div class="ttname"><a href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">string</a></div><div class="ttdeci">const char *const string</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00172">cJSON.h:172</a></div></div>
|
|
1979
|
+
<div class="ttc" id="aclassSVF_1_1SVFArrayType_html"><div class="ttname"><a href="classSVF_1_1SVFArrayType.html">SVF::SVFArrayType</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00377">SVFType.h:377</a></div></div>
|
|
1980
|
+
<div class="ttc" id="aclassSVF_1_1Options_html_ab25f7ec430ba1d41597fc409b758b193"><div class="ttname"><a href="classSVF_1_1Options.html#ab25f7ec430ba1d41597fc409b758b193">SVF::Options::WidenDelay</a></div><div class="ttdeci">static const Option< u32_t > WidenDelay</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00265">Options.h:265</a></div></div>
|
|
1981
|
+
<div class="ttc" id="aclassSVF_1_1CallICFGNode_html"><div class="ttname"><a href="classSVF_1_1CallICFGNode.html">SVF::CallICFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="ICFGNode_8h_source.html#l00385">ICFGNode.h:385</a></div></div>
|
|
1982
|
+
<div class="ttc" id="aclassSVF_1_1SVFType_html"><div class="ttname"><a href="classSVF_1_1SVFType.html">SVF::SVFType</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00156">SVFType.h:156</a></div></div>
|
|
1983
|
+
<div class="ttc" id="aclassSVF_1_1SVFVar_html_a747b2c92c81d32fcd357e80d2d8fe7cc"><div class="ttname"><a href="classSVF_1_1SVFVar.html#a747b2c92c81d32fcd357e80d2d8fe7cc">SVF::SVFVar::hasIncomingEdges</a></div><div class="ttdeci">bool hasIncomingEdges(SVFStmt::PEDGEK kind) const</div><div class="ttdoc">Has incoming SVFIR statements (edges)</div><div class="ttdef"><b>Definition:</b> <a href="SVFVariables_8h_source.html#l00158">SVFVariables.h:158</a></div></div>
|
|
1984
|
+
<div class="ttc" id="aclassSVF_1_1ExeState_html_a0710c9cc1a3c40c95cd362d49bea459b"><div class="ttname"><a href="classSVF_1_1ExeState.html#a0710c9cc1a3c40c95cd362d49bea459b">SVF::ExeState::getVarToAddrs</a></div><div class="ttdeci">virtual const VarToAddrs & getVarToAddrs() const</div><div class="ttdef"><b>Definition:</b> <a href="ExeState_8h_source.html#l00120">ExeState.h:120</a></div></div>
|
|
1985
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_a7a9a6b46b24d044316f609f71344e2bb"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#a7a9a6b46b24d044316f609f71344e2bb">SVF::AbstractExecution::runOnModule</a></div><div class="ttdeci">virtual void runOnModule(SVFIR *svfModule)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00092">AbstractExecution.cpp:92</a></div></div>
|
|
1986
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_a7e1c3edfa546182ad394116b37b834f9"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#a7e1c3edfa546182ad394116b37b834f9">SVF::AbstractExecution::SkipRecursiveFunc</a></div><div class="ttdeci">virtual void SkipRecursiveFunc(const SVFFunction *func)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00985">AbstractExecution.cpp:985</a></div></div>
|
|
1987
|
+
<div class="ttc" id="aAbstractExecution_8cpp_html_a6ded577f411d8dd34071fba96989f93a"><div class="ttname"><a href="AbstractExecution_8cpp.html#a6ded577f411d8dd34071fba96989f93a">SSE_FUNC_PROCESS</a></div><div class="ttdeci">#define SSE_FUNC_PROCESS(LLVM_NAME,FUNC_NAME)</div></div>
|
|
1988
|
+
<div class="ttc" id="aSVFIR_8h_html"><div class="ttname"><a href="SVFIR_8h.html">SVFIR.h</a></div></div>
|
|
1989
|
+
<div class="ttc" id="aclassSVF_1_1IntraCFGEdge_html"><div class="ttname"><a href="classSVF_1_1IntraCFGEdge.html">SVF::IntraCFGEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="ICFGEdge_8h_source.html#l00113">ICFGEdge.h:113</a></div></div>
|
|
1990
|
+
<div class="ttc" id="aclassSVF_1_1SVFFunction_html"><div class="ttname"><a href="classSVF_1_1SVFFunction.html">SVF::SVFFunction</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00297">SVFValue.h:297</a></div></div>
|
|
1991
|
+
<div class="ttc" id="aextapi_8c_html_a9d60842d6ae065229ba810e6b01110da"><div class="ttname"><a href="extapi_8c.html#a9d60842d6ae065229ba810e6b01110da">ispunct</a></div><div class="ttdeci">int ispunct(int argument)</div><div class="ttdef"><b>Definition:</b> <a href="extapi_8c_source.html#l00872">extapi.c:872</a></div></div>
|
|
1992
|
+
<div class="ttc" id="aclassSVF_1_1AEAPI_html_a7be3da80bedb1077a99d67daa124afde"><div class="ttname"><a href="classSVF_1_1AEAPI.html#a7be3da80bedb1077a99d67daa124afde">SVF::AEAPI::AccessMemoryViaRetNode</a></div><div class="ttdeci">void AccessMemoryViaRetNode(const CallICFGNode *callnode, SVF::FILOWorkList< const SVFValue * > &worklist, Set< const SVFValue * > &visited)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l01745">AbstractExecution.cpp:1745</a></div></div>
|
|
1993
|
+
<div class="ttc" id="aclassSVF_1_1FILOWorkList_html_afcf3fcda18e8d3e2bad70a51376c0ce1"><div class="ttname"><a href="classSVF_1_1FILOWorkList.html#afcf3fcda18e8d3e2bad70a51376c0ce1">SVF::FILOWorkList::push</a></div><div class="ttdeci">bool push(const Data &data)</div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00257">WorkList.h:257</a></div></div>
|
|
1994
|
+
<div class="ttc" id="aclassSVF_1_1CFBasicBlockGBuilder_html_a25f0496187622b156bafc49f34fffeaf"><div class="ttname"><a href="classSVF_1_1CFBasicBlockGBuilder.html#a25f0496187622b156bafc49f34fffeaf">SVF::CFBasicBlockGBuilder::build</a></div><div class="ttdeci">virtual void build(ICFG *icfg)</div><div class="ttdef"><b>Definition:</b> <a href="CFBasicBlockGBuilder_8cpp_source.html#l00247">CFBasicBlockGBuilder.cpp:247</a></div></div>
|
|
1995
|
+
<div class="ttc" id="aclassSVF_1_1IntervalValue_html_adac2dc2c9f744a071ad3f0175ed40cd9"><div class="ttname"><a href="classSVF_1_1IntervalValue.html#adac2dc2c9f744a071ad3f0175ed40cd9">SVF::IntervalValue::ub</a></div><div class="ttdeci">const NumericLiteral & ub() const</div><div class="ttdoc">Return the upper bound.</div><div class="ttdef"><b>Definition:</b> <a href="IntervalValue_8h_source.html#l00225">IntervalValue.h:225</a></div></div>
|
|
1996
|
+
<div class="ttc" id="aclassSVF_1_1WTONode_html"><div class="ttname"><a href="classSVF_1_1WTONode.html">SVF::WTONode</a></div><div class="ttdef"><b>Definition:</b> <a href="WTO_8h_source.html#l00045">WTO.h:45</a></div></div>
|
|
1997
|
+
<div class="ttc" id="aclassSVF_1_1SVFGlobalValue_html"><div class="ttname"><a href="classSVF_1_1SVFGlobalValue.html">SVF::SVFGlobalValue</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00856">SVFValue.h:856</a></div></div>
|
|
1998
|
+
<div class="ttc" id="aclassSVF_1_1CFBasicBlockNode_html_afdad57a83c392a8b14b838ecb58f9ff7"><div class="ttname"><a href="classSVF_1_1CFBasicBlockNode.html#afdad57a83c392a8b14b838ecb58f9ff7">SVF::CFBasicBlockNode::getICFGNodes</a></div><div class="ttdeci">const std::vector< const ICFGNode * > & getICFGNodes() const</div><div class="ttdef"><b>Definition:</b> <a href="CFBasicBlockG_8h_source.html#l00153">CFBasicBlockG.h:153</a></div></div>
|
|
1999
|
+
<div class="ttc" id="aclassSVF_1_1AddressValue_html_a3be7a2e3ec3215b67cd60f122d2cd10e"><div class="ttname"><a href="classSVF_1_1AddressValue.html#a3be7a2e3ec3215b67cd60f122d2cd10e">SVF::AddressValue::getInternalID</a></div><div class="ttdeci">static u32_t getInternalID(u32_t idx)</div><div class="ttdoc">Return the internal index if idx is an address otherwise return the value of idx.</div><div class="ttdef"><b>Definition:</b> <a href="AddressValue_8h_source.html#l00217">AddressValue.h:217</a></div></div>
|
|
2000
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_ae641b5687513661a2542e8318430d760"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#ae641b5687513661a2542e8318430d760">SVF::AbstractExecution::markRecursiveFuns</a></div><div class="ttdeci">void markRecursiveFuns()</div><div class="ttdoc">mark recursive functions by detecting SCC in callgraph</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00153">AbstractExecution.cpp:153</a></div></div>
|
|
2001
|
+
<div class="ttc" id="aclassSVF_1_1SVFStmt_html"><div class="ttname"><a href="classSVF_1_1SVFStmt.html">SVF::SVFStmt</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00051">SVFStatements.h:51</a></div></div>
|
|
2002
|
+
<div class="ttc" id="aclassSVF_1_1IntervalExeState_html"><div class="ttname"><a href="classSVF_1_1IntervalExeState.html">SVF::IntervalExeState</a></div><div class="ttdef"><b>Definition:</b> <a href="IntervalExeState_8h_source.html#l00407">IntervalExeState.h:407</a></div></div>
|
|
2003
|
+
<div class="ttc" id="aclassSVF_1_1SVFVar_html"><div class="ttname"><a href="classSVF_1_1SVFVar.html">SVF::SVFVar</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFVariables_8h_source.html#l00045">SVFVariables.h:45</a></div></div>
|
|
2004
|
+
<div class="ttc" id="aclassSVF_1_1AEStat_html_ae2cfe939670689a4ec5030c096a5f546"><div class="ttname"><a href="classSVF_1_1AEStat.html#ae2cfe939670689a4ec5030c096a5f546">SVF::AEStat::countStateSize</a></div><div class="ttdeci">void countStateSize()</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l01022">AbstractExecution.cpp:1022</a></div></div>
|
|
2005
|
+
<div class="ttc" id="aclassSVF_1_1IntervalExeState_html_a92b1b163493a74a31d30a261128edd05"><div class="ttname"><a href="classSVF_1_1IntervalExeState.html#a92b1b163493a74a31d30a261128edd05">SVF::IntervalExeState::globalES</a></div><div class="ttdeci">static IntervalExeState globalES</div><div class="ttdef"><b>Definition:</b> <a href="IntervalExeState_8h_source.html#l00413">IntervalExeState.h:413</a></div></div>
|
|
2006
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_a4715ec6b1aefdfd600fda8324cde2a66"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#a4715ec6b1aefdfd600fda8324cde2a66">SVF::AbstractExecution::handleBlock</a></div><div class="ttdeci">void handleBlock(const CFBasicBlockNode *block)</div><div class="ttdoc">handle instructions in svf basic blocks</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00590">AbstractExecution.cpp:590</a></div></div>
|
|
2007
|
+
<div class="ttc" id="aclassSVF_1_1WTOCycle_html_a807c883d1cfe98c791c903125742f95b"><div class="ttname"><a href="classSVF_1_1WTOCycle.html#a807c883d1cfe98c791c903125742f95b">SVF::WTOCycle::begin</a></div><div class="ttdeci">Iterator begin() const</div><div class="ttdoc">Begin iterator over the components.</div><div class="ttdef"><b>Definition:</b> <a href="WTO_8h_source.html#l00417">WTO.h:417</a></div></div>
|
|
2008
|
+
<div class="ttc" id="aclassSVF_1_1IntraCFGEdge_html_a2657751b285cb6db8084da38b00dcab9"><div class="ttname"><a href="classSVF_1_1IntraCFGEdge.html#a2657751b285cb6db8084da38b00dcab9">SVF::IntraCFGEdge::getCondition</a></div><div class="ttdeci">const SVFValue * getCondition() const</div><div class="ttdef"><b>Definition:</b> <a href="ICFGEdge_8h_source.html#l00140">ICFGEdge.h:140</a></div></div>
|
|
2009
|
+
<div class="ttc" id="aclassSVF_1_1LoadStmt_html"><div class="ttname"><a href="classSVF_1_1LoadStmt.html">SVF::LoadStmt</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00437">SVFStatements.h:437</a></div></div>
|
|
2010
|
+
<div class="ttc" id="aclassSVF_1_1CFBasicBlockNode_html_a439a84d7181616f62d8ebac945dbbd59"><div class="ttname"><a href="classSVF_1_1CFBasicBlockNode.html#a439a84d7181616f62d8ebac945dbbd59">SVF::CFBasicBlockNode::begin</a></div><div class="ttdeci">std::vector< const ICFGNode * >::const_iterator begin() const</div><div class="ttdef"><b>Definition:</b> <a href="CFBasicBlockG_8h_source.html#l00164">CFBasicBlockG.h:164</a></div></div>
|
|
2011
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_acf4a6c3fe5a2239512acb791b9aba854"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#acf4a6c3fe5a2239512acb791b9aba854">SVF::AbstractExecution::extCallPass</a></div><div class="ttdeci">void extCallPass(const CallICFGNode *callNode)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00658">AbstractExecution.cpp:658</a></div></div>
|
|
2012
|
+
<div class="ttc" id="aclassSVF_1_1IntervalValue_html"><div class="ttname"><a href="classSVF_1_1IntervalValue.html">SVF::IntervalValue</a></div><div class="ttdef"><b>Definition:</b> <a href="IntervalValue_8h_source.html#l00043">IntervalValue.h:43</a></div></div>
|
|
2013
|
+
<div class="ttc" id="aclassSVF_1_1IntervalExeState_html_af61110c081ca71f9348e8dfff5aa76e4"><div class="ttname"><a href="classSVF_1_1IntervalExeState.html#af61110c081ca71f9348e8dfff5aa76e4">SVF::IntervalExeState::inLocToAddrsTable</a></div><div class="ttdeci">bool inLocToAddrsTable(u32_t id) const override</div><div class="ttdoc">whether the memory address stores memory addresses</div><div class="ttdef"><b>Definition:</b> <a href="IntervalExeState_8h_source.html#l00488">IntervalExeState.h:488</a></div></div>
|
|
2014
|
+
<div class="ttc" id="aclassSVF_1_1IntervalESBase_html_adb26b186ee31bce7449a7b36faa24cc2"><div class="ttname"><a href="classSVF_1_1IntervalESBase.html#adb26b186ee31bce7449a7b36faa24cc2">SVF::IntervalESBase::store</a></div><div class="ttdeci">void store(u32_t addr, const IntervalValue &val)</div><div class="ttdef"><b>Definition:</b> <a href="IntervalExeState_8h_source.html#l00258">IntervalExeState.h:258</a></div></div>
|
|
2015
|
+
<div class="ttc" id="aclassSVF_1_1CFBasicBlockGWTO_html"><div class="ttname"><a href="classSVF_1_1CFBasicBlockGWTO.html">SVF::CFBasicBlockGWTO</a></div><div class="ttdef"><b>Definition:</b> <a href="CFBasicBlockGWTO_8h_source.html#l00045">CFBasicBlockGWTO.h:45</a></div></div>
|
|
2016
|
+
<div class="ttc" id="aclassSVF_1_1AssignStmt_html_ad03d28d16754c9049dd4d0ad3b6c1e28"><div class="ttname"><a href="classSVF_1_1AssignStmt.html#ad03d28d16754c9049dd4d0ad3b6c1e28">SVF::AssignStmt::getRHSVar</a></div><div class="ttdeci">SVFVar * getRHSVar() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00290">SVFStatements.h:290</a></div></div>
|
|
2017
|
+
<div class="ttc" id="aclassSVF_1_1SCCDetection_html_a5d699af73b1e7ad4e3a5f6d26b8b6d15"><div class="ttname"><a href="classSVF_1_1SCCDetection.html#a5d699af73b1e7ad4e3a5f6d26b8b6d15">SVF::SCCDetection::isInCycle</a></div><div class="ttdeci">bool isInCycle(NodeID n) const</div><div class="ttdoc">whether the node is in a cycle</div><div class="ttdef"><b>Definition:</b> <a href="SCC_8h_source.html#l00149">SCC.h:149</a></div></div>
|
|
2018
|
+
<div class="ttc" id="aextapi_8c_html_a99355d8f0fb41ec43effb95189db0ed4"><div class="ttname"><a href="extapi_8c.html#a99355d8f0fb41ec43effb95189db0ed4">isprint</a></div><div class="ttdeci">int isprint(int c)</div><div class="ttdef"><b>Definition:</b> <a href="extapi_8c_source.html#l00867">extapi.c:867</a></div></div>
|
|
2019
|
+
<div class="ttc" id="aclassSVF_1_1IntervalExeState_html_a46ef74cd1412790b088f1d7320f57a9f"><div class="ttname"><a href="classSVF_1_1IntervalExeState.html#a46ef74cd1412790b088f1d7320f57a9f">SVF::IntervalExeState::joinWith</a></div><div class="ttdeci">void joinWith(const IntervalExeState &other)</div><div class="ttdoc">domain join with other, important! other widen this.</div><div class="ttdef"><b>Definition:</b> <a href="IntervalExeState_8cpp_source.html#l00297">IntervalExeState.cpp:297</a></div></div>
|
|
2020
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_aec702d92bbba9e847a9b3eada060a2c5"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#aec702d92bbba9e847a9b3eada060a2c5">SVF::AbstractExecution::isDirectCall</a></div><div class="ttdeci">bool isDirectCall(const CallICFGNode *callNode)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00688">AbstractExecution.cpp:688</a></div></div>
|
|
2021
|
+
<div class="ttc" id="aextapi_8c_html_a0008a4e8e7889734dc1d83297de07158"><div class="ttname"><a href="extapi_8c.html#a0008a4e8e7889734dc1d83297de07158">iscntrl</a></div><div class="ttdeci">int iscntrl(int c)</div><div class="ttdef"><b>Definition:</b> <a href="extapi_8c_source.html#l00847">extapi.c:847</a></div></div>
|
|
2022
|
+
<div class="ttc" id="aclassSVF_1_1AEAPI_html_ae0847fb421538982bfd50cc280d1a65b"><div class="ttname"><a href="classSVF_1_1AEAPI.html#ae0847fb421538982bfd50cc280d1a65b">SVF::AEAPI::handleMemcpy</a></div><div class="ttdeci">virtual void handleMemcpy(const SVFValue *dst, const SVFValue *src, IntervalValue len, u32_t start_idx)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l01616">AbstractExecution.cpp:1616</a></div></div>
|
|
2023
|
+
<div class="ttc" id="anamespaceSVF_html_a9b707002523ece2ac54ca893ee9a2d4e"><div class="ttname"><a href="namespaceSVF.html#a9b707002523ece2ac54ca893ee9a2d4e">SVF::s32_t</a></div><div class="ttdeci">signed s32_t</div><div class="ttdef"><b>Definition:</b> <a href="GeneralType_8h_source.html#l00047">GeneralType.h:47</a></div></div>
|
|
2024
|
+
<div class="ttc" id="aclassSVF_1_1AddressValue_html_aa7291f4b74bb824fb38b8c383fa0b6a0"><div class="ttname"><a href="classSVF_1_1AddressValue.html#aa7291f4b74bb824fb38b8c383fa0b6a0">SVF::AddressValue::empty</a></div><div class="ttdeci">bool empty() const</div><div class="ttdef"><b>Definition:</b> <a href="AddressValue_8h_source.html#l00115">AddressValue.h:115</a></div></div>
|
|
2025
|
+
<div class="ttc" id="aclassSVF_1_1GepStmt_html"><div class="ttname"><a href="classSVF_1_1GepStmt.html">SVF::GepStmt</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00474">SVFStatements.h:474</a></div></div>
|
|
2026
|
+
<div class="ttc" id="aclassSVF_1_1CFBasicBlockGBuilder_html_a879d8affb9b113c9d2d976cdd31b60f1"><div class="ttname"><a href="classSVF_1_1CFBasicBlockGBuilder.html#a879d8affb9b113c9d2d976cdd31b60f1">SVF::CFBasicBlockGBuilder::getCFBasicBlockGraph</a></div><div class="ttdeci">CFBasicBlockGraph * getCFBasicBlockGraph()</div><div class="ttdef"><b>Definition:</b> <a href="CFBasicBlockGBuilder_8h_source.html#l00051">CFBasicBlockGBuilder.h:51</a></div></div>
|
|
2027
|
+
<div class="ttc" id="aclassSVF_1_1IntervalExeState_html_abc8edb74e55f40dbc7bb5182d4ef1199"><div class="ttname"><a href="classSVF_1_1IntervalExeState.html#abc8edb74e55f40dbc7bb5182d4ef1199">SVF::IntervalExeState::widening</a></div><div class="ttdeci">IntervalExeState widening(const IntervalExeState &other)</div><div class="ttdoc">domain widen with other, and return the widened domain</div><div class="ttdef"><b>Definition:</b> <a href="IntervalExeState_8cpp_source.html#l00253">IntervalExeState.cpp:253</a></div></div>
|
|
2028
|
+
<div class="ttc" id="anamespaceSVF_1_1SVFUtil_html_a22ef185e767ff76c098e75126c885400"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a22ef185e767ff76c098e75126c885400">SVF::SVFUtil::isExtCall</a></div><div class="ttdeci">bool isExtCall(const SVFFunction *fun)</div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00309">SVFUtil.h:309</a></div></div>
|
|
2029
|
+
<div class="ttc" id="aextapi_8c_html_af947cbf1ae303e5297c9d68c68a6b9cb"><div class="ttname"><a href="extapi_8c.html#af947cbf1ae303e5297c9d68c68a6b9cb">isalpha</a></div><div class="ttdeci">int isalpha(int character)</div><div class="ttdef"><b>Definition:</b> <a href="extapi_8c_source.html#l00837">extapi.c:837</a></div></div>
|
|
2030
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_accf5896d39647e41e1408fa90935b650"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#accf5896d39647e41e1408fa90935b650">SVF::AbstractExecution::indirectCallFunPass</a></div><div class="ttdeci">void indirectCallFunPass(const CallICFGNode *callNode)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00716">AbstractExecution.cpp:716</a></div></div>
|
|
2031
|
+
<div class="ttc" id="aclassSVF_1_1ExeState_html_ab72f3bc855feeda75e11768ab03ad84e"><div class="ttname"><a href="classSVF_1_1ExeState.html#ab72f3bc855feeda75e11768ab03ad84e">SVF::ExeState::getInternalID</a></div><div class="ttdeci">static u32_t getInternalID(u32_t idx)</div><div class="ttdoc">Return the internal index if idx is an address otherwise return the value of idx.</div><div class="ttdef"><b>Definition:</b> <a href="ExeState_8h_source.html#l00284">ExeState.h:284</a></div></div>
|
|
2032
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_a714fa1f4794008f630de415414cf8bfd"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#a714fa1f4794008f630de415414cf8bfd">SVF::AbstractExecution::handleICFGNode</a></div><div class="ttdeci">virtual void handleICFGNode(const ICFGNode *node)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00746">AbstractExecution.cpp:746</a></div></div>
|
|
2033
|
+
<div class="ttc" id="aclassSVF_1_1AEAPI_html_a185e694007f4d69b0030c65fb54c9c6d"><div class="ttname"><a href="classSVF_1_1AEAPI.html#a185e694007f4d69b0030c65fb54c9c6d">SVF::AEAPI::handleMemset</a></div><div class="ttdeci">virtual void handleMemset(const SVFValue *dst, IntervalValue elem, IntervalValue len)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l01690">AbstractExecution.cpp:1690</a></div></div>
|
|
2034
|
+
<div class="ttc" id="aclassSVF_1_1IntervalValue_html_aa027be2f9243ce4cae799b265b019443"><div class="ttname"><a href="classSVF_1_1IntervalValue.html#aa027be2f9243ce4cae799b265b019443">SVF::IntervalValue::bottom</a></div><div class="ttdeci">static IntervalValue bottom()</div><div class="ttdoc">Create the bottom IntervalValue.</div><div class="ttdef"><b>Definition:</b> <a href="IntervalValue_8h_source.html#l00089">IntervalValue.h:89</a></div></div>
|
|
2035
|
+
<div class="ttc" id="aclassSVF_1_1AEAPI_html_af64d742317f2ddad87b87012225ddaaa"><div class="ttname"><a href="classSVF_1_1AEAPI.html#af64d742317f2ddad87b87012225ddaaa">SVF::AEAPI::handleExtAPI</a></div><div class="ttdeci">virtual void handleExtAPI(const CallICFGNode *call)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l01247">AbstractExecution.cpp:1247</a></div></div>
|
|
2036
|
+
<div class="ttc" id="aclassSVF_1_1WTOCycle_html"><div class="ttname"><a href="classSVF_1_1WTOCycle.html">SVF::WTOCycle</a></div><div class="ttdef"><b>Definition:</b> <a href="WTO_8h_source.html#l00047">WTO.h:47</a></div></div>
|
|
2037
|
+
<div class="ttc" id="aclassSVF_1_1AEAPI_html_a4efc7447db13da26ce284218d6c01059"><div class="ttname"><a href="classSVF_1_1AEAPI.html#a4efc7447db13da26ce284218d6c01059">SVF::AEAPI::traceMemoryAllocationSize</a></div><div class="ttdeci">IntervalValue traceMemoryAllocationSize(const SVFValue *value)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l01394">AbstractExecution.cpp:1394</a></div></div>
|
|
2038
|
+
<div class="ttc" id="aextapi_8c_html_aaecd098576b00440124c44580144e8d5"><div class="ttname"><a href="extapi_8c.html#aaecd098576b00440124c44580144e8d5">isblank</a></div><div class="ttdeci">int isblank(int character)</div><div class="ttdef"><b>Definition:</b> <a href="extapi_8c_source.html#l00842">extapi.c:842</a></div></div>
|
|
2039
|
+
<div class="ttc" id="aclassSVF_1_1SCCDetection_html"><div class="ttname"><a href="classSVF_1_1SCCDetection.html">SVF::SCCDetection</a></div><div class="ttdef"><b>Definition:</b> <a href="SCC_8h_source.html#l00054">SCC.h:54</a></div></div>
|
|
2040
|
+
<div class="ttc" id="aclassSVF_1_1GenericNode_html_afc8b5f86d7795b6a0dfc0687d942d79b"><div class="ttname"><a href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">SVF::GenericNode::getInEdges</a></div><div class="ttdeci">const GEdgeSetTy & getInEdges() const</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00197">GenericGraph.h:197</a></div></div>
|
|
2041
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_a331ce1725ac1441f5624a2211021f967"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#a331ce1725ac1441f5624a2211021f967">SVF::AbstractExecution::narrowFixpointPass</a></div><div class="ttdeci">bool narrowFixpointPass(const CFBasicBlockNode *cycle_head, IntervalExeState &pre_es)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00851">AbstractExecution.cpp:851</a></div></div>
|
|
2042
|
+
<div class="ttc" id="aclassSVF_1_1CFBasicBlockNode_html"><div class="ttname"><a href="classSVF_1_1CFBasicBlockNode.html">SVF::CFBasicBlockNode</a></div><div class="ttdef"><b>Definition:</b> <a href="CFBasicBlockG_8h_source.html#l00114">CFBasicBlockG.h:114</a></div></div>
|
|
2043
|
+
<div class="ttc" id="aclassSVF_1_1IntervalExeState_html_a052d677fb5ee940ed0686f3d67d10d19"><div class="ttname"><a href="classSVF_1_1IntervalExeState.html#a052d677fb5ee940ed0686f3d67d10d19">SVF::IntervalExeState::cpyItvToLocal</a></div><div class="ttdeci">void cpyItvToLocal(u32_t varId)</div><div class="ttdef"><b>Definition:</b> <a href="IntervalExeState_8h_source.html#l00513">IntervalExeState.h:513</a></div></div>
|
|
2044
|
+
<div class="ttc" id="aextapi_8c_html_adaf3aadefe3fc4fb07b6be0d7b880f53"><div class="ttname"><a href="extapi_8c.html#adaf3aadefe3fc4fb07b6be0d7b880f53">isxdigit</a></div><div class="ttdeci">int isxdigit(int c)</div><div class="ttdef"><b>Definition:</b> <a href="extapi_8c_source.html#l00887">extapi.c:887</a></div></div>
|
|
2045
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_a84d8fedb7e9d23e92ffcb74b4cfbf78c"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#a84d8fedb7e9d23e92ffcb74b4cfbf78c">SVF::AbstractExecution::AbstractExecution</a></div><div class="ttdeci">AbstractExecution()</div><div class="ttdoc">Constructor.</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00138">AbstractExecution.cpp:138</a></div></div>
|
|
2046
|
+
<div class="ttc" id="aclassSVF_1_1CFBasicBlockNode_html_a4eb0886ab2538dbe2a3dcf8ab7fc615e"><div class="ttname"><a href="classSVF_1_1CFBasicBlockNode.html#a4eb0886ab2538dbe2a3dcf8ab7fc615e">SVF::CFBasicBlockNode::end</a></div><div class="ttdeci">std::vector< const ICFGNode * >::const_iterator end() const</div><div class="ttdef"><b>Definition:</b> <a href="CFBasicBlockG_8h_source.html#l00169">CFBasicBlockG.h:169</a></div></div>
|
|
2047
|
+
<div class="ttc" id="anamespaceSVF_1_1SVFUtil_html_aed0b0b9f035057552a6a82154fd88e61"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVF::SVFUtil::outs</a></div><div class="ttdeci">std::ostream & outs()</div><div class="ttdoc">Overwrite llvm::outs()</div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00050">SVFUtil.h:50</a></div></div>
|
|
2048
|
+
<div class="ttc" id="aclassSVF_1_1AddrStmt_html_a7fe84b92317fb93914053cc48d313acc"><div class="ttname"><a href="classSVF_1_1AddrStmt.html#a7fe84b92317fb93914053cc48d313acc">SVF::AddrStmt::getArrSize</a></div><div class="ttdeci">const std::vector< SVFValue * > & getArrSize() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00354">SVFStatements.h:354</a></div></div>
|
|
2049
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_a46364bb8814f7bf6ddd492aa7dc58ffb"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#a46364bb8814f7bf6ddd492aa7dc58ffb">SVF::AbstractExecution::analyse</a></div><div class="ttdeci">void analyse()</div><div class="ttdoc">Program entry.</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00167">AbstractExecution.cpp:167</a></div></div>
|
|
2050
|
+
<div class="ttc" id="anamespaceSVF_1_1SVFUtil_html_a05dc00b2bd9a8176aae31b6cfffe725d"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a05dc00b2bd9a8176aae31b6cfffe725d">SVF::SVFUtil::sucMsg</a></div><div class="ttdeci">std::string sucMsg(const std::string &msg)</div><div class="ttdoc">Returns successful message by converting a string into green string output.</div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8cpp_source.html#l00053">SVFUtil.cpp:53</a></div></div>
|
|
2051
|
+
<div class="ttc" id="aclassSVF_1_1Options_html_ac9d18f2d6853f45548f4f85fa2f661c4"><div class="ttname"><a href="classSVF_1_1Options.html#ac9d18f2d6853f45548f4f85fa2f661c4">SVF::Options::PStat</a></div><div class="ttdeci">static const Option< bool > PStat</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00119">Options.h:119</a></div></div>
|
|
2052
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_a6b92cdb6c5d3ae425955864536f2cba7"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#a6b92cdb6c5d3ae425955864536f2cba7">SVF::AbstractExecution::isRecursiveCall</a></div><div class="ttdeci">bool isRecursiveCall(const CallICFGNode *callNode)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00665">AbstractExecution.cpp:665</a></div></div>
|
|
2053
|
+
<div class="ttc" id="aclassSVF_1_1CallSite_html"><div class="ttname"><a href="classSVF_1_1CallSite.html">SVF::CallSite</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l01113">SVFValue.h:1113</a></div></div>
|
|
2054
|
+
<div class="ttc" id="aclassSVF_1_1CmpStmt_html_aa6a21fb1cfbc263bb38651176c495632"><div class="ttname"><a href="classSVF_1_1CmpStmt.html#aa6a21fb1cfbc263bb38651176c495632">SVF::CmpStmt::getPredicate</a></div><div class="ttdeci">u32_t getPredicate() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00959">SVFStatements.h:959</a></div></div>
|
|
2055
|
+
<div class="ttc" id="aclassSVF_1_1IntervalESBase_html_af7451ea87d5117a90b5912a1e6f34e10"><div class="ttname"><a href="classSVF_1_1IntervalESBase.html#af7451ea87d5117a90b5912a1e6f34e10">SVF::IntervalESBase::getLocToVal</a></div><div class="ttdeci">const LocToValMap & getLocToVal() const</div><div class="ttdoc">get loc2val map</div><div class="ttdef"><b>Definition:</b> <a href="IntervalExeState_8h_source.html#l00195">IntervalExeState.h:195</a></div></div>
|
|
2056
|
+
<div class="ttc" id="aclassSVF_1_1FILOWorkList_html_a071a624c91def82a4bbbf3806c7b7eea"><div class="ttname"><a href="classSVF_1_1FILOWorkList.html#a071a624c91def82a4bbbf3806c7b7eea">SVF::FILOWorkList::empty</a></div><div class="ttdeci">bool empty() const</div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00238">WorkList.h:238</a></div></div>
|
|
2057
|
+
<div class="ttc" id="aclassSVF_1_1AddressValue_html"><div class="ttname"><a href="classSVF_1_1AddressValue.html">SVF::AddressValue</a></div><div class="ttdef"><b>Definition:</b> <a href="AddressValue_8h_source.html#l00043">AddressValue.h:43</a></div></div>
|
|
2058
|
+
<div class="ttc" id="aclassSVF_1_1AEStat_html"><div class="ttname"><a href="classSVF_1_1AEStat.html">SVF::AEStat</a></div><div class="ttdoc">AEStat: Statistic for AE.</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8h_source.html#l00050">AbstractExecution.h:50</a></div></div>
|
|
2059
|
+
<div class="ttc" id="aclassSVF_1_1AEAPI_html_aa2a97be698768ddbcab0fec27bde60c8"><div class="ttname"><a href="classSVF_1_1AEAPI.html#aa2a97be698768ddbcab0fec27bde60c8">SVF::AEAPI::checkPointAllSet</a></div><div class="ttdeci">void checkPointAllSet()</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l01332">AbstractExecution.cpp:1332</a></div></div>
|
|
2060
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_adb88a8be0bc1c1ac2d1546e9191c6f93"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#adb88a8be0bc1c1ac2d1546e9191c6f93">SVF::AbstractExecution::handleFunc</a></div><div class="ttdeci">virtual void handleFunc(const SVFFunction *func)</div><div class="ttdoc">handle user defined function, ext function is not included.</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00875">AbstractExecution.cpp:875</a></div></div>
|
|
2061
|
+
<div class="ttc" id="aclassSVF_1_1CFBasicBlockNode_html_a6bfafe540f83e097370ca0dc66422214"><div class="ttname"><a href="classSVF_1_1CFBasicBlockNode.html#a6bfafe540f83e097370ca0dc66422214">SVF::CFBasicBlockNode::getInEdges</a></div><div class="ttdeci">const CFBBEdgeSetTy & getInEdges() const</div><div class="ttdef"><b>Definition:</b> <a href="CFBasicBlockG_8h_source.html#l00199">CFBasicBlockG.h:199</a></div></div>
|
|
2062
|
+
<div class="ttc" id="acJSON_8cpp_html_a7669ee67a0563250c1efaa24d130e1ac"><div class="ttname"><a href="cJSON_8cpp.html#a7669ee67a0563250c1efaa24d130e1ac">copy</a></div><div class="ttdeci">copy</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8cpp_source.html#l00414">cJSON.cpp:414</a></div></div>
|
|
2063
|
+
<div class="ttc" id="aclassSVF_1_1IntraCFGEdge_html_a106513578790247f9d96e34c8385b3d8"><div class="ttname"><a href="classSVF_1_1IntraCFGEdge.html#a106513578790247f9d96e34c8385b3d8">SVF::IntraCFGEdge::getSuccessorCondValue</a></div><div class="ttdeci">s64_t getSuccessorCondValue() const</div><div class="ttdef"><b>Definition:</b> <a href="ICFGEdge_8h_source.html#l00145">ICFGEdge.h:145</a></div></div>
|
|
2064
|
+
<div class="ttc" id="aclassSVF_1_1WTOCycle_html_a03fd55dd34c48d22cefcaf6dc93f734a"><div class="ttname"><a href="classSVF_1_1WTOCycle.html#a03fd55dd34c48d22cefcaf6dc93f734a">SVF::WTOCycle::end</a></div><div class="ttdeci">Iterator end() const</div><div class="ttdoc">End iterator over the components.</div><div class="ttdef"><b>Definition:</b> <a href="WTO_8h_source.html#l00423">WTO.h:423</a></div></div>
|
|
2065
|
+
<div class="ttc" id="aclassSVF_1_1FIFOWorkList_html"><div class="ttname"><a href="classSVF_1_1FIFOWorkList.html">SVF::FIFOWorkList</a></div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00137">WorkList.h:137</a></div></div>
|
|
2066
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_af4579490ced0a02537850d62891cf5bc"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#af4579490ced0a02537850d62891cf5bc">SVF::AbstractExecution::handleCycle</a></div><div class="ttdeci">virtual void handleCycle(const CFBasicBlockGWTOCycle *cycle)</div><div class="ttdoc">handle wto cycle (loop)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00767">AbstractExecution.cpp:767</a></div></div>
|
|
2067
|
+
<div class="ttc" id="aclassSVF_1_1SVFIR_html"><div class="ttname"><a href="classSVF_1_1SVFIR.html">SVF::SVFIR</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8h_source.html#l00043">SVFIR.h:43</a></div></div>
|
|
2068
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_a6771ac262e5fdbac0006b293cde47398"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#a6771ac262e5fdbac0006b293cde47398">SVF::AbstractExecution::~AbstractExecution</a></div><div class="ttdeci">virtual ~AbstractExecution()</div><div class="ttdoc">Destructor.</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00143">AbstractExecution.cpp:143</a></div></div>
|
|
2069
|
+
<div class="ttc" id="aclassSVF_1_1CallSite_html_ac2a0091dab3543a398da890b947e42ef"><div class="ttname"><a href="classSVF_1_1CallSite.html#ac2a0091dab3543a398da890b947e42ef">SVF::CallSite::getInstruction</a></div><div class="ttdeci">const SVFInstruction * getInstruction() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l01128">SVFValue.h:1128</a></div></div>
|
|
2070
|
+
<div class="ttc" id="aclassSVF_1_1AssignStmt_html_a98f731be7be9bc8e7fd09f5c2204c840"><div class="ttname"><a href="classSVF_1_1AssignStmt.html#a98f731be7be9bc8e7fd09f5c2204c840">SVF::AssignStmt::getLHSVarID</a></div><div class="ttdeci">NodeID getLHSVarID() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00302">SVFStatements.h:302</a></div></div>
|
|
2071
|
+
<div class="ttc" id="aAbstractExecution_8cpp_html_a3b70282b79998dcb9f6df78370bc1fe9"><div class="ttname"><a href="AbstractExecution_8cpp.html#a3b70282b79998dcb9f6df78370bc1fe9">_switch_lhsrhs_predicate</a></div><div class="ttdeci">Map< s32_t, s32_t > _switch_lhsrhs_predicate</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00067">AbstractExecution.cpp:67</a></div></div>
|
|
2072
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_ac73335ecb1efc6c50775a205c618201f"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#ac73335ecb1efc6c50775a205c618201f">SVF::AbstractExecution::hasInEdgesES</a></div><div class="ttdeci">bool hasInEdgesES(const CFBasicBlockNode *block)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00216">AbstractExecution.cpp:216</a></div></div>
|
|
2073
|
+
<div class="ttc" id="aclassSVF_1_1IntervalExeState_html_a1e8f41b502167283ccb87bd128f232bc"><div class="ttname"><a href="classSVF_1_1IntervalExeState.html#a1e8f41b502167283ccb87bd128f232bc">SVF::IntervalExeState::narrowing</a></div><div class="ttdeci">IntervalExeState narrowing(const IntervalExeState &other)</div><div class="ttdoc">domain narrow with other, and return the narrowed domain</div><div class="ttdef"><b>Definition:</b> <a href="IntervalExeState_8cpp_source.html#l00271">IntervalExeState.cpp:271</a></div></div>
|
|
2074
|
+
<div class="ttc" id="aclassSVF_1_1IntervalExeState_html_ad485a35730353c0e945bc84a034d9e45"><div class="ttname"><a href="classSVF_1_1IntervalExeState.html#ad485a35730353c0e945bc84a034d9e45">SVF::IntervalExeState::inVarToAddrsTable</a></div><div class="ttdeci">bool inVarToAddrsTable(u32_t id) const override</div><div class="ttdoc">whether the variable is in varToAddrs table</div><div class="ttdef"><b>Definition:</b> <a href="IntervalExeState_8h_source.html#l00474">IntervalExeState.h:474</a></div></div>
|
|
2075
|
+
<div class="ttc" id="aclassSVF_1_1FILOWorkList_html_a3fd9acb6d09fd142bfd402fdf8cac93b"><div class="ttname"><a href="classSVF_1_1FILOWorkList.html#a3fd9acb6d09fd142bfd402fdf8cac93b">SVF::FILOWorkList::pop</a></div><div class="ttdeci">Data pop()</div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00272">WorkList.h:272</a></div></div>
|
|
2076
|
+
<div class="ttc" id="aclassSVF_1_1FILOWorkList_html"><div class="ttname"><a href="classSVF_1_1FILOWorkList.html">SVF::FILOWorkList</a></div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00229">WorkList.h:229</a></div></div>
|
|
2077
|
+
<div class="ttc" id="aclassSVF_1_1Options_html_aaab923c093730b1670a54f09340b1bd5"><div class="ttname"><a href="classSVF_1_1Options.html#aaab923c093730b1670a54f09340b1bd5">SVF::Options::MaxFieldLimit</a></div><div class="ttdeci">static const Option< u32_t > MaxFieldLimit</div><div class="ttdoc">Maximum number of field derivations for an object.</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00038">Options.h:38</a></div></div>
|
|
2078
|
+
<div class="ttc" id="anamespaceSVF_html_a43a65e0d33af3c743294f7a1139d2301"><div class="ttname"><a href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">SVF::NodeID</a></div><div class="ttdeci">unsigned NodeID</div><div class="ttdef"><b>Definition:</b> <a href="svf-llvm_2tools_2MTA_2MTAResultValidator_8h_source.html#l00020">MTAResultValidator.h:20</a></div></div>
|
|
2079
|
+
<div class="ttc" id="aclassSVF_1_1SVFType_html_a870b63af2bf9fe43cdf1df3d56b20f6c"><div class="ttname"><a href="classSVF_1_1SVFType.html#a870b63af2bf9fe43cdf1df3d56b20f6c">SVF::SVFType::isPointerTy</a></div><div class="ttdeci">bool isPointerTy() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00249">SVFType.h:249</a></div></div>
|
|
2080
|
+
<div class="ttc" id="aclassSVF_1_1SVFVar_html_a091ef22d4fc428985d604b03f287a941"><div class="ttname"><a href="classSVF_1_1SVFVar.html#a091ef22d4fc428985d604b03f287a941">SVF::SVFVar::isConstDataOrAggDataButNotNullPtr</a></div><div class="ttdeci">bool isConstDataOrAggDataButNotNullPtr() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFVariables_8cpp_source.html#l00204">SVFVariables.cpp:204</a></div></div>
|
|
2081
|
+
<div class="ttc" id="aclassSVF_1_1AndersenWaveDiff_html_a48ff6fc4badc79ad3204ae9bd95cc540"><div class="ttname"><a href="classSVF_1_1AndersenWaveDiff.html#a48ff6fc4badc79ad3204ae9bd95cc540">SVF::AndersenWaveDiff::createAndersenWaveDiff</a></div><div class="ttdeci">static AndersenWaveDiff * createAndersenWaveDiff(SVFIR *_pag)</div><div class="ttdoc">Create an singleton instance directly instead of invoking llvm pass manager.</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00395">Andersen.h:395</a></div></div>
|
|
2082
|
+
<div class="ttc" id="aclassSVF_1_1SVFArgument_html"><div class="ttname"><a href="classSVF_1_1SVFArgument.html">SVF::SVFArgument</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00897">SVFValue.h:897</a></div></div>
|
|
2083
|
+
<div class="ttc" id="aCFBasicBlockGBuilder_8h_html"><div class="ttname"><a href="CFBasicBlockGBuilder_8h.html">CFBasicBlockGBuilder.h</a></div></div>
|
|
2084
|
+
<div class="ttc" id="aclassSVF_1_1MultiOpndStmt_html_a71a530eb9fa9f7e273e471b4a75a039e"><div class="ttname"><a href="classSVF_1_1MultiOpndStmt.html#a71a530eb9fa9f7e273e471b4a75a039e">SVF::MultiOpndStmt::getResID</a></div><div class="ttdeci">NodeID getResID() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8cpp_source.html#l00289">SVFStatements.cpp:289</a></div></div>
|
|
2085
|
+
<div class="ttc" id="aclassSVF_1_1IntervalESBase_html_a903797577ba99ef57879774a3849bbfe"><div class="ttname"><a href="classSVF_1_1IntervalESBase.html#a903797577ba99ef57879774a3849bbfe">SVF::IntervalESBase::getVarToVal</a></div><div class="ttdeci">const VarToValMap & getVarToVal() const</div><div class="ttdoc">get var2val map</div><div class="ttdef"><b>Definition:</b> <a href="IntervalExeState_8h_source.html#l00189">IntervalExeState.h:189</a></div></div>
|
|
2086
|
+
<div class="ttc" id="aclassSVF_1_1SVFVar_html_a76964ef7d4842a469d7720881499d8a6"><div class="ttname"><a href="classSVF_1_1SVFVar.html#a76964ef7d4842a469d7720881499d8a6">SVF::SVFVar::getIncomingEdges</a></div><div class="ttdeci">SVFStmt::SVFStmtSetTy & getIncomingEdges(SVFStmt::PEDGEK kind)</div><div class="ttdoc">Get incoming SVFIR statements (edges)</div><div class="ttdef"><b>Definition:</b> <a href="SVFVariables_8h_source.html#l00148">SVFVariables.h:148</a></div></div>
|
|
2087
|
+
<div class="ttc" id="aclassSVF_1_1WTOCycle_html_ace60ecb07603681de5c3020d0d3c5079"><div class="ttname"><a href="classSVF_1_1WTOCycle.html#ace60ecb07603681de5c3020d0d3c5079">SVF::WTOCycle::head</a></div><div class="ttdeci">const NodeT * head() const</div><div class="ttdoc">Return the head of the cycle.</div><div class="ttdef"><b>Definition:</b> <a href="WTO_8h_source.html#l00411">WTO.h:411</a></div></div>
|
|
2088
|
+
<div class="ttc" id="aclassSVF_1_1AEStat_html_a5b246c2175c44454236242dcf426f21f"><div class="ttname"><a href="classSVF_1_1AEStat.html#a5b246c2175c44454236242dcf426f21f">SVF::AEStat::finializeStat</a></div><div class="ttdeci">void finializeStat()</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l01042">AbstractExecution.cpp:1042</a></div></div>
|
|
2089
|
+
<div class="ttc" id="aextapi_8c_html_a84b34b0058324ae5c0eae4956cf00cc5"><div class="ttname"><a href="extapi_8c.html#a84b34b0058324ae5c0eae4956cf00cc5">isspace</a></div><div class="ttdeci">int isspace(char c)</div><div class="ttdef"><b>Definition:</b> <a href="extapi_8c_source.html#l00877">extapi.c:877</a></div></div>
|
|
2090
|
+
<div class="ttc" id="aclassSVF_1_1SVFInstruction_html"><div class="ttname"><a href="classSVF_1_1SVFInstruction.html">SVF::SVFInstruction</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00631">SVFValue.h:631</a></div></div>
|
|
2091
|
+
<div class="ttc" id="aAbstractExecution_8cpp_html_a6baa35cec0782ac3179849752a732e5c"><div class="ttname"><a href="AbstractExecution_8cpp.html#a6baa35cec0782ac3179849752a732e5c">_reverse_predicate</a></div><div class="ttdeci">Map< s32_t, s32_t > _reverse_predicate</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00046">AbstractExecution.cpp:46</a></div></div>
|
|
2092
|
+
<div class="ttc" id="anamespaceSVF_html_ad781b0b14e89773e774072b280658ef3"><div class="ttname"><a href="namespaceSVF.html#ad781b0b14e89773e774072b280658ef3">SVF::s64_t</a></div><div class="ttdeci">signed long long s64_t</div><div class="ttdef"><b>Definition:</b> <a href="GeneralType_8h_source.html#l00049">GeneralType.h:49</a></div></div>
|
|
2093
|
+
<div class="ttc" id="aclassSVF_1_1IntervalExeState_html_ad17ceaf8058043151ae0f23b3415458a"><div class="ttname"><a href="classSVF_1_1IntervalExeState.html#ad17ceaf8058043151ae0f23b3415458a">SVF::IntervalExeState::loadAddrs</a></div><div class="ttdeci">Addrs & loadAddrs(u32_t addr) override</div><div class="ttdef"><b>Definition:</b> <a href="IntervalExeState_8h_source.html#l00564">IntervalExeState.h:564</a></div></div>
|
|
2094
|
+
<div class="ttc" id="aclassSVF_1_1AEAPI_html"><div class="ttname"><a href="classSVF_1_1AEAPI.html">SVF::AEAPI</a></div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8h_source.html#l00280">AbstractExecution.h:280</a></div></div>
|
|
2095
|
+
<div class="ttc" id="aclassSVF_1_1IntervalExeState_html_a50aee49f7f34e05f7e2cb28ae55099f8"><div class="ttname"><a href="classSVF_1_1IntervalExeState.html#a50aee49f7f34e05f7e2cb28ae55099f8">SVF::IntervalExeState::inLocToValTable</a></div><div class="ttdeci">bool inLocToValTable(u32_t id) const override</div><div class="ttdoc">whether the memory address stores interval value</div><div class="ttdef"><b>Definition:</b> <a href="IntervalExeState_8h_source.html#l00495">IntervalExeState.h:495</a></div></div>
|
|
2096
|
+
<div class="ttc" id="aclassSVF_1_1AEAPI_html_a13abbe8b8622df63e7f160732bc1cbfc"><div class="ttname"><a href="classSVF_1_1AEAPI.html#a13abbe8b8622df63e7f160732bc1cbfc">SVF::AEAPI::handleStrcpy</a></div><div class="ttdeci">virtual void handleStrcpy(const CallICFGNode *call)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l01350">AbstractExecution.cpp:1350</a></div></div>
|
|
2097
|
+
<div class="ttc" id="aclassSVF_1_1IntervalValue_html_ae081b5c462f8ed5b306719822e35cea9"><div class="ttname"><a href="classSVF_1_1IntervalValue.html#ae081b5c462f8ed5b306719822e35cea9">SVF::IntervalValue::getNumeral</a></div><div class="ttdeci">s64_t getNumeral() const</div><div class="ttdoc">Return.</div><div class="ttdef"><b>Definition:</b> <a href="IntervalValue_8h_source.html#l00263">IntervalValue.h:263</a></div></div>
|
|
2098
|
+
<div class="ttc" id="aclassSVF_1_1AEAPI_html_a29ab312d273e6c9c32a40d61861afb04"><div class="ttname"><a href="classSVF_1_1AEAPI.html#a29ab312d273e6c9c32a40d61861afb04">SVF::AEAPI::ExtAPIType</a></div><div class="ttdeci">ExtAPIType</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8h_source.html#l00285">AbstractExecution.h:285</a></div></div>
|
|
2099
|
+
<div class="ttc" id="anamespaceSVF_html_a8234d4b959abc9123993bcff4eee34c1"><div class="ttname"><a href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">SVF::Map</a></div><div class="ttdeci">std::unordered_map< Key, Value, Hash, KeyEqual, Allocator > Map</div><div class="ttdef"><b>Definition:</b> <a href="GeneralType_8h_source.html#l00097">GeneralType.h:97</a></div></div>
|
|
2100
|
+
<div class="ttc" id="aclassSVF_1_1CallICFGNode_html_ae23a7540609879ac0379fc53b4e7eead"><div class="ttname"><a href="classSVF_1_1CallICFGNode.html#ae23a7540609879ac0379fc53b4e7eead">SVF::CallICFGNode::getRetICFGNode</a></div><div class="ttdeci">const RetICFGNode * getRetICFGNode() const</div><div class="ttdoc">Return callsite.</div><div class="ttdef"><b>Definition:</b> <a href="ICFGNode_8h_source.html#l00415">ICFGNode.h:415</a></div></div>
|
|
2101
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_ab807fd4f914cd35a07fe19bb0d7f9860"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#ab807fd4f914cd35a07fe19bb0d7f9860">SVF::AbstractExecution::isFunEntry</a></div><div class="ttdeci">bool isFunEntry(const CFBasicBlockNode *block)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00270">AbstractExecution.cpp:270</a></div></div>
|
|
2102
|
+
<div class="ttc" id="aclassSVF_1_1ExeState_html_a99f4437a7e350fec131d48f52082d672"><div class="ttname"><a href="classSVF_1_1ExeState.html#a99f4437a7e350fec131d48f52082d672">SVF::ExeState::storeAddrs</a></div><div class="ttdeci">virtual void storeAddrs(u32_t addr, const Addrs &vaddrs)</div><div class="ttdef"><b>Definition:</b> <a href="ExeState_8h_source.html#l00155">ExeState.h:155</a></div></div>
|
|
2103
|
+
<div class="ttc" id="aclassSVF_1_1CallSite_html_a9e7c94ee7f689466111487e03b2cebcc"><div class="ttname"><a href="classSVF_1_1CallSite.html#a9e7c94ee7f689466111487e03b2cebcc">SVF::CallSite::getArgument</a></div><div class="ttdeci">const SVFValue * getArgument(u32_t ArgNo) const</div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l01132">SVFValue.h:1132</a></div></div>
|
|
2104
|
+
<div class="ttc" id="aclassSVF_1_1AEStat_html_ae24590233a864e18a6b0948bef89201a"><div class="ttname"><a href="classSVF_1_1AEStat.html#ae24590233a864e18a6b0948bef89201a">SVF::AEStat::reportBug</a></div><div class="ttdeci">void reportBug()</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l01122">AbstractExecution.cpp:1122</a></div></div>
|
|
2105
|
+
<div class="ttc" id="aclassSVF_1_1GenericNode_html_a2d9cd758d6f8c5189d9b90b74f43e009"><div class="ttname"><a href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">SVF::GenericNode::getOutEdges</a></div><div class="ttdeci">const GEdgeSetTy & getOutEdges() const</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00193">GenericGraph.h:193</a></div></div>
|
|
2106
|
+
<div class="ttc" id="acJSON_8h_html_ad43c3812e6d13e0518d9f8b8f463ffcf"><div class="ttname"><a href="cJSON_8h.html#ad43c3812e6d13e0518d9f8b8f463ffcf">count</a></div><div class="ttdeci">int count</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00216">cJSON.h:216</a></div></div>
|
|
2107
|
+
<div class="ttc" id="aclassSVF_1_1IntervalValue_html_a3771eb932069dcad8212009efc411b99"><div class="ttname"><a href="classSVF_1_1IntervalValue.html#a3771eb932069dcad8212009efc411b99">SVF::IntervalValue::join_with</a></div><div class="ttdeci">void join_with(const IntervalValue &other)</div><div class="ttdoc">Current IntervalValue joins with another IntervalValue.</div><div class="ttdef"><b>Definition:</b> <a href="IntervalValue_8h_source.html#l00345">IntervalValue.h:345</a></div></div>
|
|
2108
|
+
<div class="ttc" id="aclassSVF_1_1AEAPI_html_a112519b672206ac552273666949eeb3b"><div class="ttname"><a href="classSVF_1_1AEAPI.html#a112519b672206ac552273666949eeb3b">SVF::AEAPI::getPointeeElement</a></div><div class="ttdeci">const SVFType * getPointeeElement(NodeID id)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l01673">AbstractExecution.cpp:1673</a></div></div>
|
|
2109
|
+
<div class="ttc" id="anamespaceSVF_html_ad42bff8d0a7d60a085aa32d10f4955af"><div class="ttname"><a href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">SVF::u32_t</a></div><div class="ttdeci">unsigned u32_t</div><div class="ttdef"><b>Definition:</b> <a href="GeneralType_8h_source.html#l00046">GeneralType.h:46</a></div></div>
|
|
2110
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_a4bf7be47ddc0ba53ec4a5e87f300763f"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#a4bf7be47ddc0ba53ec4a5e87f300763f">SVF::AbstractExecution::initExtAPI</a></div><div class="ttdeci">virtual void initExtAPI()</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00087">AbstractExecution.cpp:87</a></div></div>
|
|
2111
|
+
<div class="ttc" id="anamespaceSVF_1_1SVFUtil_html_ab65033f068bfbeb0a1c52dcec3beb6bc"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">SVF::SVFUtil::errs</a></div><div class="ttdeci">std::ostream & errs()</div><div class="ttdoc">Overwrite llvm::errs()</div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00056">SVFUtil.h:56</a></div></div>
|
|
2112
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_a7efff2047b2b6017fdd210a8679817cd"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#a7efff2047b2b6017fdd210a8679817cd">SVF::AbstractExecution::handleGlobalNode</a></div><div class="ttdeci">virtual void handleGlobalNode()</div><div class="ttdoc">Global ICFGNode is handled at the entry of the program,.</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00178">AbstractExecution.cpp:178</a></div></div>
|
|
2113
|
+
<div class="ttc" id="aclassSVF_1_1AbstractExecution_html_ad1baaa8eaad68b215f63941776e79ccf"><div class="ttname"><a href="classSVF_1_1AbstractExecution.html#ad1baaa8eaad68b215f63941776e79ccf">SVF::AbstractExecution::isIndirectCall</a></div><div class="ttdeci">bool isIndirectCall(const CallICFGNode *callNode)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l00710">AbstractExecution.cpp:710</a></div></div>
|
|
2114
|
+
<div class="ttc" id="aAndersen_8h_html"><div class="ttname"><a href="Andersen_8h.html">Andersen.h</a></div></div>
|
|
2115
|
+
<div class="ttc" id="aclassSVF_1_1AEAPI_html_a3665513f6e8f8b93ef3f9d273d03ee70"><div class="ttname"><a href="classSVF_1_1AEAPI.html#a3665513f6e8f8b93ef3f9d273d03ee70">SVF::AEAPI::AccessMemoryViaCopyStmt</a></div><div class="ttdeci">void AccessMemoryViaCopyStmt(const CopyStmt *copy, SVF::FILOWorkList< const SVFValue * > &worklist, Set< const SVFValue * > &visited)</div><div class="ttdef"><b>Definition:</b> <a href="AbstractExecution_8cpp_source.html#l01770">AbstractExecution.cpp:1770</a></div></div>
|
|
2116
|
+
<div class="ttc" id="aclassSVF_1_1AddressValue_html_aed0b4789beda4980e4e215a65350f323"><div class="ttname"><a href="classSVF_1_1AddressValue.html#aed0b4789beda4980e4e215a65350f323">SVF::AddressValue::begin</a></div><div class="ttdeci">AddrSet::const_iterator begin() const</div><div class="ttdef"><b>Definition:</b> <a href="AddressValue_8h_source.html#l00105">AddressValue.h:105</a></div></div>
|
|
2117
|
+
<!-- start footer part -->
|
|
2118
|
+
<hr class="footer"/><address class="footer"><small>
|
|
2119
|
+
Generated by  <a href="http://www.doxygen.org/index.html">
|
|
2120
|
+
<img class="footer" src="doxygen.png" alt="doxygen"/>
|
|
2121
|
+
</a> 1.8.17
|
|
2122
|
+
</small></address>
|
|
2123
|
+
</body>
|
|
2124
|
+
</html>
|