svf-tools 1.0.853 → 1.0.855
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/SVF-doxygen/html/AE_2CMakeLists_8txt.html +106 -0
- package/SVF-doxygen/html/AndersenStat_8cpp_source.html +19 -12
- package/SVF-doxygen/html/Andersen_8cpp_source.html +3 -3
- package/SVF-doxygen/html/Andersen_8h_source.html +4 -4
- package/SVF-doxygen/html/CFLStat_8cpp_source.html +1 -1
- package/SVF-doxygen/html/CMakeLists_8txt.html +5 -5
- package/SVF-doxygen/html/CSC_8cpp_source.html +2 -2
- package/SVF-doxygen/html/ConsGNode_8h_source.html +4 -4
- package/SVF-doxygen/html/ConsG_8cpp_source.html +663 -644
- package/SVF-doxygen/html/ConsG_8h_source.html +335 -332
- package/SVF-doxygen/html/DDAClient_8cpp_source.html +4 -4
- package/SVF-doxygen/html/DDAStat_8cpp_source.html +249 -252
- package/SVF-doxygen/html/DDAStat_8h_source.html +70 -93
- package/SVF-doxygen/html/FlowSensitiveStat_8cpp_source.html +1 -1
- package/SVF-doxygen/html/PTAStat_8cpp_source.html +107 -83
- package/SVF-doxygen/html/PTAStat_8h_source.html +38 -13
- package/SVF-doxygen/html/PointerAnalysis_8cpp_source.html +1 -1
- package/SVF-doxygen/html/Steensgaard_8h_source.html +1 -1
- package/SVF-doxygen/html/VersionedFlowSensitiveStat_8cpp_source.html +1 -1
- package/SVF-doxygen/html/WPAStat_8h_source.html +1 -1
- package/SVF-doxygen/html/ae_8cpp.html +179 -0
- package/SVF-doxygen/html/ae_8cpp_source.html +738 -0
- package/SVF-doxygen/html/annotated.html +1 -0
- package/SVF-doxygen/html/classSVF_1_1AddrCGEdge.html +11 -11
- package/SVF-doxygen/html/classSVF_1_1Andersen.html +20 -20
- package/SVF-doxygen/html/classSVF_1_1AndersenBase.html +10 -10
- package/SVF-doxygen/html/classSVF_1_1AndersenSCD.html +1 -1
- package/SVF-doxygen/html/classSVF_1_1AndersenSFR.html +3 -3
- package/SVF-doxygen/html/classSVF_1_1AndersenStat-members.html +8 -2
- package/SVF-doxygen/html/classSVF_1_1AndersenStat.html +34 -12
- package/SVF-doxygen/html/classSVF_1_1AndersenWaveDiff.html +1 -1
- package/SVF-doxygen/html/classSVF_1_1CFLStat-members.html +8 -2
- package/SVF-doxygen/html/classSVF_1_1CFLStat.html +16 -1
- package/SVF-doxygen/html/classSVF_1_1CSC.html +5 -5
- package/SVF-doxygen/html/classSVF_1_1ConstraintGraph-members.html +81 -80
- package/SVF-doxygen/html/classSVF_1_1ConstraintGraph.html +672 -623
- package/SVF-doxygen/html/classSVF_1_1ConstraintNode.html +28 -28
- package/SVF-doxygen/html/classSVF_1_1DDAClient.html +4 -4
- package/SVF-doxygen/html/classSVF_1_1DDAStat-members.html +7 -7
- package/SVF-doxygen/html/classSVF_1_1DDAStat.html +283 -463
- package/SVF-doxygen/html/classSVF_1_1FlowSensitiveStat-members.html +9 -3
- package/SVF-doxygen/html/classSVF_1_1FlowSensitiveStat.html +17 -2
- package/SVF-doxygen/html/classSVF_1_1ICFGStat-members.html +9 -3
- package/SVF-doxygen/html/classSVF_1_1ICFGStat.html +15 -0
- package/SVF-doxygen/html/classSVF_1_1MTAStat-members.html +7 -1
- package/SVF-doxygen/html/classSVF_1_1MTAStat.html +15 -0
- package/SVF-doxygen/html/classSVF_1_1MemSSAStat-members.html +9 -3
- package/SVF-doxygen/html/classSVF_1_1MemSSAStat.html +15 -0
- package/SVF-doxygen/html/classSVF_1_1PTAStat-members.html +7 -1
- package/SVF-doxygen/html/classSVF_1_1PTAStat.html +300 -84
- package/SVF-doxygen/html/classSVF_1_1PointerAnalysis.html +1 -1
- package/SVF-doxygen/html/classSVF_1_1SVFGStat-members.html +7 -1
- package/SVF-doxygen/html/classSVF_1_1SVFGStat.html +15 -0
- package/SVF-doxygen/html/classSVF_1_1Steensgaard.html +3 -3
- package/SVF-doxygen/html/classSVF_1_1TypeAnalysis.html +1 -1
- package/SVF-doxygen/html/classSVF_1_1VersionedFlowSensitiveStat-members.html +9 -3
- package/SVF-doxygen/html/classSVF_1_1VersionedFlowSensitiveStat.html +17 -2
- package/SVF-doxygen/html/classSymblicAbstractionTest-members.html +99 -0
- package/SVF-doxygen/html/classSymblicAbstractionTest.html +1282 -0
- package/SVF-doxygen/html/classes.html +56 -55
- package/SVF-doxygen/html/dir_454f632bef84d62ecd1cf13bd508acc9.html +86 -0
- package/SVF-doxygen/html/dir_e5d21102e3a998263c6c7812ac857e9d.html +2 -0
- package/SVF-doxygen/html/files.html +22 -20
- package/SVF-doxygen/html/functions.html +4 -4
- package/SVF-doxygen/html/functions_b.html +16 -10
- package/SVF-doxygen/html/functions_c.html +27 -24
- package/SVF-doxygen/html/functions_f.html +3 -3
- package/SVF-doxygen/html/functions_func_b.html +9 -3
- package/SVF-doxygen/html/functions_func_c.html +22 -19
- package/SVF-doxygen/html/functions_func_g.html +17 -16
- package/SVF-doxygen/html/functions_func_n.html +1 -1
- package/SVF-doxygen/html/functions_func_r.html +5 -2
- package/SVF-doxygen/html/functions_func_s.html +18 -15
- package/SVF-doxygen/html/functions_func_t.html +41 -1
- package/SVF-doxygen/html/functions_func_~.html +3 -0
- package/SVF-doxygen/html/functions_g.html +16 -15
- package/SVF-doxygen/html/functions_i.html +3 -3
- package/SVF-doxygen/html/functions_l.html +3 -3
- package/SVF-doxygen/html/functions_n.html +6 -6
- package/SVF-doxygen/html/functions_o.html +3 -3
- package/SVF-doxygen/html/functions_p.html +12 -12
- package/SVF-doxygen/html/functions_r.html +9 -6
- package/SVF-doxygen/html/functions_s.html +22 -19
- package/SVF-doxygen/html/functions_t.html +47 -7
- package/SVF-doxygen/html/functions_v.html +3 -3
- package/SVF-doxygen/html/functions_vars.html +4 -4
- package/SVF-doxygen/html/functions_w.html +9 -7
- package/SVF-doxygen/html/functions_~.html +3 -0
- package/SVF-doxygen/html/globals_a.html +2 -2
- package/SVF-doxygen/html/globals_func_a.html +2 -2
- package/SVF-doxygen/html/globals_func_m.html +5 -4
- package/SVF-doxygen/html/globals_m.html +5 -4
- package/SVF-doxygen/html/globals_s.html +3 -0
- package/SVF-doxygen/html/globals_vars.html +3 -0
- package/SVF-doxygen/html/hierarchy.html +40 -39
- package/SVF-doxygen/html/search/all_0.js +4 -4
- package/SVF-doxygen/html/search/all_1.js +133 -132
- package/SVF-doxygen/html/search/all_10.js +325 -325
- package/SVF-doxygen/html/search/all_11.js +225 -224
- package/SVF-doxygen/html/search/all_12.js +554 -552
- package/SVF-doxygen/html/search/all_13.js +203 -190
- package/SVF-doxygen/html/search/all_14.js +67 -67
- package/SVF-doxygen/html/search/all_15.js +168 -168
- package/SVF-doxygen/html/search/all_16.js +63 -63
- 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 +11 -11
- package/SVF-doxygen/html/search/all_1a.js +175 -174
- package/SVF-doxygen/html/search/all_2.js +173 -171
- package/SVF-doxygen/html/search/all_3.js +649 -648
- package/SVF-doxygen/html/search/all_4.js +230 -230
- package/SVF-doxygen/html/search/all_5.js +119 -119
- package/SVF-doxygen/html/search/all_6.js +226 -226
- package/SVF-doxygen/html/search/all_7.js +1048 -1048
- package/SVF-doxygen/html/search/all_8.js +196 -196
- package/SVF-doxygen/html/search/all_9.js +605 -605
- 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 +197 -197
- package/SVF-doxygen/html/search/all_e.js +207 -207
- package/SVF-doxygen/html/search/all_f.js +116 -116
- package/SVF-doxygen/html/search/classes_0.js +26 -26
- package/SVF-doxygen/html/search/classes_1.js +9 -9
- package/SVF-doxygen/html/search/classes_10.js +74 -73
- package/SVF-doxygen/html/search/classes_11.js +15 -15
- 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 +14 -14
- package/SVF-doxygen/html/search/classes_15.js +1 -1
- package/SVF-doxygen/html/search/classes_2.js +81 -81
- 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 +34 -34
- package/SVF-doxygen/html/search/classes_8.js +57 -57
- 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 +18 -18
- 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 +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 +2 -2
- 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 +3 -3
- package/SVF-doxygen/html/search/defines_d.js +2 -2
- package/SVF-doxygen/html/search/defines_e.js +7 -7
- package/SVF-doxygen/html/search/defines_f.js +3 -3
- package/SVF-doxygen/html/search/enums_0.js +3 -3
- 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 +3 -3
- 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 +14 -14
- package/SVF-doxygen/html/search/enumvalues_1.js +14 -14
- package/SVF-doxygen/html/search/enumvalues_10.js +35 -35
- package/SVF-doxygen/html/search/enumvalues_11.js +3 -3
- 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 +15 -15
- 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 +45 -45
- package/SVF-doxygen/html/search/files_0.js +14 -13
- package/SVF-doxygen/html/search/files_1.js +7 -7
- 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 +57 -57
- 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 +9 -9
- package/SVF-doxygen/html/search/files_7.js +14 -14
- 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 +2 -2
- 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 +364 -364
- package/SVF-doxygen/html/search/functions_10.js +140 -140
- package/SVF-doxygen/html/search/functions_11.js +140 -139
- package/SVF-doxygen/html/search/functions_12.js +289 -288
- package/SVF-doxygen/html/search/functions_13.js +72 -59
- package/SVF-doxygen/html/search/functions_14.js +39 -39
- package/SVF-doxygen/html/search/functions_15.js +71 -71
- package/SVF-doxygen/html/search/functions_16.js +32 -32
- package/SVF-doxygen/html/search/functions_17.js +3 -3
- package/SVF-doxygen/html/search/functions_18.js +175 -174
- package/SVF-doxygen/html/search/functions_2.js +91 -89
- package/SVF-doxygen/html/search/functions_3.js +262 -261
- package/SVF-doxygen/html/search/functions_4.js +78 -78
- package/SVF-doxygen/html/search/functions_5.js +53 -53
- package/SVF-doxygen/html/search/functions_6.js +60 -60
- package/SVF-doxygen/html/search/functions_7.js +857 -857
- package/SVF-doxygen/html/search/functions_8.js +148 -148
- package/SVF-doxygen/html/search/functions_9.js +421 -421
- 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 +79 -79
- package/SVF-doxygen/html/search/functions_e.js +35 -35
- package/SVF-doxygen/html/search/functions_f.js +56 -56
- 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 +2 -2
- 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 +19 -19
- package/SVF-doxygen/html/search/typedefs_1.js +26 -26
- package/SVF-doxygen/html/search/typedefs_10.js +62 -62
- 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 +33 -33
- package/SVF-doxygen/html/search/typedefs_14.js +8 -8
- 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 +17 -17
- package/SVF-doxygen/html/search/typedefs_5.js +41 -41
- package/SVF-doxygen/html/search/typedefs_6.js +56 -56
- package/SVF-doxygen/html/search/typedefs_7.js +44 -44
- 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 +151 -151
- 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 +45 -45
- package/SVF-doxygen/html/search/variables_12.js +91 -90
- package/SVF-doxygen/html/search/variables_13.js +74 -74
- 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 +9 -9
- package/SVF-doxygen/html/search/variables_17.js +1 -1
- package/SVF-doxygen/html/search/variables_18.js +2 -2
- package/SVF-doxygen/html/search/variables_2.js +38 -38
- package/SVF-doxygen/html/search/variables_3.js +142 -142
- package/SVF-doxygen/html/search/variables_4.js +50 -50
- package/SVF-doxygen/html/search/variables_5.js +37 -37
- 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 +7 -7
- 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 +55 -55
- package/SVF-doxygen/html/search/variables_e.js +123 -123
- package/SVF-doxygen/html/search/variables_f.js +30 -30
- package/SVF-doxygen/html/structSVF_1_1DOTGraphTraits_3_01ConstraintGraph_01_5_01_4.html +118 -118
- package/SVF-doxygen/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1ConstraintNode_01_5_01_4_01_4.html +1 -1
- package/SVF-doxygen/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1ConstraintGraph_01_5_01_4.html +2 -2
- package/SVF-doxygen/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1ConstraintNode_01_5_01_4.html +1 -1
- package/build.sh +1 -1
- package/package.json +1 -1
- package/svf/include/DDA/DDAStat.h +0 -17
- package/svf/include/Graphs/ConsG.h +2 -0
- package/svf/include/Util/PTAStat.h +19 -1
- package/svf/lib/DDA/DDAStat.cpp +0 -3
- package/svf/lib/Graphs/ConsG.cpp +20 -0
- package/svf/lib/Util/PTAStat.cpp +17 -1
- package/svf/lib/WPA/Andersen.cpp +2 -2
- package/svf/lib/WPA/AndersenStat.cpp +3 -0
- package/svf-llvm/tools/AE/CMakeLists.txt +2 -0
- package/svf-llvm/tools/AE/ae.cpp +607 -0
- package/svf-llvm/tools/CMakeLists.txt +3 -2
package/svf/lib/Util/PTAStat.cpp
CHANGED
|
@@ -36,8 +36,17 @@
|
|
|
36
36
|
using namespace SVF;
|
|
37
37
|
using namespace std;
|
|
38
38
|
|
|
39
|
-
PTAStat::PTAStat(PointerAnalysis* p) : SVFStat(),
|
|
39
|
+
PTAStat::PTAStat(PointerAnalysis* p) : SVFStat(),
|
|
40
|
+
pta(p),
|
|
41
|
+
_vmrssUsageBefore(0),
|
|
42
|
+
_vmrssUsageAfter(0),
|
|
43
|
+
_vmsizeUsageBefore(0),
|
|
44
|
+
_vmsizeUsageAfter(0)
|
|
40
45
|
{
|
|
46
|
+
u32_t vmrss = 0;
|
|
47
|
+
u32_t vmsize = 0;
|
|
48
|
+
SVFUtil::getMemoryUsageKB(&vmrss, &vmsize);
|
|
49
|
+
setMemUsageBefore(vmrss, vmsize);
|
|
41
50
|
}
|
|
42
51
|
|
|
43
52
|
void PTAStat::performStat()
|
|
@@ -59,6 +68,13 @@ void PTAStat::performStat()
|
|
|
59
68
|
}
|
|
60
69
|
}
|
|
61
70
|
PTNumStatMap["LocalVarInRecur"] = localVarInRecursion.count();
|
|
71
|
+
|
|
72
|
+
u32_t vmrss = 0;
|
|
73
|
+
u32_t vmsize = 0;
|
|
74
|
+
SVFUtil::getMemoryUsageKB(&vmrss, &vmsize);
|
|
75
|
+
setMemUsageAfter(vmrss, vmsize);
|
|
76
|
+
PTNumStatMap["MemoryUsageVmrss"] = _vmrssUsageAfter - _vmrssUsageBefore;
|
|
77
|
+
PTNumStatMap["MemoryUsageVmsize"] = _vmsizeUsageAfter - _vmsizeUsageBefore;
|
|
62
78
|
}
|
|
63
79
|
|
|
64
80
|
void PTAStat::callgraphStat()
|
package/svf/lib/WPA/Andersen.cpp
CHANGED
|
@@ -74,11 +74,11 @@ void AndersenBase::initialize()
|
|
|
74
74
|
{
|
|
75
75
|
/// Build SVFIR
|
|
76
76
|
PointerAnalysis::initialize();
|
|
77
|
+
/// Create statistic class
|
|
78
|
+
stat = new AndersenStat(this);
|
|
77
79
|
/// Build Constraint Graph
|
|
78
80
|
consCG = new ConstraintGraph(pag);
|
|
79
81
|
setGraph(consCG);
|
|
80
|
-
/// Create statistic class
|
|
81
|
-
stat = new AndersenStat(this);
|
|
82
82
|
if (Options::ConsCGDotGraph())
|
|
83
83
|
consCG->dump("consCG_initial");
|
|
84
84
|
}
|
|
@@ -352,6 +352,9 @@ void AndersenStat::performStat()
|
|
|
352
352
|
PTNumStatMap["PointsToConstPtr"] = _NumOfConstantPtr;
|
|
353
353
|
PTNumStatMap["PointsToBlkPtr"] = _NumOfBlackholePtr;
|
|
354
354
|
|
|
355
|
+
PTNumStatMap["MemoryUsageVmrss"] = _vmrssUsageAfter - _vmrssUsageBefore;
|
|
356
|
+
PTNumStatMap["MemoryUsageVmsize"] = _vmsizeUsageAfter - _vmsizeUsageBefore;
|
|
357
|
+
|
|
355
358
|
PTAStat::printStat("Andersen Pointer Analysis Stats");
|
|
356
359
|
}
|
|
357
360
|
|
|
@@ -0,0 +1,607 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Created by Jiawei Ren on 11/28/23.
|
|
3
|
+
//
|
|
4
|
+
#include "AbstractExecution/IntervalExeState.h"
|
|
5
|
+
#include "AbstractExecution/RelExeState.h"
|
|
6
|
+
#include "AbstractExecution/RelationSolver.h"
|
|
7
|
+
#include "SVF-LLVM/LLVMUtil.h"
|
|
8
|
+
#include "Util/Z3Expr.h"
|
|
9
|
+
#include "Util/Options.h"
|
|
10
|
+
#include <chrono>
|
|
11
|
+
|
|
12
|
+
using namespace SVF;
|
|
13
|
+
using namespace SVFUtil;
|
|
14
|
+
|
|
15
|
+
static Option<bool> SYMABS(
|
|
16
|
+
"symabs",
|
|
17
|
+
"symbolic abstraction test",
|
|
18
|
+
false
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
class SymblicAbstractionTest
|
|
22
|
+
{
|
|
23
|
+
public:
|
|
24
|
+
SymblicAbstractionTest() = default;
|
|
25
|
+
|
|
26
|
+
~SymblicAbstractionTest() = default;
|
|
27
|
+
|
|
28
|
+
static z3::context& getContext()
|
|
29
|
+
{
|
|
30
|
+
return Z3Expr::getContext();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
void test_print()
|
|
34
|
+
{
|
|
35
|
+
SVFUtil::outs() << "hello print\n";
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
IntervalESBase RSY_time(IntervalESBase& inv, const Z3Expr& phi,
|
|
39
|
+
RelationSolver& rs)
|
|
40
|
+
{
|
|
41
|
+
auto start_time = std::chrono::high_resolution_clock::now();
|
|
42
|
+
IntervalESBase resRSY = rs.RSY(inv, phi);
|
|
43
|
+
auto end_time = std::chrono::high_resolution_clock::now();
|
|
44
|
+
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(
|
|
45
|
+
end_time - start_time);
|
|
46
|
+
outs() << "running time of RSY : " << duration.count()
|
|
47
|
+
<< " microseconds\n";
|
|
48
|
+
return resRSY;
|
|
49
|
+
}
|
|
50
|
+
IntervalESBase Bilateral_time(IntervalESBase& inv, const Z3Expr& phi,
|
|
51
|
+
RelationSolver& rs)
|
|
52
|
+
{
|
|
53
|
+
auto start_time = std::chrono::high_resolution_clock::now();
|
|
54
|
+
IntervalESBase resBilateral = rs.bilateral(inv, phi);
|
|
55
|
+
auto end_time = std::chrono::high_resolution_clock::now();
|
|
56
|
+
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(
|
|
57
|
+
end_time - start_time);
|
|
58
|
+
outs() << "running time of Bilateral: " << duration.count()
|
|
59
|
+
<< " microseconds\n";
|
|
60
|
+
return resBilateral;
|
|
61
|
+
}
|
|
62
|
+
IntervalESBase BS_time(IntervalESBase& inv, const Z3Expr& phi,
|
|
63
|
+
RelationSolver& rs)
|
|
64
|
+
{
|
|
65
|
+
auto start_time = std::chrono::high_resolution_clock::now();
|
|
66
|
+
IntervalESBase resBS = rs.BS(inv, phi);
|
|
67
|
+
auto end_time = std::chrono::high_resolution_clock::now();
|
|
68
|
+
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(
|
|
69
|
+
end_time - start_time);
|
|
70
|
+
outs() << "running time of BS : " << duration.count()
|
|
71
|
+
<< " microseconds\n";
|
|
72
|
+
return resBS;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
void testRelExeState1_1()
|
|
76
|
+
{
|
|
77
|
+
SVFUtil::outs() << sucMsg("\t SUCCESS :") << "test1_1 start\n";
|
|
78
|
+
IntervalESBase itv;
|
|
79
|
+
RelExeState relation;
|
|
80
|
+
// var0 := [0, 1];
|
|
81
|
+
itv[0] = IntervalValue(0, 1);
|
|
82
|
+
relation[0] = getContext().int_const("0");
|
|
83
|
+
// var1 := var0 + 1;
|
|
84
|
+
relation[1] =
|
|
85
|
+
getContext().int_const("1") == getContext().int_const("0") + 1;
|
|
86
|
+
itv[1] = itv[0] + IntervalValue(1);
|
|
87
|
+
// Test extract sub vars
|
|
88
|
+
Set<u32_t> res;
|
|
89
|
+
relation.extractSubVars(relation[1], res);
|
|
90
|
+
assert(res == Set<u32_t>({0, 1}) && "inconsistency occurs");
|
|
91
|
+
IntervalESBase inv = itv.sliceState(res);
|
|
92
|
+
RelationSolver rs;
|
|
93
|
+
const Z3Expr& relExpr = relation[1];
|
|
94
|
+
const Z3Expr& initExpr = rs.gamma_hat(inv);
|
|
95
|
+
const Z3Expr& phi = (relExpr && initExpr).simplify();
|
|
96
|
+
IntervalESBase resRSY = rs.RSY(inv, phi);
|
|
97
|
+
IntervalESBase resBilateral = rs.bilateral(inv, phi);
|
|
98
|
+
IntervalESBase resBS = rs.BS(inv, phi);
|
|
99
|
+
// 0:[0,1] 1:[1,2]
|
|
100
|
+
assert(resRSY == resBS && resBS == resBilateral && "inconsistency occurs");
|
|
101
|
+
for (auto r : resRSY.getVarToVal())
|
|
102
|
+
{
|
|
103
|
+
outs() << r.first << " " << r.second << "\n";
|
|
104
|
+
}
|
|
105
|
+
IntervalESBase::VarToValMap intendedRes = {{0, IntervalValue(0, 1)}, {1, IntervalValue(1, 2)}};
|
|
106
|
+
assert(IntervalESBase::eqVarToValMap(resBS.getVarToVal(), intendedRes) && "inconsistency occurs");
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
void testRelExeState1_2()
|
|
110
|
+
{
|
|
111
|
+
SVFUtil::outs() << "test1_2 start\n";
|
|
112
|
+
IntervalESBase itv;
|
|
113
|
+
RelExeState relation;
|
|
114
|
+
// var0 := [0, 1];
|
|
115
|
+
relation[0] = getContext().int_const("0");
|
|
116
|
+
itv[0] = IntervalValue(0, 1);
|
|
117
|
+
// var1 := var0 + 1;
|
|
118
|
+
relation[1] =
|
|
119
|
+
getContext().int_const("1") == getContext().int_const("0") * 2;
|
|
120
|
+
itv[1] = itv[0] * IntervalValue(2);
|
|
121
|
+
|
|
122
|
+
// Test extract sub vars
|
|
123
|
+
Set<u32_t> res;
|
|
124
|
+
relation.extractSubVars(relation[1], res);
|
|
125
|
+
assert(res == Set<u32_t>({0, 1}) && "inconsistency occurs");
|
|
126
|
+
IntervalESBase inv = itv.sliceState(res);
|
|
127
|
+
RelationSolver rs;
|
|
128
|
+
const Z3Expr& relExpr = relation[1];
|
|
129
|
+
const Z3Expr& initExpr = rs.gamma_hat(inv);
|
|
130
|
+
const Z3Expr& phi = (relExpr && initExpr).simplify();
|
|
131
|
+
IntervalESBase resRSY = rs.RSY(inv, phi);
|
|
132
|
+
IntervalESBase resBilateral = rs.bilateral(inv, phi);
|
|
133
|
+
IntervalESBase resBS = rs.BS(inv, phi);
|
|
134
|
+
// 0:[0,1] 1:[0,2]
|
|
135
|
+
assert(resRSY == resBS && resBS == resBilateral && "inconsistency occurs");
|
|
136
|
+
for (auto r : resRSY.getVarToVal())
|
|
137
|
+
{
|
|
138
|
+
outs() << r.first << " " << r.second << "\n";
|
|
139
|
+
}
|
|
140
|
+
IntervalESBase::VarToValMap intendedRes = {{0, IntervalValue(0, 1)}, {1, IntervalValue(0, 2)}};
|
|
141
|
+
assert(IntervalESBase::eqVarToValMap(resBS.getVarToVal(), intendedRes) && "inconsistency occurs");
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
void testRelExeState2_1()
|
|
145
|
+
{
|
|
146
|
+
SVFUtil::outs() << "test2_1 start\n";
|
|
147
|
+
IntervalESBase itv;
|
|
148
|
+
RelExeState relation;
|
|
149
|
+
// var0 := [0, 10];
|
|
150
|
+
relation[0] = getContext().int_const("0");
|
|
151
|
+
itv[0] = IntervalValue(0, 10);
|
|
152
|
+
// var1 := var0;
|
|
153
|
+
relation[1] =
|
|
154
|
+
getContext().int_const("1") == getContext().int_const("0");
|
|
155
|
+
itv[1] = itv[0];
|
|
156
|
+
// var2 := var1 - var0;
|
|
157
|
+
relation[2] = getContext().int_const("2") ==
|
|
158
|
+
getContext().int_const("1") - getContext().int_const("0");
|
|
159
|
+
itv[2] = itv[1] - itv[0];
|
|
160
|
+
// Test extract sub vars
|
|
161
|
+
Set<u32_t> res;
|
|
162
|
+
relation.extractSubVars(relation[2], res);
|
|
163
|
+
assert(res == Set<u32_t>({0, 1, 2}) && "inconsistency occurs");
|
|
164
|
+
IntervalESBase inv = itv.sliceState(res);
|
|
165
|
+
RelationSolver rs;
|
|
166
|
+
const Z3Expr& relExpr = relation[2] && relation[1];
|
|
167
|
+
const Z3Expr& initExpr = rs.gamma_hat(inv);
|
|
168
|
+
const Z3Expr& phi = (relExpr && initExpr).simplify();
|
|
169
|
+
IntervalESBase resRSY = rs.RSY(inv, phi);
|
|
170
|
+
IntervalESBase resBilateral = rs.bilateral(inv, phi);
|
|
171
|
+
IntervalESBase resBS = rs.BS(inv, phi);
|
|
172
|
+
// 0:[0,10] 1:[0,10] 2:[0,0]
|
|
173
|
+
assert(resRSY == resBS && resBS == resBilateral && "inconsistency occurs");
|
|
174
|
+
for (auto r : resRSY.getVarToVal())
|
|
175
|
+
{
|
|
176
|
+
outs() << r.first << " " << r.second << "\n";
|
|
177
|
+
}
|
|
178
|
+
// ground truth
|
|
179
|
+
IntervalESBase::VarToValMap intendedRes = {{0, IntervalValue(0, 10)},
|
|
180
|
+
{1, IntervalValue(0, 10)},
|
|
181
|
+
{2, IntervalValue(0, 0)}
|
|
182
|
+
};
|
|
183
|
+
assert(IntervalESBase::eqVarToValMap(resBS.getVarToVal(), intendedRes) && "inconsistency occurs");
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
void testRelExeState2_2()
|
|
187
|
+
{
|
|
188
|
+
SVFUtil::outs() << "test2_2 start\n";
|
|
189
|
+
IntervalESBase itv;
|
|
190
|
+
RelExeState relation;
|
|
191
|
+
// var0 := [0, 100];
|
|
192
|
+
relation[0] = getContext().int_const("0");
|
|
193
|
+
itv[0] = IntervalValue(0, 100);
|
|
194
|
+
// var1 := var0;
|
|
195
|
+
relation[1] =
|
|
196
|
+
getContext().int_const("1") == getContext().int_const("0");
|
|
197
|
+
itv[1] = itv[0];
|
|
198
|
+
// var2 := var1 - var0;
|
|
199
|
+
relation[2] = getContext().int_const("2") ==
|
|
200
|
+
getContext().int_const("1") - getContext().int_const("0");
|
|
201
|
+
itv[2] = itv[1] - itv[0];
|
|
202
|
+
|
|
203
|
+
// Test extract sub vars
|
|
204
|
+
Set<u32_t> res;
|
|
205
|
+
relation.extractSubVars(relation[2], res);
|
|
206
|
+
assert(res == Set<u32_t>({0, 1, 2}) && "inconsistency occurs");
|
|
207
|
+
IntervalESBase inv = itv.sliceState(res);
|
|
208
|
+
RelationSolver rs;
|
|
209
|
+
const Z3Expr& relExpr = relation[2] && relation[1];
|
|
210
|
+
const Z3Expr& initExpr = rs.gamma_hat(inv);
|
|
211
|
+
const Z3Expr& phi = (relExpr && initExpr).simplify();
|
|
212
|
+
IntervalESBase resRSY = rs.RSY(inv, phi);
|
|
213
|
+
IntervalESBase resBilateral = rs.bilateral(inv, phi);
|
|
214
|
+
IntervalESBase resBS = rs.BS(inv, phi);
|
|
215
|
+
// 0:[0,100] 1:[0,100] 2:[0,0]
|
|
216
|
+
assert(resRSY == resBS && resBS == resBilateral && "inconsistency occurs");
|
|
217
|
+
for (auto r : resRSY.getVarToVal())
|
|
218
|
+
{
|
|
219
|
+
outs() << r.first << " " << r.second << "\n";
|
|
220
|
+
}
|
|
221
|
+
// ground truth
|
|
222
|
+
IntervalESBase::VarToValMap intendedRes = {{0, IntervalValue(0, 100)},
|
|
223
|
+
{1, IntervalValue(0, 100)},
|
|
224
|
+
{2, IntervalValue(0, 0)}
|
|
225
|
+
};
|
|
226
|
+
assert(IntervalESBase::eqVarToValMap(resBS.getVarToVal(), intendedRes) && "inconsistency occurs");
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
void testRelExeState2_3()
|
|
230
|
+
{
|
|
231
|
+
SVFUtil::outs() << "test2_3 start\n";
|
|
232
|
+
IntervalESBase itv;
|
|
233
|
+
RelExeState relation;
|
|
234
|
+
// var0 := [0, 1000];
|
|
235
|
+
relation[0] = getContext().int_const("0");
|
|
236
|
+
itv[0] = IntervalValue(0, 1000);
|
|
237
|
+
// var1 := var0;
|
|
238
|
+
relation[1] =
|
|
239
|
+
getContext().int_const("1") == getContext().int_const("0");
|
|
240
|
+
itv[1] = itv[0];
|
|
241
|
+
// var2 := var1 - var0;
|
|
242
|
+
relation[2] = getContext().int_const("2") ==
|
|
243
|
+
getContext().int_const("1") - getContext().int_const("0");
|
|
244
|
+
itv[2] = itv[1] - itv[0];
|
|
245
|
+
|
|
246
|
+
// Test extract sub vars
|
|
247
|
+
Set<u32_t> res;
|
|
248
|
+
relation.extractSubVars(relation[2], res);
|
|
249
|
+
assert(res == Set<u32_t>({0, 1, 2}) && "inconsistency occurs");
|
|
250
|
+
IntervalESBase inv = itv.sliceState(res);
|
|
251
|
+
RelationSolver rs;
|
|
252
|
+
const Z3Expr& relExpr = relation[2] && relation[1];
|
|
253
|
+
const Z3Expr& initExpr = rs.gamma_hat(inv);
|
|
254
|
+
const Z3Expr& phi = (relExpr && initExpr).simplify();
|
|
255
|
+
IntervalESBase resRSY = rs.RSY(inv, phi);
|
|
256
|
+
IntervalESBase resBilateral = rs.bilateral(inv, phi);
|
|
257
|
+
IntervalESBase resBS = rs.BS(inv, phi);
|
|
258
|
+
// 0:[0,1000] 1:[0,1000] 2:[0,0]
|
|
259
|
+
assert(resRSY == resBS && resBS == resBilateral && "inconsistency occurs");
|
|
260
|
+
for (auto r : resRSY.getVarToVal())
|
|
261
|
+
{
|
|
262
|
+
outs() << r.first << " " << r.second << "\n";
|
|
263
|
+
}
|
|
264
|
+
// ground truth
|
|
265
|
+
// ground truth
|
|
266
|
+
IntervalESBase::VarToValMap intendedRes = {{0, IntervalValue(0, 1000)},
|
|
267
|
+
{1, IntervalValue(0, 1000)},
|
|
268
|
+
{2, IntervalValue(0, 0)}
|
|
269
|
+
};
|
|
270
|
+
assert(IntervalESBase::eqVarToValMap(resBS.getVarToVal(), intendedRes) && "inconsistency occurs");
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
void testRelExeState2_4()
|
|
274
|
+
{
|
|
275
|
+
SVFUtil::outs() << "test2_4 start\n";
|
|
276
|
+
IntervalESBase itv;
|
|
277
|
+
RelExeState relation;
|
|
278
|
+
// var0 := [0, 10000];
|
|
279
|
+
relation[0] = getContext().int_const("0");
|
|
280
|
+
itv[0] = IntervalValue(0, 10000);
|
|
281
|
+
// var1 := var0;
|
|
282
|
+
relation[1] =
|
|
283
|
+
getContext().int_const("1") == getContext().int_const("0");
|
|
284
|
+
itv[1] = itv[0];
|
|
285
|
+
// var2 := var1 - var0;
|
|
286
|
+
relation[2] = getContext().int_const("2") ==
|
|
287
|
+
getContext().int_const("1") - getContext().int_const("0");
|
|
288
|
+
itv[2] = itv[1] - itv[0];
|
|
289
|
+
|
|
290
|
+
// Test extract sub vars
|
|
291
|
+
Set<u32_t> res;
|
|
292
|
+
relation.extractSubVars(relation[2], res);
|
|
293
|
+
assert(res == Set<u32_t>({0, 1, 2}) && "inconsistency occurs");
|
|
294
|
+
IntervalESBase inv = itv.sliceState(res);
|
|
295
|
+
RelationSolver rs;
|
|
296
|
+
const Z3Expr& relExpr = relation[2] && relation[1];
|
|
297
|
+
const Z3Expr& initExpr = rs.gamma_hat(inv);
|
|
298
|
+
const Z3Expr& phi = (relExpr && initExpr).simplify();
|
|
299
|
+
IntervalESBase resRSY = RSY_time(inv, phi, rs);
|
|
300
|
+
IntervalESBase resBilateral = Bilateral_time(inv, phi, rs);
|
|
301
|
+
IntervalESBase resBS = BS_time(inv, phi, rs);
|
|
302
|
+
// 0:[0,10000] 1:[0,10000] 2:[0,0]
|
|
303
|
+
assert(resRSY == resBS && resBS == resBilateral && "inconsistency occurs");
|
|
304
|
+
for (auto r : resRSY.getVarToVal())
|
|
305
|
+
{
|
|
306
|
+
outs() << r.first << " " << r.second << "\n";
|
|
307
|
+
}
|
|
308
|
+
// ground truth
|
|
309
|
+
// ground truth
|
|
310
|
+
IntervalESBase::VarToValMap intendedRes = {{0, IntervalValue(0, 10000)},
|
|
311
|
+
{1, IntervalValue(0, 10000)},
|
|
312
|
+
{2, IntervalValue(0, 0)}
|
|
313
|
+
};
|
|
314
|
+
assert(IntervalESBase::eqVarToValMap(resBS.getVarToVal(), intendedRes) && "inconsistency occurs");
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
void testRelExeState2_5()
|
|
318
|
+
{
|
|
319
|
+
SVFUtil::outs() << "test2_5 start\n";
|
|
320
|
+
IntervalESBase itv;
|
|
321
|
+
RelExeState relation;
|
|
322
|
+
// var0 := [0, 100000];
|
|
323
|
+
relation[0] = getContext().int_const("0");
|
|
324
|
+
itv[0] = IntervalValue(0, 100000);
|
|
325
|
+
// var1 := var0;
|
|
326
|
+
relation[1] =
|
|
327
|
+
getContext().int_const("1") == getContext().int_const("0");
|
|
328
|
+
itv[1] = itv[0];
|
|
329
|
+
// var2 := var1 - var0;
|
|
330
|
+
relation[2] = getContext().int_const("2") ==
|
|
331
|
+
getContext().int_const("1") - getContext().int_const("0");
|
|
332
|
+
itv[2] = itv[1] - itv[0];
|
|
333
|
+
|
|
334
|
+
// Test extract sub vars
|
|
335
|
+
Set<u32_t> res;
|
|
336
|
+
relation.extractSubVars(relation[2], res);
|
|
337
|
+
assert(res == Set<u32_t>({0, 1, 2}) && "inconsistency occurs");
|
|
338
|
+
IntervalESBase inv = itv.sliceState(res);
|
|
339
|
+
RelationSolver rs;
|
|
340
|
+
const Z3Expr& relExpr = relation[2] && relation[1];
|
|
341
|
+
const Z3Expr& initExpr = rs.gamma_hat(inv);
|
|
342
|
+
const Z3Expr& phi = (relExpr && initExpr).simplify();
|
|
343
|
+
IntervalESBase resRSY = RSY_time(inv, phi, rs);
|
|
344
|
+
IntervalESBase resBilateral = Bilateral_time(inv, phi, rs);
|
|
345
|
+
IntervalESBase resBS = BS_time(inv, phi, rs);
|
|
346
|
+
// 0:[0,100000] 1:[0,100000] 2:[0,0]
|
|
347
|
+
assert(resRSY == resBS && resBS == resBilateral && "inconsistency occurs");
|
|
348
|
+
for (auto r : resRSY.getVarToVal())
|
|
349
|
+
{
|
|
350
|
+
outs() << r.first << " " << r.second << "\n";
|
|
351
|
+
}
|
|
352
|
+
// ground truth
|
|
353
|
+
// ground truth
|
|
354
|
+
IntervalESBase::VarToValMap intendedRes = {{0, IntervalValue(0, 100000)},
|
|
355
|
+
{1, IntervalValue(0, 100000)},
|
|
356
|
+
{2, IntervalValue(0, 0)}
|
|
357
|
+
};
|
|
358
|
+
assert(IntervalESBase::eqVarToValMap(resBS.getVarToVal(), intendedRes) && "inconsistency occurs");
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
void testRelExeState3_1()
|
|
362
|
+
{
|
|
363
|
+
SVFUtil::outs() << "test3_1 start\n";
|
|
364
|
+
IntervalESBase itv;
|
|
365
|
+
RelExeState relation;
|
|
366
|
+
// var0 := [1, 10];
|
|
367
|
+
relation[0] = getContext().int_const("0");
|
|
368
|
+
itv[0] = IntervalValue(1, 10);
|
|
369
|
+
// var1 := var0;
|
|
370
|
+
relation[1] =
|
|
371
|
+
getContext().int_const("1") == getContext().int_const("0");
|
|
372
|
+
itv[1] = itv[0];
|
|
373
|
+
// var2 := var1 / var0;
|
|
374
|
+
relation[2] = getContext().int_const("2") ==
|
|
375
|
+
getContext().int_const("1") / getContext().int_const("0");
|
|
376
|
+
itv[2] = itv[1] / itv[0];
|
|
377
|
+
// Test extract sub vars
|
|
378
|
+
Set<u32_t> res;
|
|
379
|
+
relation.extractSubVars(relation[2], res);
|
|
380
|
+
assert(res == Set<u32_t>({0, 1, 2}) && "inconsistency occurs");
|
|
381
|
+
IntervalESBase inv = itv.sliceState(res);
|
|
382
|
+
RelationSolver rs;
|
|
383
|
+
const Z3Expr& relExpr = relation[2] && relation[1];
|
|
384
|
+
const Z3Expr& initExpr = rs.gamma_hat(inv);
|
|
385
|
+
const Z3Expr& phi = (relExpr && initExpr).simplify();
|
|
386
|
+
IntervalESBase resRSY = rs.RSY(inv, phi);
|
|
387
|
+
IntervalESBase resBilateral = rs.bilateral(inv, phi);
|
|
388
|
+
IntervalESBase resBS = rs.BS(inv, phi);
|
|
389
|
+
// 0:[1,10] 1:[1,10] 2:[1,1]
|
|
390
|
+
assert(resRSY == resBS && resBS == resBilateral && "inconsistency occurs");
|
|
391
|
+
for (auto r : resRSY.getVarToVal())
|
|
392
|
+
{
|
|
393
|
+
outs() << r.first << " " << r.second << "\n";
|
|
394
|
+
}
|
|
395
|
+
// ground truth
|
|
396
|
+
IntervalESBase::VarToValMap intendedRes = {{0, IntervalValue(1, 10)},
|
|
397
|
+
{1, IntervalValue(1, 10)},
|
|
398
|
+
{2, IntervalValue(1, 1)}
|
|
399
|
+
};
|
|
400
|
+
assert(IntervalESBase::eqVarToValMap(resBS.getVarToVal(), intendedRes) && "inconsistency occurs");
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
void testRelExeState3_2()
|
|
404
|
+
{
|
|
405
|
+
SVFUtil::outs() << "test3_2 start\n";
|
|
406
|
+
IntervalESBase itv;
|
|
407
|
+
RelExeState relation;
|
|
408
|
+
// var0 := [1, 1000];
|
|
409
|
+
relation[0] = getContext().int_const("0");
|
|
410
|
+
itv[0] = IntervalValue(1, 1000);
|
|
411
|
+
// var1 := var0;
|
|
412
|
+
relation[1] =
|
|
413
|
+
getContext().int_const("1") == getContext().int_const("0");
|
|
414
|
+
itv[1] = itv[0];
|
|
415
|
+
// var2 := var1 / var0;
|
|
416
|
+
relation[2] = getContext().int_const("2") ==
|
|
417
|
+
getContext().int_const("1") / getContext().int_const("0");
|
|
418
|
+
itv[2] = itv[1] / itv[0];
|
|
419
|
+
// Test extract sub vars
|
|
420
|
+
Set<u32_t> res;
|
|
421
|
+
relation.extractSubVars(relation[2], res);
|
|
422
|
+
assert(res == Set<u32_t>({0, 1, 2}) && "inconsistency occurs");
|
|
423
|
+
IntervalESBase inv = itv.sliceState(res);
|
|
424
|
+
RelationSolver rs;
|
|
425
|
+
const Z3Expr& relExpr = relation[2] && relation[1];
|
|
426
|
+
const Z3Expr& initExpr = rs.gamma_hat(inv);
|
|
427
|
+
const Z3Expr& phi = (relExpr && initExpr).simplify();
|
|
428
|
+
IntervalESBase resRSY = rs.RSY(inv, phi);
|
|
429
|
+
IntervalESBase resBilateral = rs.bilateral(inv, phi);
|
|
430
|
+
IntervalESBase resBS = rs.BS(inv, phi);
|
|
431
|
+
// 0:[1,1000] 1:[1,1000] 2:[1,1]
|
|
432
|
+
assert(resRSY == resBS && resBS == resBilateral && "inconsistency occurs");
|
|
433
|
+
for (auto r : resRSY.getVarToVal())
|
|
434
|
+
{
|
|
435
|
+
outs() << r.first << " " << r.second << "\n";
|
|
436
|
+
}
|
|
437
|
+
// ground truth
|
|
438
|
+
IntervalESBase::VarToValMap intendedRes = {{0, IntervalValue(1, 1000)},
|
|
439
|
+
{1, IntervalValue(1, 1000)},
|
|
440
|
+
{2, IntervalValue(1, 1)}
|
|
441
|
+
};
|
|
442
|
+
assert(IntervalESBase::eqVarToValMap(resBS.getVarToVal(), intendedRes) && "inconsistency occurs");
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
void testRelExeState3_3()
|
|
446
|
+
{
|
|
447
|
+
SVFUtil::outs() << "test3_3 start\n";
|
|
448
|
+
IntervalESBase itv;
|
|
449
|
+
RelExeState relation;
|
|
450
|
+
// var0 := [1, 10000];
|
|
451
|
+
relation[0] = getContext().int_const("0");
|
|
452
|
+
itv[0] = IntervalValue(1, 10000);
|
|
453
|
+
// var1 := var0;
|
|
454
|
+
relation[1] =
|
|
455
|
+
getContext().int_const("1") == getContext().int_const("0");
|
|
456
|
+
itv[1] = itv[0];
|
|
457
|
+
// var2 := var1 / var0;
|
|
458
|
+
relation[2] = getContext().int_const("2") ==
|
|
459
|
+
getContext().int_const("1") / getContext().int_const("0");
|
|
460
|
+
itv[2] = itv[1] / itv[0];
|
|
461
|
+
// Test extract sub vars
|
|
462
|
+
Set<u32_t> res;
|
|
463
|
+
relation.extractSubVars(relation[2], res);
|
|
464
|
+
assert(res == Set<u32_t>({0, 1, 2}) && "inconsistency occurs");
|
|
465
|
+
IntervalESBase inv = itv.sliceState(res);
|
|
466
|
+
RelationSolver rs;
|
|
467
|
+
const Z3Expr& relExpr = relation[2] && relation[1];
|
|
468
|
+
const Z3Expr& initExpr = rs.gamma_hat(inv);
|
|
469
|
+
const Z3Expr& phi = (relExpr && initExpr).simplify();
|
|
470
|
+
IntervalESBase resRSY = RSY_time(inv, phi, rs);
|
|
471
|
+
IntervalESBase resBilateral = Bilateral_time(inv, phi, rs);
|
|
472
|
+
IntervalESBase resBS = BS_time(inv, phi, rs);
|
|
473
|
+
// 0:[1,10000] 1:[1,10000] 2:[1,1]
|
|
474
|
+
assert(resRSY == resBS && resBS == resBilateral && "inconsistency occurs");
|
|
475
|
+
for (auto r : resRSY.getVarToVal())
|
|
476
|
+
{
|
|
477
|
+
outs() << r.first << " " << r.second << "\n";
|
|
478
|
+
}
|
|
479
|
+
// ground truth
|
|
480
|
+
IntervalESBase::VarToValMap intendedRes =
|
|
481
|
+
Map<u32_t, IntervalValue>({{0, IntervalValue(1, 10000)},
|
|
482
|
+
{1, IntervalValue(1, 10000)},
|
|
483
|
+
{2, IntervalValue(1, 1)}});
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
void testRelExeState3_4()
|
|
487
|
+
{
|
|
488
|
+
SVFUtil::outs() << "test3_4 start\n";
|
|
489
|
+
IntervalESBase itv;
|
|
490
|
+
RelExeState relation;
|
|
491
|
+
// var0 := [1, 100000];
|
|
492
|
+
relation[0] = getContext().int_const("0");
|
|
493
|
+
itv[0] = IntervalValue(1, 100000);
|
|
494
|
+
// var1 := var0;
|
|
495
|
+
relation[1] =
|
|
496
|
+
getContext().int_const("1") == getContext().int_const("0");
|
|
497
|
+
itv[1] = itv[0];
|
|
498
|
+
// var2 := var1 / var0;
|
|
499
|
+
relation[2] = getContext().int_const("2") ==
|
|
500
|
+
getContext().int_const("1") / getContext().int_const("0");
|
|
501
|
+
itv[2] = itv[1] / itv[0];
|
|
502
|
+
// Test extract sub vars
|
|
503
|
+
Set<u32_t> res;
|
|
504
|
+
relation.extractSubVars(relation[2], res);
|
|
505
|
+
assert(res == Set<u32_t>({0, 1, 2}) && "inconsistency occurs");
|
|
506
|
+
IntervalESBase inv = itv.sliceState(res);
|
|
507
|
+
RelationSolver rs;
|
|
508
|
+
const Z3Expr& relExpr = relation[2] && relation[1];
|
|
509
|
+
const Z3Expr& initExpr = rs.gamma_hat(inv);
|
|
510
|
+
const Z3Expr& phi = (relExpr && initExpr).simplify();
|
|
511
|
+
IntervalESBase resRSY = RSY_time(inv, phi, rs);
|
|
512
|
+
IntervalESBase resBilateral = Bilateral_time(inv, phi, rs);
|
|
513
|
+
IntervalESBase resBS = BS_time(inv, phi, rs);
|
|
514
|
+
// 0:[1,100000] 1:[1,100000] 2:[1,1]
|
|
515
|
+
assert(resRSY == resBS && resBS == resBilateral && "inconsistency occurs");
|
|
516
|
+
for (auto r : resRSY.getVarToVal())
|
|
517
|
+
{
|
|
518
|
+
outs() << r.first << " " << r.second << "\n";
|
|
519
|
+
}
|
|
520
|
+
// ground truth
|
|
521
|
+
IntervalESBase::VarToValMap intendedRes = {{0, IntervalValue(1, 100000)},
|
|
522
|
+
{1, IntervalValue(1, 100000)},
|
|
523
|
+
{2, IntervalValue(1, 1)}
|
|
524
|
+
};
|
|
525
|
+
assert(IntervalESBase::eqVarToValMap(resBS.getVarToVal(), intendedRes) && "inconsistency occurs");
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
void testRelExeState4_1()
|
|
529
|
+
{
|
|
530
|
+
SVFUtil::outs() << "test4_1 start\n";
|
|
531
|
+
IntervalESBase itv;
|
|
532
|
+
RelExeState relation;
|
|
533
|
+
// var0 := [0, 10];
|
|
534
|
+
relation[0] = getContext().int_const("0");
|
|
535
|
+
itv[0] = IntervalValue(0, 10);
|
|
536
|
+
// var1 := var0;
|
|
537
|
+
relation[1] =
|
|
538
|
+
getContext().int_const("1") == getContext().int_const("0");
|
|
539
|
+
itv[1] = itv[0];
|
|
540
|
+
// var2 := var1 / var0;
|
|
541
|
+
relation[2] = getContext().int_const("2") ==
|
|
542
|
+
getContext().int_const("1") / getContext().int_const("0");
|
|
543
|
+
itv[2] = itv[1] / itv[0];
|
|
544
|
+
// Test extract sub vars
|
|
545
|
+
Set<u32_t> res;
|
|
546
|
+
relation.extractSubVars(relation[2], res);
|
|
547
|
+
assert(res == Set<u32_t>({0, 1, 2}) && "inconsistency occurs");
|
|
548
|
+
IntervalESBase inv = itv.sliceState(res);
|
|
549
|
+
RelationSolver rs;
|
|
550
|
+
const Z3Expr& relExpr = relation[2] && relation[1];
|
|
551
|
+
const Z3Expr& initExpr = rs.gamma_hat(inv);
|
|
552
|
+
const Z3Expr& phi = (relExpr && initExpr).simplify();
|
|
553
|
+
// IntervalExeState resRSY = rs.RSY(inv, phi);
|
|
554
|
+
outs() << "rsy done\n";
|
|
555
|
+
// IntervalExeState resBilateral = rs.bilateral(inv, phi);
|
|
556
|
+
outs() << "bilateral done\n";
|
|
557
|
+
IntervalESBase resBS = rs.BS(inv, phi);
|
|
558
|
+
outs() << "bs done\n";
|
|
559
|
+
// 0:[0,10] 1:[0,10] 2:[-00,+00]
|
|
560
|
+
// assert(resRSY == resBS && resBS == resBilateral);
|
|
561
|
+
for (auto r : resBS.getVarToVal())
|
|
562
|
+
{
|
|
563
|
+
outs() << r.first << " " << r.second << "\n";
|
|
564
|
+
}
|
|
565
|
+
// ground truth
|
|
566
|
+
IntervalESBase::VarToValMap intendedRes = {{0, IntervalValue(0, 10)},
|
|
567
|
+
{1, IntervalValue(0, 10)},
|
|
568
|
+
{2, IntervalValue(IntervalValue::minus_infinity(), IntervalValue::plus_infinity())}
|
|
569
|
+
};
|
|
570
|
+
assert(IntervalESBase::eqVarToValMap(resBS.getVarToVal(), intendedRes) && "inconsistency occurs");
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
void testsValidation()
|
|
574
|
+
{
|
|
575
|
+
SymblicAbstractionTest saTest;
|
|
576
|
+
saTest.testRelExeState1_1();
|
|
577
|
+
saTest.testRelExeState1_2();
|
|
578
|
+
|
|
579
|
+
saTest.testRelExeState2_1();
|
|
580
|
+
saTest.testRelExeState2_2();
|
|
581
|
+
saTest.testRelExeState2_3();
|
|
582
|
+
// saTest.testRelExeState2_4(); /// 10000
|
|
583
|
+
// saTest.testRelExeState2_5(); /// 100000
|
|
584
|
+
|
|
585
|
+
saTest.testRelExeState3_1();
|
|
586
|
+
saTest.testRelExeState3_2();
|
|
587
|
+
// saTest.testRelExeState3_3(); /// 10000
|
|
588
|
+
// saTest.testRelExeState3_4(); /// 100000
|
|
589
|
+
|
|
590
|
+
outs() << "start top\n";
|
|
591
|
+
saTest.testRelExeState4_1(); /// top
|
|
592
|
+
}
|
|
593
|
+
};
|
|
594
|
+
|
|
595
|
+
int main(int argc, char** argv)
|
|
596
|
+
{
|
|
597
|
+
std::vector<std::string> moduleNameVec;
|
|
598
|
+
moduleNameVec = OptionBase::parseOptions(
|
|
599
|
+
argc, argv, "Source-Sink Bug Detector", "[options] <input-bitcode...>"
|
|
600
|
+
);
|
|
601
|
+
if (SYMABS())
|
|
602
|
+
{
|
|
603
|
+
SymblicAbstractionTest saTest;
|
|
604
|
+
saTest.testsValidation();
|
|
605
|
+
}
|
|
606
|
+
return 0;
|
|
607
|
+
}
|
|
@@ -5,15 +5,16 @@ add_subdirectory(DDA)
|
|
|
5
5
|
add_subdirectory(MTA)
|
|
6
6
|
add_subdirectory(CFL)
|
|
7
7
|
add_subdirectory(LLVM2SVF)
|
|
8
|
+
add_subdirectory(AE)
|
|
8
9
|
|
|
9
10
|
set_target_properties(
|
|
10
|
-
cfl dvf svf-ex llvm2svf mta saber wpa
|
|
11
|
+
cfl dvf svf-ex llvm2svf mta saber wpa ae
|
|
11
12
|
PROPERTIES
|
|
12
13
|
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
|
13
14
|
)
|
|
14
15
|
|
|
15
16
|
install(
|
|
16
|
-
TARGETS cfl dvf svf-ex llvm2svf mta saber wpa
|
|
17
|
+
TARGETS cfl dvf svf-ex llvm2svf mta saber wpa ae
|
|
17
18
|
EXPORT SVFTargets
|
|
18
19
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
19
20
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|