svf-tools 1.0.781 → 1.0.783
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/html/CDG_8h.html +2 -2
- package/SVF-doxygen/html/html/CDG_8h_source.html +2 -2
- package/SVF-doxygen/html/html/CFBasicBlockG_8cpp_source.html +152 -90
- package/SVF-doxygen/html/html/CFBasicBlockG_8h.html +3 -1
- package/SVF-doxygen/html/html/CFBasicBlockG_8h_source.html +601 -260
- package/SVF-doxygen/html/html/ConsGNode_8h_source.html +4 -4
- package/SVF-doxygen/html/html/ExtAPI_8cpp.html +50 -50
- package/SVF-doxygen/html/html/ExtAPI_8cpp_source.html +180 -181
- package/SVF-doxygen/html/html/ExtAPI_8h.html +6 -6
- package/SVF-doxygen/html/html/ExtAPI_8h_source.html +13 -13
- package/SVF-doxygen/html/html/LLVMModule_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/LLVMModule_8h_source.html +1 -1
- package/SVF-doxygen/html/html/LLVMUtil_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SVFUtil_8h_source.html +7 -7
- package/SVF-doxygen/html/html/WTO_8h_source.html +6 -6
- package/SVF-doxygen/html/html/annotated.html +325 -333
- package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockEdge-members.html +19 -12
- package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockEdge.html +219 -30
- package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockGBuilder-members.html +4 -3
- package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockGBuilder.html +147 -39
- package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockGWTOCycle.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockGWTONode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockGraph-members.html +32 -28
- package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockGraph.html +382 -184
- package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockNode-members.html +51 -41
- package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockNode.html +1244 -159
- package/SVF-doxygen/html/html/classSVF_1_1ConstraintNode-members.html +34 -34
- package/SVF-doxygen/html/html/classSVF_1_1ConstraintNode.html +65 -25
- package/SVF-doxygen/html/html/classSVF_1_1ExtAPI-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1ExtAPI.html +107 -107
- package/SVF-doxygen/html/html/classSVF_1_1GenericEdge.html +4 -5
- package/SVF-doxygen/html/html/classSVF_1_1GenericEdge.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1GenericGraph.html +3 -4
- package/SVF-doxygen/html/html/classSVF_1_1GenericGraph.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1GenericNode.html +10 -10
- package/SVF-doxygen/html/html/classSVF_1_1GenericNode.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1LLVMModuleSet.html +1 -1
- package/SVF-doxygen/html/html/classes.html +266 -276
- package/SVF-doxygen/html/html/dir_a10fe8a299b5f0831d187a9a2e1308ef.html +0 -2
- package/SVF-doxygen/html/html/dir_fc0329f850c815763e0c5b05933e8d55.html +0 -2
- package/SVF-doxygen/html/html/files.html +19 -21
- package/SVF-doxygen/html/html/functions.html +2 -33
- package/SVF-doxygen/html/html/functions_a.html +14 -16
- package/SVF-doxygen/html/html/functions_b.html +8 -9
- package/SVF-doxygen/html/html/functions_c.html +34 -31
- package/SVF-doxygen/html/html/functions_d.html +11 -13
- package/SVF-doxygen/html/html/functions_e.html +1 -1
- package/SVF-doxygen/html/html/functions_func.html +16 -18
- package/SVF-doxygen/html/html/functions_func_b.html +2 -3
- package/SVF-doxygen/html/html/functions_func_c.html +31 -31
- package/SVF-doxygen/html/html/functions_func_d.html +10 -12
- package/SVF-doxygen/html/html/functions_func_g.html +22 -59
- package/SVF-doxygen/html/html/functions_func_h.html +9 -12
- package/SVF-doxygen/html/html/functions_func_i.html +13 -26
- package/SVF-doxygen/html/html/functions_func_o.html +9 -9
- package/SVF-doxygen/html/html/functions_func_p.html +1 -1
- package/SVF-doxygen/html/html/functions_func_r.html +15 -15
- package/SVF-doxygen/html/html/functions_func_s.html +20 -29
- package/SVF-doxygen/html/html/functions_func_t.html +0 -2
- package/SVF-doxygen/html/html/functions_func_v.html +2 -3
- package/SVF-doxygen/html/html/functions_func_~.html +0 -12
- package/SVF-doxygen/html/html/functions_g.html +23 -60
- package/SVF-doxygen/html/html/functions_h.html +9 -12
- package/SVF-doxygen/html/html/functions_i.html +16 -44
- package/SVF-doxygen/html/html/functions_n.html +6 -8
- package/SVF-doxygen/html/html/functions_o.html +23 -27
- package/SVF-doxygen/html/html/functions_p.html +8 -12
- package/SVF-doxygen/html/html/functions_r.html +17 -17
- package/SVF-doxygen/html/html/functions_s.html +16 -33
- package/SVF-doxygen/html/html/functions_t.html +5 -7
- package/SVF-doxygen/html/html/functions_type_c.html +6 -3
- package/SVF-doxygen/html/html/functions_type_e.html +1 -1
- package/SVF-doxygen/html/html/functions_type_i.html +3 -18
- package/SVF-doxygen/html/html/functions_type_n.html +0 -2
- package/SVF-doxygen/html/html/functions_type_s.html +0 -6
- package/SVF-doxygen/html/html/functions_v.html +4 -5
- package/SVF-doxygen/html/html/functions_vars.html +2 -33
- package/SVF-doxygen/html/html/functions_vars_i.html +2 -2
- package/SVF-doxygen/html/html/functions_vars_o.html +2 -2
- package/SVF-doxygen/html/html/functions_w.html +8 -8
- package/SVF-doxygen/html/html/functions_~.html +0 -12
- package/SVF-doxygen/html/html/globals_d.html +2 -2
- package/SVF-doxygen/html/html/globals_defs.html +2 -2
- package/SVF-doxygen/html/html/hierarchy.html +458 -469
- package/SVF-doxygen/html/html/namespaceSVF.html +7 -78
- package/SVF-doxygen/html/html/namespacemembers_g.html +3 -12
- package/SVF-doxygen/html/html/namespacemembers_n.html +1 -1
- package/SVF-doxygen/html/html/namespacemembers_type_g.html +0 -9
- package/SVF-doxygen/html/html/namespacemembers_type_n.html +1 -1
- package/SVF-doxygen/html/html/search/all_0.js +137 -147
- package/SVF-doxygen/html/html/search/all_1.js +484 -485
- package/SVF-doxygen/html/html/search/all_10.js +324 -324
- package/SVF-doxygen/html/html/search/all_11.js +224 -224
- package/SVF-doxygen/html/html/search/all_12.js +541 -546
- package/SVF-doxygen/html/html/search/all_13.js +190 -190
- package/SVF-doxygen/html/html/search/all_14.js +67 -67
- package/SVF-doxygen/html/html/search/all_15.js +170 -170
- package/SVF-doxygen/html/html/search/all_16.js +63 -63
- package/SVF-doxygen/html/html/search/all_17.js +1 -1
- package/SVF-doxygen/html/html/search/all_18.js +1 -1
- package/SVF-doxygen/html/html/search/all_19.js +11 -11
- package/SVF-doxygen/html/html/search/all_1a.js +172 -176
- package/SVF-doxygen/html/html/search/all_2.js +167 -167
- package/SVF-doxygen/html/html/search/all_3.js +640 -639
- package/SVF-doxygen/html/html/search/all_4.js +233 -234
- package/SVF-doxygen/html/html/search/all_5.js +121 -120
- package/SVF-doxygen/html/html/search/all_6.js +225 -225
- package/SVF-doxygen/html/html/search/all_7.js +1037 -1056
- package/SVF-doxygen/html/html/search/all_8.js +194 -195
- package/SVF-doxygen/html/html/search/all_9.js +607 -617
- package/SVF-doxygen/html/html/search/all_a.js +46 -46
- package/SVF-doxygen/html/html/search/all_b.js +26 -26
- package/SVF-doxygen/html/html/search/all_c.js +116 -116
- package/SVF-doxygen/html/html/search/all_d.js +196 -196
- package/SVF-doxygen/html/html/search/all_e.js +207 -207
- package/SVF-doxygen/html/html/search/all_f.js +116 -116
- package/SVF-doxygen/html/html/search/classes_0.js +26 -26
- package/SVF-doxygen/html/html/search/classes_1.js +9 -9
- package/SVF-doxygen/html/html/search/classes_10.js +73 -73
- package/SVF-doxygen/html/html/search/classes_11.js +15 -15
- package/SVF-doxygen/html/html/search/classes_12.js +2 -2
- package/SVF-doxygen/html/html/search/classes_13.js +10 -10
- package/SVF-doxygen/html/html/search/classes_14.js +14 -14
- package/SVF-doxygen/html/html/search/classes_15.js +1 -1
- package/SVF-doxygen/html/html/search/classes_2.js +80 -80
- package/SVF-doxygen/html/html/search/classes_3.js +37 -38
- package/SVF-doxygen/html/html/search/classes_4.js +9 -9
- package/SVF-doxygen/html/html/search/classes_5.js +28 -28
- package/SVF-doxygen/html/html/search/classes_6.js +104 -110
- package/SVF-doxygen/html/html/search/classes_7.js +33 -33
- package/SVF-doxygen/html/html/search/classes_8.js +56 -60
- package/SVF-doxygen/html/html/search/classes_9.js +1 -1
- package/SVF-doxygen/html/html/search/classes_a.js +12 -12
- package/SVF-doxygen/html/html/search/classes_b.js +29 -29
- package/SVF-doxygen/html/html/search/classes_c.js +6 -6
- package/SVF-doxygen/html/html/search/classes_d.js +18 -18
- package/SVF-doxygen/html/html/search/classes_e.js +36 -36
- package/SVF-doxygen/html/html/search/classes_f.js +25 -25
- package/SVF-doxygen/html/html/search/defines_0.js +3 -3
- package/SVF-doxygen/html/html/search/defines_1.js +2 -2
- package/SVF-doxygen/html/html/search/defines_2.js +30 -30
- package/SVF-doxygen/html/html/search/defines_3.js +21 -21
- package/SVF-doxygen/html/html/search/defines_4.js +2 -2
- package/SVF-doxygen/html/html/search/defines_5.js +4 -4
- package/SVF-doxygen/html/html/search/defines_6.js +2 -2
- package/SVF-doxygen/html/html/search/defines_7.js +5 -5
- package/SVF-doxygen/html/html/search/defines_8.js +11 -11
- package/SVF-doxygen/html/html/search/defines_9.js +9 -9
- package/SVF-doxygen/html/html/search/defines_a.js +2 -2
- package/SVF-doxygen/html/html/search/defines_b.js +1 -1
- package/SVF-doxygen/html/html/search/defines_c.js +3 -3
- package/SVF-doxygen/html/html/search/defines_d.js +2 -2
- package/SVF-doxygen/html/html/search/defines_e.js +7 -7
- package/SVF-doxygen/html/html/search/defines_f.js +3 -3
- package/SVF-doxygen/html/html/search/enums_0.js +3 -3
- package/SVF-doxygen/html/html/search/enums_1.js +2 -2
- package/SVF-doxygen/html/html/search/enums_10.js +1 -1
- package/SVF-doxygen/html/html/search/enums_11.js +1 -1
- package/SVF-doxygen/html/html/search/enums_2.js +8 -8
- package/SVF-doxygen/html/html/search/enums_3.js +1 -1
- package/SVF-doxygen/html/html/search/enums_4.js +3 -3
- package/SVF-doxygen/html/html/search/enums_5.js +1 -1
- package/SVF-doxygen/html/html/search/enums_6.js +2 -2
- package/SVF-doxygen/html/html/search/enums_7.js +2 -2
- package/SVF-doxygen/html/html/search/enums_8.js +4 -4
- package/SVF-doxygen/html/html/search/enums_9.js +1 -1
- package/SVF-doxygen/html/html/search/enums_a.js +1 -1
- package/SVF-doxygen/html/html/search/enums_b.js +7 -7
- package/SVF-doxygen/html/html/search/enums_c.js +1 -1
- package/SVF-doxygen/html/html/search/enums_d.js +4 -4
- package/SVF-doxygen/html/html/search/enums_e.js +2 -2
- package/SVF-doxygen/html/html/search/enums_f.js +4 -4
- package/SVF-doxygen/html/html/search/enumvalues_0.js +14 -14
- package/SVF-doxygen/html/html/search/enumvalues_1.js +14 -14
- package/SVF-doxygen/html/html/search/enumvalues_10.js +35 -35
- package/SVF-doxygen/html/html/search/enumvalues_11.js +3 -3
- package/SVF-doxygen/html/html/search/enumvalues_12.js +10 -10
- package/SVF-doxygen/html/html/search/enumvalues_13.js +1 -1
- package/SVF-doxygen/html/html/search/enumvalues_14.js +1 -1
- package/SVF-doxygen/html/html/search/enumvalues_15.js +3 -3
- package/SVF-doxygen/html/html/search/enumvalues_2.js +36 -36
- package/SVF-doxygen/html/html/search/enumvalues_3.js +13 -13
- package/SVF-doxygen/html/html/search/enumvalues_4.js +2 -2
- package/SVF-doxygen/html/html/search/enumvalues_5.js +47 -47
- package/SVF-doxygen/html/html/search/enumvalues_6.js +6 -6
- package/SVF-doxygen/html/html/search/enumvalues_7.js +9 -9
- package/SVF-doxygen/html/html/search/enumvalues_8.js +23 -23
- package/SVF-doxygen/html/html/search/enumvalues_9.js +6 -6
- package/SVF-doxygen/html/html/search/enumvalues_a.js +15 -15
- package/SVF-doxygen/html/html/search/enumvalues_b.js +11 -11
- package/SVF-doxygen/html/html/search/enumvalues_c.js +5 -5
- package/SVF-doxygen/html/html/search/enumvalues_d.js +18 -18
- package/SVF-doxygen/html/html/search/enumvalues_e.js +9 -9
- package/SVF-doxygen/html/html/search/enumvalues_f.js +45 -45
- package/SVF-doxygen/html/html/search/files_0.js +13 -13
- package/SVF-doxygen/html/html/search/files_1.js +7 -7
- package/SVF-doxygen/html/html/search/files_10.js +8 -8
- package/SVF-doxygen/html/html/search/files_11.js +8 -8
- package/SVF-doxygen/html/html/search/files_12.js +2 -2
- package/SVF-doxygen/html/html/search/files_2.js +53 -53
- package/SVF-doxygen/html/html/search/files_3.js +14 -14
- package/SVF-doxygen/html/html/search/files_4.js +5 -5
- package/SVF-doxygen/html/html/search/files_5.js +13 -13
- package/SVF-doxygen/html/html/search/files_6.js +9 -9
- package/SVF-doxygen/html/html/search/files_7.js +14 -16
- package/SVF-doxygen/html/html/search/files_8.js +13 -13
- package/SVF-doxygen/html/html/search/files_9.js +18 -18
- package/SVF-doxygen/html/html/search/files_a.js +3 -3
- package/SVF-doxygen/html/html/search/files_b.js +2 -2
- package/SVF-doxygen/html/html/search/files_c.js +20 -20
- package/SVF-doxygen/html/html/search/files_d.js +4 -4
- package/SVF-doxygen/html/html/search/files_e.js +62 -62
- package/SVF-doxygen/html/html/search/files_f.js +8 -8
- package/SVF-doxygen/html/html/search/functions_0.js +12 -12
- package/SVF-doxygen/html/html/search/functions_1.js +356 -357
- package/SVF-doxygen/html/html/search/functions_10.js +140 -140
- package/SVF-doxygen/html/html/search/functions_11.js +138 -138
- package/SVF-doxygen/html/html/search/functions_12.js +276 -279
- package/SVF-doxygen/html/html/search/functions_13.js +58 -58
- package/SVF-doxygen/html/html/search/functions_14.js +39 -39
- package/SVF-doxygen/html/html/search/functions_15.js +71 -71
- package/SVF-doxygen/html/html/search/functions_16.js +32 -32
- package/SVF-doxygen/html/html/search/functions_17.js +3 -3
- package/SVF-doxygen/html/html/search/functions_18.js +172 -176
- package/SVF-doxygen/html/html/search/functions_2.js +86 -86
- package/SVF-doxygen/html/html/search/functions_3.js +257 -257
- package/SVF-doxygen/html/html/search/functions_4.js +75 -75
- package/SVF-doxygen/html/html/search/functions_5.js +53 -53
- package/SVF-doxygen/html/html/search/functions_6.js +59 -59
- package/SVF-doxygen/html/html/search/functions_7.js +848 -858
- package/SVF-doxygen/html/html/search/functions_8.js +146 -147
- package/SVF-doxygen/html/html/search/functions_9.js +425 -429
- package/SVF-doxygen/html/html/search/functions_a.js +30 -30
- package/SVF-doxygen/html/html/search/functions_b.js +2 -2
- package/SVF-doxygen/html/html/search/functions_c.js +26 -26
- package/SVF-doxygen/html/html/search/functions_d.js +77 -77
- package/SVF-doxygen/html/html/search/functions_e.js +35 -35
- package/SVF-doxygen/html/html/search/functions_f.js +56 -56
- package/SVF-doxygen/html/html/search/namespaces_0.js +1 -1
- package/SVF-doxygen/html/html/search/namespaces_1.js +7 -7
- package/SVF-doxygen/html/html/search/related_0.js +2 -2
- package/SVF-doxygen/html/html/search/related_1.js +2 -2
- package/SVF-doxygen/html/html/search/related_2.js +2 -2
- package/SVF-doxygen/html/html/search/related_3.js +2 -2
- package/SVF-doxygen/html/html/search/related_4.js +2 -2
- package/SVF-doxygen/html/html/search/related_5.js +1 -1
- package/SVF-doxygen/html/html/search/related_6.js +2 -2
- package/SVF-doxygen/html/html/search/related_7.js +4 -4
- package/SVF-doxygen/html/html/search/related_8.js +2 -2
- package/SVF-doxygen/html/html/search/related_9.js +4 -4
- package/SVF-doxygen/html/html/search/related_a.js +19 -19
- package/SVF-doxygen/html/html/search/related_b.js +4 -4
- package/SVF-doxygen/html/html/search/related_c.js +1 -1
- package/SVF-doxygen/html/html/search/related_d.js +11 -11
- package/SVF-doxygen/html/html/search/related_e.js +2 -2
- package/SVF-doxygen/html/html/search/related_f.js +2 -2
- package/SVF-doxygen/html/html/search/typedefs_0.js +18 -18
- package/SVF-doxygen/html/html/search/typedefs_1.js +26 -26
- package/SVF-doxygen/html/html/search/typedefs_10.js +61 -63
- package/SVF-doxygen/html/html/search/typedefs_11.js +13 -13
- package/SVF-doxygen/html/html/search/typedefs_12.js +11 -11
- package/SVF-doxygen/html/html/search/typedefs_13.js +35 -35
- package/SVF-doxygen/html/html/search/typedefs_14.js +8 -8
- package/SVF-doxygen/html/html/search/typedefs_2.js +129 -128
- package/SVF-doxygen/html/html/search/typedefs_3.js +39 -39
- package/SVF-doxygen/html/html/search/typedefs_4.js +17 -17
- package/SVF-doxygen/html/html/search/typedefs_5.js +41 -41
- package/SVF-doxygen/html/html/search/typedefs_6.js +55 -58
- package/SVF-doxygen/html/html/search/typedefs_7.js +42 -46
- package/SVF-doxygen/html/html/search/typedefs_8.js +1 -1
- package/SVF-doxygen/html/html/search/typedefs_9.js +6 -6
- package/SVF-doxygen/html/html/search/typedefs_a.js +29 -29
- package/SVF-doxygen/html/html/search/typedefs_b.js +29 -29
- package/SVF-doxygen/html/html/search/typedefs_c.js +41 -41
- package/SVF-doxygen/html/html/search/typedefs_d.js +15 -15
- package/SVF-doxygen/html/html/search/typedefs_e.js +52 -52
- package/SVF-doxygen/html/html/search/typedefs_f.js +14 -14
- package/SVF-doxygen/html/html/search/variables_0.js +152 -162
- package/SVF-doxygen/html/html/search/variables_1.js +75 -75
- package/SVF-doxygen/html/html/search/variables_10.js +97 -97
- package/SVF-doxygen/html/html/search/variables_11.js +46 -46
- package/SVF-doxygen/html/html/search/variables_12.js +92 -92
- package/SVF-doxygen/html/html/search/variables_13.js +75 -75
- package/SVF-doxygen/html/html/search/variables_14.js +14 -14
- package/SVF-doxygen/html/html/search/variables_15.js +48 -48
- package/SVF-doxygen/html/html/search/variables_16.js +9 -9
- package/SVF-doxygen/html/html/search/variables_17.js +1 -1
- package/SVF-doxygen/html/html/search/variables_18.js +2 -2
- package/SVF-doxygen/html/html/search/variables_2.js +37 -37
- package/SVF-doxygen/html/html/search/variables_3.js +142 -142
- package/SVF-doxygen/html/html/search/variables_4.js +55 -55
- package/SVF-doxygen/html/html/search/variables_5.js +39 -39
- package/SVF-doxygen/html/html/search/variables_6.js +66 -66
- package/SVF-doxygen/html/html/search/variables_7.js +33 -33
- package/SVF-doxygen/html/html/search/variables_8.js +7 -7
- package/SVF-doxygen/html/html/search/variables_9.js +77 -77
- package/SVF-doxygen/html/html/search/variables_a.js +4 -4
- package/SVF-doxygen/html/html/search/variables_b.js +10 -10
- package/SVF-doxygen/html/html/search/variables_c.js +45 -45
- package/SVF-doxygen/html/html/search/variables_d.js +56 -56
- package/SVF-doxygen/html/html/search/variables_e.js +123 -123
- package/SVF-doxygen/html/html/search/variables_f.js +30 -30
- package/SVF-doxygen/html/html/structSVF_1_1CFBasicBlockEdge_1_1equalCFBBEdge-members.html +84 -0
- package/SVF-doxygen/html/html/structSVF_1_1CFBasicBlockEdge_1_1equalCFBBEdge.html +144 -0
- package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01SVF_1_1CFBasicBlockGraph_01_5_01_4.html +40 -40
- package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1CFBasicBlockNode_01_5_01_4_01_4.html +1 -1
- package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1CFBasicBlockGraph_01_5_01_4.html +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1CFBasicBlockNode_01_5_01_4.html +1 -1
- package/package.json +1 -1
- package/svf/include/Graphs/CFBasicBlockG.h +342 -32
- package/svf/include/Util/ExtAPI.h +2 -2
- package/svf/lib/Graphs/CFBasicBlockG.cpp +97 -36
- package/svf/lib/Util/ExtAPI.cpp +14 -15
- package/svf/include/Graphs/ICFGWrapper.h +0 -728
- package/svf/lib/Graphs/ICFGWrapper.cpp +0 -97
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
#ifndef SVF_CFBASICBLOCKG_H
|
|
31
31
|
#define SVF_CFBASICBLOCKG_H
|
|
32
32
|
#include "Util/SVFUtil.h"
|
|
33
|
-
#include "Graphs/
|
|
33
|
+
#include "Graphs/ICFG.h"
|
|
34
34
|
#include "Graphs/GenericGraph.h"
|
|
35
35
|
|
|
36
36
|
namespace SVF
|
|
@@ -43,8 +43,33 @@ typedef GenericEdge<CFBasicBlockNode> GenericCFBasicBlockEdgeTy;
|
|
|
43
43
|
class CFBasicBlockEdge : public GenericCFBasicBlockEdgeTy
|
|
44
44
|
{
|
|
45
45
|
public:
|
|
46
|
-
|
|
46
|
+
typedef struct equalCFBBEdge
|
|
47
|
+
{
|
|
48
|
+
bool
|
|
49
|
+
operator()(const CFBasicBlockEdge *lhs, const CFBasicBlockEdge *rhs) const
|
|
50
|
+
{
|
|
51
|
+
if (lhs->getSrcID() != rhs->getSrcID())
|
|
52
|
+
return lhs->getSrcID() < rhs->getSrcID();
|
|
53
|
+
else if (lhs->getDstID() != rhs->getDstID())
|
|
54
|
+
return lhs->getDstID() < rhs->getDstID();
|
|
55
|
+
else
|
|
56
|
+
return lhs->getICFGEdge() < rhs->getICFGEdge();
|
|
57
|
+
}
|
|
58
|
+
} equalICFGEdgeWrapper;
|
|
59
|
+
|
|
60
|
+
typedef OrderedSet<CFBasicBlockEdge *, equalICFGEdgeWrapper> CFBBEdgeSetTy;
|
|
61
|
+
typedef CFBBEdgeSetTy::iterator iterator;
|
|
62
|
+
typedef CFBBEdgeSetTy::const_iterator const_iterator;
|
|
63
|
+
|
|
64
|
+
private:
|
|
65
|
+
const ICFGEdge *_icfgEdge;
|
|
47
66
|
|
|
67
|
+
public:
|
|
68
|
+
CFBasicBlockEdge(CFBasicBlockNode* src, CFBasicBlockNode* dst,
|
|
69
|
+
const ICFGEdge* edge)
|
|
70
|
+
: GenericCFBasicBlockEdgeTy(src, dst, 0), _icfgEdge(edge)
|
|
71
|
+
{
|
|
72
|
+
}
|
|
48
73
|
|
|
49
74
|
friend std::ostream &operator<<(std::ostream &o, const CFBasicBlockEdge &edge)
|
|
50
75
|
{
|
|
@@ -54,20 +79,50 @@ public:
|
|
|
54
79
|
|
|
55
80
|
virtual const std::string toString() const
|
|
56
81
|
{
|
|
57
|
-
return
|
|
82
|
+
return _icfgEdge->toString();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
inline const ICFGEdge *getICFGEdge() const
|
|
86
|
+
{
|
|
87
|
+
return _icfgEdge;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
using SVF::GenericEdge<NodeType>::operator==;
|
|
91
|
+
/// Add the hash function for std::set (we also can overload operator< to implement this)
|
|
92
|
+
// and duplicated elements in the set are not inserted (binary tree comparison)
|
|
93
|
+
//@{
|
|
94
|
+
|
|
95
|
+
virtual inline bool operator==(const CFBasicBlockEdge *rhs) const
|
|
96
|
+
{
|
|
97
|
+
return (rhs->getSrcID() == this->getSrcID() && rhs->getDstID() == this->getDstID() &&
|
|
98
|
+
rhs->getICFGEdge() == this->getICFGEdge());
|
|
58
99
|
}
|
|
100
|
+
//@}
|
|
101
|
+
|
|
59
102
|
};
|
|
60
103
|
|
|
61
104
|
typedef GenericNode<CFBasicBlockNode, CFBasicBlockEdge> GenericCFBasicBlockNodeTy;
|
|
62
105
|
|
|
63
106
|
class CFBasicBlockNode : public GenericCFBasicBlockNodeTy
|
|
64
107
|
{
|
|
108
|
+
public:
|
|
109
|
+
typedef CFBasicBlockEdge::CFBBEdgeSetTy CFBBEdgeSetTy;
|
|
110
|
+
typedef CFBasicBlockEdge::CFBBEdgeSetTy ::iterator iterator;
|
|
111
|
+
typedef CFBasicBlockEdge::CFBBEdgeSetTy::const_iterator const_iterator;
|
|
112
|
+
|
|
65
113
|
private:
|
|
66
|
-
const SVFBasicBlock *_svfBasicBlock; /// Every CFBasicBlockNode holds a SVFBasicBlock
|
|
67
114
|
std::vector<const ICFGNode *> _icfgNodes; /// Every CBFGNode holds a vector of ICFGNodes
|
|
115
|
+
CFBBEdgeSetTy InEdges; ///< all incoming edge of this node
|
|
116
|
+
CFBBEdgeSetTy OutEdges; ///< all outgoing edge of this node
|
|
68
117
|
|
|
69
118
|
public:
|
|
70
|
-
CFBasicBlockNode(
|
|
119
|
+
CFBasicBlockNode(std::vector<const ICFGNode*> icfgNodes)
|
|
120
|
+
: GenericCFBasicBlockNodeTy((*icfgNodes.begin())->getId(), 0),
|
|
121
|
+
_icfgNodes(SVFUtil::move(icfgNodes))
|
|
122
|
+
{
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
CFBasicBlockNode(const SVFBasicBlock* bb);
|
|
71
126
|
|
|
72
127
|
friend std::ostream &operator<<(std::ostream &o, const CFBasicBlockNode &node)
|
|
73
128
|
{
|
|
@@ -79,17 +134,20 @@ public:
|
|
|
79
134
|
|
|
80
135
|
inline std::string getName() const
|
|
81
136
|
{
|
|
82
|
-
|
|
137
|
+
assert(!_icfgNodes.empty() && "no ICFG nodes in CFBB");
|
|
138
|
+
return (*_icfgNodes.begin())->getBB()->getName();
|
|
83
139
|
}
|
|
84
140
|
|
|
85
141
|
inline const SVFBasicBlock *getSVFBasicBlock() const
|
|
86
142
|
{
|
|
87
|
-
|
|
143
|
+
assert(!_icfgNodes.empty() && "no ICFG nodes in CFBB");
|
|
144
|
+
return (*_icfgNodes.begin())->getBB();
|
|
88
145
|
}
|
|
89
146
|
|
|
90
147
|
inline const SVFFunction *getFunction() const
|
|
91
148
|
{
|
|
92
|
-
|
|
149
|
+
assert(!_icfgNodes.empty() && "no ICFG nodes in CFBB");
|
|
150
|
+
return (*_icfgNodes.begin())->getFun();
|
|
93
151
|
}
|
|
94
152
|
|
|
95
153
|
inline std::vector<const ICFGNode *>::const_iterator begin() const
|
|
@@ -101,6 +159,187 @@ public:
|
|
|
101
159
|
{
|
|
102
160
|
return _icfgNodes.cend();
|
|
103
161
|
}
|
|
162
|
+
|
|
163
|
+
inline void removeNode(const ICFGNode* node)
|
|
164
|
+
{
|
|
165
|
+
const auto it = std::find(_icfgNodes.begin(), _icfgNodes.end(), node);
|
|
166
|
+
assert(it != _icfgNodes.end() && "icfg node not in BB?");
|
|
167
|
+
_icfgNodes.erase(it);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
inline void addNode(const ICFGNode* node)
|
|
171
|
+
{
|
|
172
|
+
_icfgNodes.push_back(node);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
inline u32_t getICFGNodeNum() const
|
|
176
|
+
{
|
|
177
|
+
return _icfgNodes.size();
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
public:
|
|
181
|
+
/// Get incoming/outgoing edge set
|
|
182
|
+
///@{
|
|
183
|
+
inline const CFBBEdgeSetTy &getOutEdges() const
|
|
184
|
+
{
|
|
185
|
+
return OutEdges;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
inline const CFBBEdgeSetTy &getInEdges() const
|
|
189
|
+
{
|
|
190
|
+
return InEdges;
|
|
191
|
+
}
|
|
192
|
+
///@}
|
|
193
|
+
|
|
194
|
+
/// Has incoming/outgoing edge set
|
|
195
|
+
//@{
|
|
196
|
+
inline bool hasIncomingEdge() const
|
|
197
|
+
{
|
|
198
|
+
return (InEdges.empty() == false);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
inline bool hasOutgoingEdge() const
|
|
202
|
+
{
|
|
203
|
+
return (OutEdges.empty() == false);
|
|
204
|
+
}
|
|
205
|
+
//@}
|
|
206
|
+
|
|
207
|
+
/// iterators
|
|
208
|
+
//@{
|
|
209
|
+
inline iterator OutEdgeBegin()
|
|
210
|
+
{
|
|
211
|
+
return OutEdges.begin();
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
inline iterator OutEdgeEnd()
|
|
215
|
+
{
|
|
216
|
+
return OutEdges.end();
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
inline iterator InEdgeBegin()
|
|
220
|
+
{
|
|
221
|
+
return InEdges.begin();
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
inline iterator InEdgeEnd()
|
|
225
|
+
{
|
|
226
|
+
return InEdges.end();
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
inline const_iterator OutEdgeBegin() const
|
|
230
|
+
{
|
|
231
|
+
return OutEdges.begin();
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
inline const_iterator OutEdgeEnd() const
|
|
235
|
+
{
|
|
236
|
+
return OutEdges.end();
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
inline const_iterator InEdgeBegin() const
|
|
240
|
+
{
|
|
241
|
+
return InEdges.begin();
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
inline const_iterator InEdgeEnd() const
|
|
245
|
+
{
|
|
246
|
+
return InEdges.end();
|
|
247
|
+
}
|
|
248
|
+
//@}
|
|
249
|
+
|
|
250
|
+
/// Iterators used for SCC detection, overwrite it in child class if necessory
|
|
251
|
+
//@{
|
|
252
|
+
virtual inline iterator directOutEdgeBegin()
|
|
253
|
+
{
|
|
254
|
+
return OutEdges.begin();
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
virtual inline iterator directOutEdgeEnd()
|
|
258
|
+
{
|
|
259
|
+
return OutEdges.end();
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
virtual inline iterator directInEdgeBegin()
|
|
263
|
+
{
|
|
264
|
+
return InEdges.begin();
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
virtual inline iterator directInEdgeEnd()
|
|
268
|
+
{
|
|
269
|
+
return InEdges.end();
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
virtual inline const_iterator directOutEdgeBegin() const
|
|
273
|
+
{
|
|
274
|
+
return OutEdges.begin();
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
virtual inline const_iterator directOutEdgeEnd() const
|
|
278
|
+
{
|
|
279
|
+
return OutEdges.end();
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
virtual inline const_iterator directInEdgeBegin() const
|
|
283
|
+
{
|
|
284
|
+
return InEdges.begin();
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
virtual inline const_iterator directInEdgeEnd() const
|
|
288
|
+
{
|
|
289
|
+
return InEdges.end();
|
|
290
|
+
}
|
|
291
|
+
//@}
|
|
292
|
+
|
|
293
|
+
/// Add incoming and outgoing edges
|
|
294
|
+
//@{
|
|
295
|
+
inline bool addIncomingEdge(CFBasicBlockEdge *inEdge)
|
|
296
|
+
{
|
|
297
|
+
return InEdges.insert(inEdge).second;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
inline bool addOutgoingEdge(CFBasicBlockEdge *outEdge)
|
|
301
|
+
{
|
|
302
|
+
return OutEdges.insert(outEdge).second;
|
|
303
|
+
}
|
|
304
|
+
//@}
|
|
305
|
+
|
|
306
|
+
/// Remove incoming and outgoing edges
|
|
307
|
+
///@{
|
|
308
|
+
inline u32_t removeIncomingEdge(CFBasicBlockEdge *edge)
|
|
309
|
+
{
|
|
310
|
+
iterator it = InEdges.find(edge);
|
|
311
|
+
assert(it != InEdges.end() && "can not find in edge in SVFG node");
|
|
312
|
+
return InEdges.erase(edge);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
inline u32_t removeOutgoingEdge(CFBasicBlockEdge *edge)
|
|
316
|
+
{
|
|
317
|
+
iterator it = OutEdges.find(edge);
|
|
318
|
+
assert(it != OutEdges.end() && "can not find out edge in SVFG node");
|
|
319
|
+
return OutEdges.erase(edge);
|
|
320
|
+
}
|
|
321
|
+
///@}
|
|
322
|
+
|
|
323
|
+
/// Find incoming and outgoing edges
|
|
324
|
+
//@{
|
|
325
|
+
inline CFBasicBlockEdge *hasIncomingEdge(CFBasicBlockEdge *edge) const
|
|
326
|
+
{
|
|
327
|
+
const_iterator it = InEdges.find(edge);
|
|
328
|
+
if (it != InEdges.end())
|
|
329
|
+
return *it;
|
|
330
|
+
else
|
|
331
|
+
return nullptr;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
inline CFBasicBlockEdge *hasOutgoingEdge(CFBasicBlockEdge *edge) const
|
|
335
|
+
{
|
|
336
|
+
const_iterator it = OutEdges.find(edge);
|
|
337
|
+
if (it != OutEdges.end())
|
|
338
|
+
return *it;
|
|
339
|
+
else
|
|
340
|
+
return nullptr;
|
|
341
|
+
}
|
|
342
|
+
//@}
|
|
104
343
|
};
|
|
105
344
|
|
|
106
345
|
typedef GenericGraph<CFBasicBlockNode, CFBasicBlockEdge> GenericCFBasicBlockGTy;
|
|
@@ -108,22 +347,14 @@ typedef GenericGraph<CFBasicBlockNode, CFBasicBlockEdge> GenericCFBasicBlockGTy;
|
|
|
108
347
|
class CFBasicBlockGraph : public GenericCFBasicBlockGTy
|
|
109
348
|
{
|
|
110
349
|
friend class CFBasicBlockGBuilder;
|
|
111
|
-
|
|
112
|
-
public:
|
|
113
|
-
typedef Map<const SVFBasicBlock *, CFBasicBlockNode *> SVFBasicBlockToCFBasicBlockNodeMap;
|
|
114
|
-
|
|
115
350
|
private:
|
|
116
|
-
SVFBasicBlockToCFBasicBlockNodeMap _bbToNode;
|
|
117
|
-
const SVFFunction *_svfFunction;
|
|
118
351
|
u32_t _totalCFBasicBlockNode{0};
|
|
119
352
|
u32_t _totalCFBasicBlockEdge{0};
|
|
353
|
+
Map<const SVFBasicBlock*, CFBasicBlockNode*> _bbToNode;
|
|
120
354
|
|
|
121
355
|
public:
|
|
122
356
|
|
|
123
|
-
CFBasicBlockGraph(
|
|
124
|
-
{
|
|
125
|
-
|
|
126
|
-
}
|
|
357
|
+
CFBasicBlockGraph() = default;
|
|
127
358
|
|
|
128
359
|
~CFBasicBlockGraph() override = default;
|
|
129
360
|
|
|
@@ -139,16 +370,31 @@ public:
|
|
|
139
370
|
return getGNode(id);
|
|
140
371
|
}
|
|
141
372
|
|
|
142
|
-
inline
|
|
373
|
+
inline bool hasCFBasicBlockNode(NodeID id) const
|
|
143
374
|
{
|
|
144
|
-
|
|
145
|
-
if (it == _bbToNode.end()) return nullptr;
|
|
146
|
-
return it->second;
|
|
375
|
+
return hasGNode(id);
|
|
147
376
|
}
|
|
148
377
|
|
|
149
|
-
inline
|
|
378
|
+
inline CFBasicBlockNode* getCFBasicBlockNode(const SVFBasicBlock* bb) const
|
|
150
379
|
{
|
|
151
|
-
|
|
380
|
+
if (bb && _bbToNode.find(bb) != _bbToNode.end())
|
|
381
|
+
{
|
|
382
|
+
return _bbToNode.at(bb);
|
|
383
|
+
}
|
|
384
|
+
else
|
|
385
|
+
{
|
|
386
|
+
return nullptr;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
inline bool hasCFBasicBlockNode(const SVFBasicBlock* bb) const
|
|
391
|
+
{
|
|
392
|
+
return bb && _bbToNode.find(bb) != _bbToNode.end();
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
bool hasCFBasicBlockEdge(CFBasicBlockNode *src, CFBasicBlockNode *dst, ICFGEdge *icfgEdge)
|
|
396
|
+
{
|
|
397
|
+
CFBasicBlockEdge edge(src, dst, icfgEdge);
|
|
152
398
|
CFBasicBlockEdge *outEdge = src->hasOutgoingEdge(&edge);
|
|
153
399
|
CFBasicBlockEdge *inEdge = dst->hasIncomingEdge(&edge);
|
|
154
400
|
if (outEdge && inEdge)
|
|
@@ -160,17 +406,79 @@ public:
|
|
|
160
406
|
return false;
|
|
161
407
|
}
|
|
162
408
|
|
|
163
|
-
|
|
409
|
+
inline bool hasCFBasicBlockEdge(CFBasicBlockNode *src, CFBasicBlockNode *dst) const
|
|
410
|
+
{
|
|
411
|
+
for (const auto &e: src->getOutEdges())
|
|
412
|
+
{
|
|
413
|
+
if (e->getDstNode() == dst)
|
|
414
|
+
return true;
|
|
415
|
+
}
|
|
416
|
+
return false;
|
|
417
|
+
}
|
|
164
418
|
|
|
165
|
-
CFBasicBlockEdge* getCFBasicBlockEdge(const
|
|
419
|
+
CFBasicBlockEdge* getCFBasicBlockEdge(const CFBasicBlockNode *src, const CFBasicBlockNode *dst, const ICFGEdge *icfgEdge);
|
|
166
420
|
|
|
167
|
-
|
|
421
|
+
std::vector<CFBasicBlockEdge*> getCFBasicBlockEdge(const CFBasicBlockNode *src, const CFBasicBlockNode *dst);
|
|
168
422
|
|
|
169
|
-
///
|
|
170
|
-
inline
|
|
423
|
+
/// Remove a ICFGEdgeWrapper
|
|
424
|
+
inline void removeCFBBEdge(CFBasicBlockEdge *edge)
|
|
425
|
+
{
|
|
426
|
+
if (edge->getDstNode()->hasIncomingEdge(edge))
|
|
427
|
+
{
|
|
428
|
+
edge->getDstNode()->removeIncomingEdge(edge);
|
|
429
|
+
}
|
|
430
|
+
if (edge->getSrcNode()->hasOutgoingEdge(edge))
|
|
431
|
+
{
|
|
432
|
+
edge->getSrcNode()->removeOutgoingEdge(edge);
|
|
433
|
+
}
|
|
434
|
+
delete edge;
|
|
435
|
+
_totalCFBasicBlockEdge--;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/// Remove a ICFGNodeWrapper
|
|
439
|
+
inline void removeCFBBNode(CFBasicBlockNode *node)
|
|
440
|
+
{
|
|
441
|
+
std::set<CFBasicBlockEdge *> temp;
|
|
442
|
+
for (CFBasicBlockEdge *e: node->getInEdges())
|
|
443
|
+
temp.insert(e);
|
|
444
|
+
for (CFBasicBlockEdge *e: node->getOutEdges())
|
|
445
|
+
temp.insert(e);
|
|
446
|
+
for (CFBasicBlockEdge *e: temp)
|
|
447
|
+
{
|
|
448
|
+
removeCFBBEdge(e);
|
|
449
|
+
}
|
|
450
|
+
removeGNode(node);
|
|
451
|
+
_totalCFBasicBlockNode--;
|
|
452
|
+
}
|
|
171
453
|
|
|
172
|
-
inline const CFBasicBlockEdge *getOrAddCFBasicBlockEdge(CFBasicBlockNode *src, CFBasicBlockNode *dst);
|
|
173
454
|
|
|
455
|
+
/// Remove node from nodeID
|
|
456
|
+
inline bool removeCFBBNode(NodeID id)
|
|
457
|
+
{
|
|
458
|
+
if (hasGNode(id))
|
|
459
|
+
{
|
|
460
|
+
removeCFBBNode(getGNode(id));
|
|
461
|
+
return true;
|
|
462
|
+
}
|
|
463
|
+
return false;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/// Add ICFGEdgeWrapper
|
|
467
|
+
inline bool addCFBBEdge(CFBasicBlockEdge *edge)
|
|
468
|
+
{
|
|
469
|
+
bool added1 = edge->getDstNode()->addIncomingEdge(edge);
|
|
470
|
+
bool added2 = edge->getSrcNode()->addOutgoingEdge(edge);
|
|
471
|
+
assert(added1 && added2 && "edge not added??");
|
|
472
|
+
_totalCFBasicBlockEdge++;
|
|
473
|
+
return true;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/// Add a ICFGNodeWrapper
|
|
477
|
+
virtual inline void addCFBBNode(CFBasicBlockNode *node)
|
|
478
|
+
{
|
|
479
|
+
addGNode(node->getId(), node);
|
|
480
|
+
_totalCFBasicBlockNode++;
|
|
481
|
+
}
|
|
174
482
|
};
|
|
175
483
|
|
|
176
484
|
class CFBasicBlockGBuilder
|
|
@@ -180,9 +488,11 @@ private:
|
|
|
180
488
|
CFBasicBlockGraph* _CFBasicBlockG;
|
|
181
489
|
|
|
182
490
|
public:
|
|
183
|
-
CFBasicBlockGBuilder(
|
|
491
|
+
CFBasicBlockGBuilder() : _CFBasicBlockG() {}
|
|
492
|
+
|
|
493
|
+
virtual void build(SVFModule* module);
|
|
184
494
|
|
|
185
|
-
void build();
|
|
495
|
+
virtual void build(ICFG* icfg);
|
|
186
496
|
|
|
187
497
|
inline CFBasicBlockGraph* getCFBasicBlockGraph()
|
|
188
498
|
{
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
|
|
39
39
|
/// For a more detailed explanation of how External APIs are handled in SVF, please refer to the SVF Wiki: https://github.com/SVF-tools/SVF/wiki/Handling-External-APIs-with-extapi.c
|
|
40
40
|
|
|
41
|
-
#define
|
|
41
|
+
#define DEFAULT_EXTAPI_BC_PATH "/svf-llvm/extapi.bc" // Default path to extapi.bc through the SVF build method(e.g. source ./build.sh)
|
|
42
42
|
|
|
43
43
|
namespace SVF
|
|
44
44
|
{
|
|
@@ -61,7 +61,7 @@ public:
|
|
|
61
61
|
static void destory();
|
|
62
62
|
|
|
63
63
|
// Set extapi.bc file path
|
|
64
|
-
static
|
|
64
|
+
static bool setExtBcPath(const std::string& path);
|
|
65
65
|
|
|
66
66
|
// Get extapi.bc file path
|
|
67
67
|
std::string getExtBcPath();
|
|
@@ -32,13 +32,18 @@
|
|
|
32
32
|
|
|
33
33
|
namespace SVF
|
|
34
34
|
{
|
|
35
|
-
CFBasicBlockNode::CFBasicBlockNode(
|
|
36
|
-
|
|
35
|
+
CFBasicBlockNode::CFBasicBlockNode(const SVFBasicBlock* svfBasicBlock)
|
|
36
|
+
: GenericCFBasicBlockNodeTy(
|
|
37
|
+
PAG::getPAG()
|
|
38
|
+
->getICFG()
|
|
39
|
+
->getICFGNode(*svfBasicBlock->getInstructionList().begin())
|
|
40
|
+
->getId(),
|
|
41
|
+
0)
|
|
37
42
|
{
|
|
38
43
|
for (auto it = svfBasicBlock->begin(); it != svfBasicBlock->end(); ++it)
|
|
39
44
|
{
|
|
40
|
-
const SVFInstruction
|
|
41
|
-
ICFGNode
|
|
45
|
+
const SVFInstruction* ins = *it;
|
|
46
|
+
ICFGNode* icfgNode = PAG::getPAG()->getICFG()->getICFGNode(ins);
|
|
42
47
|
_icfgNodes.push_back(icfgNode);
|
|
43
48
|
}
|
|
44
49
|
}
|
|
@@ -47,7 +52,7 @@ const std::string CFBasicBlockNode::toString() const
|
|
|
47
52
|
{
|
|
48
53
|
std::string rawStr;
|
|
49
54
|
std::stringstream stringstream(rawStr);
|
|
50
|
-
stringstream << "Block Name: " <<
|
|
55
|
+
stringstream << "Block Name: " << getName() << "\n";
|
|
51
56
|
for (const auto &icfgNode: _icfgNodes)
|
|
52
57
|
{
|
|
53
58
|
stringstream << icfgNode->toString() << "\n";
|
|
@@ -55,19 +60,14 @@ const std::string CFBasicBlockNode::toString() const
|
|
|
55
60
|
return stringstream.str();
|
|
56
61
|
}
|
|
57
62
|
|
|
58
|
-
CFBasicBlockEdge* CFBasicBlockGraph::getCFBasicBlockEdge(const
|
|
59
|
-
{
|
|
60
|
-
return getCFBasicBlockEdge(getCFBasicBlockNode(src), getCFBasicBlockNode(dst));
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
CFBasicBlockEdge* CFBasicBlockGraph::getCFBasicBlockEdge(const CFBasicBlockNode *src, const CFBasicBlockNode *dst)
|
|
63
|
+
CFBasicBlockEdge* CFBasicBlockGraph::getCFBasicBlockEdge(const CFBasicBlockNode *src, const CFBasicBlockNode *dst, const ICFGEdge* icfgEdge)
|
|
64
64
|
{
|
|
65
65
|
CFBasicBlockEdge *edge = nullptr;
|
|
66
66
|
size_t counter = 0;
|
|
67
67
|
for (auto iter = src->OutEdgeBegin();
|
|
68
68
|
iter != src->OutEdgeEnd(); ++iter)
|
|
69
69
|
{
|
|
70
|
-
if ((*iter)->getDstID() == dst->getId())
|
|
70
|
+
if ((*iter)->getDstID() == dst->getId() && (*iter)->getICFGEdge() == icfgEdge)
|
|
71
71
|
{
|
|
72
72
|
counter++;
|
|
73
73
|
edge = (*iter);
|
|
@@ -77,42 +77,103 @@ CFBasicBlockEdge* CFBasicBlockGraph::getCFBasicBlockEdge(const CFBasicBlockNode
|
|
|
77
77
|
return edge;
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
-
const CFBasicBlockNode*
|
|
80
|
+
std::vector<CFBasicBlockEdge*> CFBasicBlockGraph::getCFBasicBlockEdge(const CFBasicBlockNode *src, const CFBasicBlockNode *dst)
|
|
81
81
|
{
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
82
|
+
std::vector<CFBasicBlockEdge*> edges;
|
|
83
|
+
for (auto iter = src->OutEdgeBegin();
|
|
84
|
+
iter != src->OutEdgeEnd(); ++iter)
|
|
85
|
+
{
|
|
86
|
+
if ((*iter)->getDstID() == dst->getId())
|
|
87
|
+
{
|
|
88
|
+
edges.push_back(*iter);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return SVFUtil::move(edges);
|
|
88
92
|
}
|
|
89
93
|
|
|
90
|
-
|
|
94
|
+
void CFBasicBlockGBuilder::build(SVFModule* module)
|
|
91
95
|
{
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
96
|
+
_CFBasicBlockG = new CFBasicBlockGraph();
|
|
97
|
+
Map<const SVFBasicBlock*, CFBasicBlockNode*> bbToNode;
|
|
98
|
+
for (const auto& func : *module)
|
|
99
|
+
{
|
|
100
|
+
for (const auto& bb : *func)
|
|
101
|
+
{
|
|
102
|
+
CFBasicBlockNode* pNode = new CFBasicBlockNode(bb);
|
|
103
|
+
bbToNode[bb] = pNode;
|
|
104
|
+
_CFBasicBlockG->addCFBBNode(pNode);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
for (const auto& func : *module)
|
|
109
|
+
{
|
|
110
|
+
for (const auto& bb : *func)
|
|
111
|
+
{
|
|
112
|
+
for (const auto &succ: bb->getSuccessors())
|
|
113
|
+
{
|
|
114
|
+
ICFG *icfg = PAG::getPAG()->getICFG();
|
|
115
|
+
const ICFGNode *pred = icfg->getICFGNode(bb->getTerminator());
|
|
116
|
+
const ICFGEdge *edge = nullptr;
|
|
117
|
+
for (const auto &inst: succ->getInstructionList())
|
|
118
|
+
{
|
|
119
|
+
if (const ICFGEdge *e = icfg->getICFGEdge(pred, icfg->getICFGNode(inst), ICFGEdge::ICFGEdgeK::IntraCF))
|
|
120
|
+
{
|
|
121
|
+
edge = e;
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (SVFUtil::isa<IntraCFGEdge>(edge))
|
|
126
|
+
{
|
|
127
|
+
CFBasicBlockEdge *pEdge = new CFBasicBlockEdge(bbToNode[bb], bbToNode[succ], edge);
|
|
128
|
+
_CFBasicBlockG->addCFBBEdge(pEdge);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
_CFBasicBlockG->_bbToNode = bbToNode;
|
|
101
134
|
}
|
|
102
135
|
|
|
103
|
-
void CFBasicBlockGBuilder::build()
|
|
136
|
+
void CFBasicBlockGBuilder::build(ICFG* icfg)
|
|
104
137
|
{
|
|
105
|
-
|
|
138
|
+
_CFBasicBlockG = new CFBasicBlockGraph();
|
|
139
|
+
Map<const SVFBasicBlock*, CFBasicBlockNode*> bbToNode;
|
|
140
|
+
for (const auto& node : *icfg)
|
|
106
141
|
{
|
|
107
|
-
|
|
142
|
+
CFBasicBlockNode* pNode = nullptr;
|
|
143
|
+
if (const SVFBasicBlock* bb = node.second->getBB())
|
|
144
|
+
{
|
|
145
|
+
if (bbToNode.find(bb) == bbToNode.end())
|
|
146
|
+
{
|
|
147
|
+
pNode = new CFBasicBlockNode({node.second});
|
|
148
|
+
bbToNode[node.second->getBB()] = pNode;
|
|
149
|
+
_CFBasicBlockG->addCFBBNode(pNode);
|
|
150
|
+
}
|
|
151
|
+
else
|
|
152
|
+
{
|
|
153
|
+
pNode = bbToNode[node.second->getBB()];
|
|
154
|
+
pNode->addNode(node.second);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
108
157
|
}
|
|
109
|
-
|
|
158
|
+
|
|
159
|
+
for (const auto& node : *icfg)
|
|
110
160
|
{
|
|
111
|
-
for (const auto &succ:
|
|
161
|
+
for (const auto &succ: node.second->getOutEdges())
|
|
112
162
|
{
|
|
113
|
-
|
|
114
|
-
|
|
163
|
+
const SVFFunction* node_fun = node.second->getFun();
|
|
164
|
+
const SVFFunction* succ_fun = succ->getDstNode()->getFun();
|
|
165
|
+
const SVFBasicBlock* node_bb = node.second->getBB();
|
|
166
|
+
const SVFBasicBlock* succ_bb = succ->getDstNode()->getBB();
|
|
167
|
+
if (node_fun == succ_fun)
|
|
168
|
+
{
|
|
169
|
+
if (node_bb != succ_bb)
|
|
170
|
+
{
|
|
171
|
+
CFBasicBlockEdge *pEdge = new CFBasicBlockEdge(bbToNode[node_bb], bbToNode[succ_bb], succ);
|
|
172
|
+
_CFBasicBlockG->addCFBBEdge(pEdge);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
115
175
|
}
|
|
116
176
|
}
|
|
177
|
+
_CFBasicBlockG->_bbToNode = bbToNode;
|
|
117
178
|
}
|
|
118
179
|
}
|