svf-tools 1.0.472 → 1.0.475
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/AndersenSFR_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/AndersenStat_8cpp_source.html +8 -7
- package/SVF-doxygen/html/html/Andersen_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/Andersen_8h_source.html +1 -1
- package/SVF-doxygen/html/html/CFLAlias_8h_source.html +2 -2
- package/SVF-doxygen/html/html/CHGBuilder_8cpp.html +2 -2
- package/SVF-doxygen/html/html/CHGBuilder_8cpp_source.html +20 -19
- package/SVF-doxygen/html/html/CHGBuilder_8h_source.html +15 -15
- package/SVF-doxygen/html/html/CPPUtil_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/Casting_8h_source.html +1 -1
- package/SVF-doxygen/html/html/ConsG_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/ConsG_8h_source.html +1 -1
- package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/ContextDDA_8h_source.html +1 -1
- package/SVF-doxygen/html/html/DDAClient_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/DDAPass_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/DDAStat_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/DDAVFSolver_8h_source.html +4 -4
- package/SVF-doxygen/html/html/ExeState_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/FlowDDA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/FlowDDA_8h_source.html +2 -2
- package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +11 -10
- package/SVF-doxygen/html/html/FlowSensitiveTBHC_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/Graph2Json_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/ICFGBuilder_8cpp_source.html +11 -10
- package/SVF-doxygen/html/html/ICFGBuilder_8h_source.html +7 -7
- package/SVF-doxygen/html/html/ICFG_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/IRGraph_8h_source.html +3 -3
- package/SVF-doxygen/html/html/LLVMUtil_8cpp_source.html +24 -24
- package/SVF-doxygen/html/html/LLVMUtil_8h.html +111 -111
- package/SVF-doxygen/html/html/LLVMUtil_8h_source.html +41 -40
- package/SVF-doxygen/html/html/LeakChecker_8cpp_source.html +11 -10
- package/SVF-doxygen/html/html/LeakChecker_8h_source.html +8 -8
- package/SVF-doxygen/html/html/LocationSet_8cpp_source.html +14 -13
- package/SVF-doxygen/html/html/LocationSet_8h_source.html +9 -9
- package/SVF-doxygen/html/html/LockAnalysis_8cpp_source.html +31 -30
- package/SVF-doxygen/html/html/LockAnalysis_8h_source.html +23 -23
- package/SVF-doxygen/html/html/MHP_8h_source.html +2 -2
- package/SVF-doxygen/html/html/MSSAMuChi_8h_source.html +1 -1
- package/SVF-doxygen/html/html/MTA_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/MemPartition_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/MemRegion_8cpp_source.html +35 -34
- package/SVF-doxygen/html/html/MemSSA_8cpp_source.html +28 -27
- package/SVF-doxygen/html/html/MemSSA_8h_source.html +19 -19
- package/SVF-doxygen/html/html/PTAStat_8cpp_source.html +14 -14
- package/SVF-doxygen/html/html/PathCondAllocator_8cpp_source.html +28 -27
- package/SVF-doxygen/html/html/PathCondAllocator_8h_source.html +23 -23
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +2 -2
- package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +27 -26
- package/SVF-doxygen/html/html/PointerAnalysis_8h_source.html +24 -24
- package/SVF-doxygen/html/html/ProgSlice_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/ProgSlice_8h_source.html +3 -3
- package/SVF-doxygen/html/html/SVFBasicTypes_8h_source.html +1 -1
- package/SVF-doxygen/html/html/SVFGBuilder_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/SVFGStat_8cpp_source.html +7 -7
- package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +18 -17
- package/SVF-doxygen/html/html/SVFIRBuilder_8h_source.html +43 -43
- package/SVF-doxygen/html/html/SVFIR_8cpp_source.html +12 -12
- package/SVF-doxygen/html/html/SVFIR_8h_source.html +9 -9
- package/SVF-doxygen/html/html/SVFModule_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/SVFStatements_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SVFStatements_8h_source.html +43 -43
- package/SVF-doxygen/html/html/SVFVariables_8h_source.html +3 -3
- package/SVF-doxygen/html/html/SaberAnnotator_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SaberAnnotator_8h_source.html +1 -1
- package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/SrcSnkDDA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SymbolTableBuilder_8cpp_source.html +39 -37
- package/SVF-doxygen/html/html/SymbolTableBuilder_8h_source.html +16 -15
- package/SVF-doxygen/html/html/SymbolTableInfo_8cpp_source.html +58 -57
- package/SVF-doxygen/html/html/SymbolTableInfo_8h_source.html +24 -24
- package/SVF-doxygen/html/html/TCT_8h_source.html +2 -2
- package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/TypeBasedHeapCloning_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/VFGNode_8h_source.html +5 -5
- package/SVF-doxygen/html/html/VFG_8cpp_source.html +7 -7
- package/SVF-doxygen/html/html/VFG_8h_source.html +6 -6
- package/SVF-doxygen/html/html/VersionedFlowSensitiveStat_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/WPAPass_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/WPAStat_8h_source.html +5 -5
- package/SVF-doxygen/html/html/cfl_8cpp.html +3 -3
- package/SVF-doxygen/html/html/cfl_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1AndersenStat.html +14 -14
- package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1BinaryOPStmt.html +17 -15
- package/SVF-doxygen/html/html/classSVF_1_1BranchStmt.html +32 -32
- package/SVF-doxygen/html/html/classSVF_1_1BranchVFGNode.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1CFLAlias.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1CHGBuilder.html +48 -48
- package/SVF-doxygen/html/html/classSVF_1_1CmpStmt.html +6 -4
- package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1ConstraintGraph.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1DDAPass.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1DDAStat.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1DDAVFSolver.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1DistinctMRG.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ExeState.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1FSMPTA.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1FlowDDA.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +23 -23
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1ForkJoinAnalysis.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1FunExitICFGNode.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1FunptrDDAClient.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1GepObjVar.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1GepStmt.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ICFGBuilder.html +23 -23
- package/SVF-doxygen/html/html/classSVF_1_1ICFGPrinter.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1IRGraph.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1IntraDisjointMRG.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1LeakChecker.html +22 -22
- package/SVF-doxygen/html/html/classSVF_1_1LocationSet.html +28 -28
- package/SVF-doxygen/html/html/classSVF_1_1LockAnalysis.html +78 -78
- package/SVF-doxygen/html/html/classSVF_1_1MRGenerator.html +100 -100
- package/SVF-doxygen/html/html/classSVF_1_1MTA.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1MTAAnnotator.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1MemObj.html +54 -54
- package/SVF-doxygen/html/html/classSVF_1_1MemSSA.html +56 -56
- package/SVF-doxygen/html/html/classSVF_1_1MemSSAStat.html +7 -7
- package/SVF-doxygen/html/html/classSVF_1_1ObjTypeInfo.html +8 -8
- package/SVF-doxygen/html/html/classSVF_1_1ObjVar.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1PTAStat.html +15 -15
- package/SVF-doxygen/html/html/classSVF_1_1PathCondAllocator.html +74 -74
- package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +59 -59
- package/SVF-doxygen/html/html/classSVF_1_1ProgSlice.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1RaceValidator.html +7 -7
- package/SVF-doxygen/html/html/classSVF_1_1SVFGBuilder.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1SVFIR.html +14 -14
- package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +150 -150
- package/SVF-doxygen/html/html/classSVF_1_1SVFModule.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SelectStmt.html +2 -1
- package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1StInfo.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder-members.html +14 -13
- package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder.html +111 -85
- package/SVF-doxygen/html/html/classSVF_1_1SymbolTableInfo.html +65 -65
- package/SVF-doxygen/html/html/classSVF_1_1TDForkPE.html +9 -9
- package/SVF-doxygen/html/html/classSVF_1_1TDJoinPE.html +9 -9
- package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1TypeBasedHeapCloning.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1UnaryOPStmt.html +20 -20
- package/SVF-doxygen/html/html/classSVF_1_1VFG.html +8 -8
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitiveStat.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1WPAPass.html +4 -4
- package/SVF-doxygen/html/html/dda_8cpp.html +2 -2
- package/SVF-doxygen/html/html/dda_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/functions_c.html +21 -16
- package/SVF-doxygen/html/html/functions_func_c.html +16 -13
- package/SVF-doxygen/html/html/functions_l.html +3 -3
- package/SVF-doxygen/html/html/functions_o.html +16 -16
- package/SVF-doxygen/html/html/functions_p.html +7 -13
- package/SVF-doxygen/html/html/functions_s.html +7 -9
- package/SVF-doxygen/html/html/functions_t.html +4 -4
- package/SVF-doxygen/html/html/functions_v.html +3 -3
- package/SVF-doxygen/html/html/mta_8cpp.html +2 -2
- package/SVF-doxygen/html/html/mta_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/namespaceSVF.html +4 -2
- package/SVF-doxygen/html/html/namespaceSVF_1_1LLVMUtil.html +1452 -0
- package/SVF-doxygen/html/html/namespaceSVF_1_1SVFUtil.html +41 -1409
- package/SVF-doxygen/html/html/namespaceSVF_1_1cppUtil.html +4 -4
- package/SVF-doxygen/html/html/namespacemembers.html +3 -3
- package/SVF-doxygen/html/html/namespacemembers_f.html +1 -1
- package/SVF-doxygen/html/html/namespacemembers_func.html +39 -39
- package/SVF-doxygen/html/html/namespacemembers_g.html +14 -14
- package/SVF-doxygen/html/html/namespacemembers_i.html +18 -18
- package/SVF-doxygen/html/html/namespacemembers_p.html +1 -1
- package/SVF-doxygen/html/html/namespacemembers_s.html +2 -2
- package/SVF-doxygen/html/html/namespaces.html +2 -1
- package/SVF-doxygen/html/html/saber_8cpp.html +2 -2
- package/SVF-doxygen/html/html/saber_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/search/all_1.js +3 -3
- package/SVF-doxygen/html/html/search/all_10.js +5 -5
- package/SVF-doxygen/html/html/search/all_12.js +1 -1
- package/SVF-doxygen/html/html/search/all_13.js +10 -9
- package/SVF-doxygen/html/html/search/all_14.js +2 -2
- package/SVF-doxygen/html/html/search/all_15.js +1 -1
- package/SVF-doxygen/html/html/search/all_16.js +2 -2
- package/SVF-doxygen/html/html/search/all_3.js +1 -0
- package/SVF-doxygen/html/html/search/all_6.js +1 -1
- package/SVF-doxygen/html/html/search/all_7.js +14 -14
- package/SVF-doxygen/html/html/search/all_9.js +18 -18
- package/SVF-doxygen/html/html/search/all_c.js +2 -2
- package/SVF-doxygen/html/html/search/all_e.js +3 -3
- package/SVF-doxygen/html/html/search/all_f.js +4 -4
- package/SVF-doxygen/html/html/search/functions_0.js +3 -3
- package/SVF-doxygen/html/html/search/functions_11.js +3 -3
- package/SVF-doxygen/html/html/search/functions_2.js +1 -0
- package/SVF-doxygen/html/html/search/functions_5.js +1 -1
- package/SVF-doxygen/html/html/search/functions_6.js +14 -14
- package/SVF-doxygen/html/html/search/functions_8.js +18 -18
- package/SVF-doxygen/html/html/search/functions_f.js +1 -1
- package/SVF-doxygen/html/html/search/namespaces_1.js +1 -0
- package/SVF-doxygen/html/html/search/variables_14.js +1 -1
- package/SVF-doxygen/html/html/search/variables_15.js +1 -1
- package/SVF-doxygen/html/html/search/variables_e.js +3 -3
- package/SVF-doxygen/html/html/svf-ex_8cpp.html +3 -3
- package/SVF-doxygen/html/html/svf-ex_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/wpa_8cpp.html +2 -2
- package/SVF-doxygen/html/html/wpa_8cpp_source.html +2 -2
- package/include/MTA/MHP.h +1 -1
- package/include/MemoryModel/SVFStatements.h +5 -3
- package/include/SVF-FE/LLVMUtil.h +7 -7
- package/include/SVF-FE/SymbolTableBuilder.h +2 -0
- package/lib/Graphs/ICFG.cpp +2 -2
- package/lib/MSSA/MemRegion.cpp +1 -0
- package/lib/MSSA/MemSSA.cpp +1 -0
- package/lib/MTA/LockAnalysis.cpp +1 -0
- package/lib/MemoryModel/LocationSet.cpp +1 -0
- package/lib/MemoryModel/PointerAnalysis.cpp +1 -0
- package/lib/MemoryModel/SVFIR.cpp +1 -1
- package/lib/MemoryModel/SymbolTableInfo.cpp +1 -0
- package/lib/SABER/LeakChecker.cpp +1 -0
- package/lib/SABER/PathCondAllocator.cpp +1 -0
- package/lib/SVF-FE/CHGBuilder.cpp +1 -0
- package/lib/SVF-FE/CPPUtil.cpp +2 -2
- package/lib/SVF-FE/ICFGBuilder.cpp +1 -0
- package/lib/SVF-FE/LLVMUtil.cpp +32 -32
- package/lib/SVF-FE/SVFIRBuilder.cpp +2 -1
- package/lib/SVF-FE/SymbolTableBuilder.cpp +22 -16
- package/lib/WPA/AndersenStat.cpp +1 -0
- package/lib/WPA/FlowSensitiveStat.cpp +1 -0
- package/package.json +1 -1
- package/tools/CFL/cfl.cpp +1 -1
- package/tools/DDA/dda.cpp +1 -1
- package/tools/Example/svf-ex.cpp +1 -1
- package/tools/MTA/mta.cpp +1 -1
- package/tools/SABER/saber.cpp +1 -1
- package/tools/WPA/wpa.cpp +1 -1
package/lib/SVF-FE/CPPUtil.cpp
CHANGED
|
@@ -234,7 +234,7 @@ bool cppUtil::isLoadVtblInst(const LoadInst *loadInst)
|
|
|
234
234
|
for (u32_t i = 0; i < 3; ++i)
|
|
235
235
|
{
|
|
236
236
|
if (const PointerType *ptrTy = SVFUtil::dyn_cast<PointerType>(elemTy))
|
|
237
|
-
elemTy =
|
|
237
|
+
elemTy = LLVMUtil::getPtrElementType(ptrTy);
|
|
238
238
|
else
|
|
239
239
|
return false;
|
|
240
240
|
}
|
|
@@ -420,7 +420,7 @@ string cppUtil::getClassNameFromType(const Type *ty)
|
|
|
420
420
|
string className = "";
|
|
421
421
|
if (const PointerType *ptrType = SVFUtil::dyn_cast<PointerType>(ty))
|
|
422
422
|
{
|
|
423
|
-
const Type *elemType =
|
|
423
|
+
const Type *elemType = LLVMUtil::getPtrElementType(ptrType);
|
|
424
424
|
if (SVFUtil::isa<StructType>(elemType) &&
|
|
425
425
|
!((SVFUtil::cast<StructType>(elemType))->isLiteral()))
|
|
426
426
|
{
|
package/lib/SVF-FE/LLVMUtil.cpp
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
//===----------------------------------------------------------------------===//
|
|
22
22
|
|
|
23
23
|
/*
|
|
24
|
-
*
|
|
24
|
+
* LLVMUtil.cpp
|
|
25
25
|
*
|
|
26
26
|
* Created on: Apr 11, 2013
|
|
27
27
|
* Author: Yulei Sui
|
|
@@ -39,7 +39,7 @@ using namespace SVF;
|
|
|
39
39
|
* 3) stack
|
|
40
40
|
* 4) heap
|
|
41
41
|
*/
|
|
42
|
-
bool
|
|
42
|
+
bool LLVMUtil::isObject(const Value * ref)
|
|
43
43
|
{
|
|
44
44
|
bool createobj = false;
|
|
45
45
|
if (SVFUtil::isa<Instruction>(ref) && SVFUtil::isStaticExtCall(SVFUtil::cast<Instruction>(ref)) )
|
|
@@ -57,7 +57,7 @@ bool SVFUtil::isObject(const Value * ref)
|
|
|
57
57
|
/*!
|
|
58
58
|
* Check whether this value points-to a constant object
|
|
59
59
|
*/
|
|
60
|
-
bool
|
|
60
|
+
bool LLVMUtil::isConstantObjSym(const Value *val)
|
|
61
61
|
{
|
|
62
62
|
if (const GlobalVariable* v = SVFUtil::dyn_cast<GlobalVariable>(val))
|
|
63
63
|
{
|
|
@@ -91,7 +91,7 @@ bool SVFUtil::isConstantObjSym(const Value *val)
|
|
|
91
91
|
/*!
|
|
92
92
|
* Return reachable bbs from function entry
|
|
93
93
|
*/
|
|
94
|
-
void
|
|
94
|
+
void LLVMUtil::getFunReachableBBs (const Function * fun, DominatorTree* dt, std::vector<const BasicBlock*> &reachableBBs)
|
|
95
95
|
{
|
|
96
96
|
Set<const BasicBlock*> visited;
|
|
97
97
|
std::vector<const BasicBlock*> bbVec;
|
|
@@ -120,7 +120,7 @@ void SVFUtil::getFunReachableBBs (const Function * fun, DominatorTree* dt, std::
|
|
|
120
120
|
/*!
|
|
121
121
|
* Return true if the function has a return instruction reachable from function entry
|
|
122
122
|
*/
|
|
123
|
-
bool
|
|
123
|
+
bool LLVMUtil::functionDoesNotRet (const Function * fun)
|
|
124
124
|
{
|
|
125
125
|
|
|
126
126
|
std::vector<const BasicBlock*> bbVec;
|
|
@@ -157,11 +157,11 @@ bool SVFUtil::functionDoesNotRet (const Function * fun)
|
|
|
157
157
|
/*!
|
|
158
158
|
* Return true if this is a function without any possible caller
|
|
159
159
|
*/
|
|
160
|
-
bool
|
|
160
|
+
bool LLVMUtil::isDeadFunction (const Function * fun)
|
|
161
161
|
{
|
|
162
162
|
if(fun->hasAddressTaken())
|
|
163
163
|
return false;
|
|
164
|
-
if(isProgEntryFunction(fun))
|
|
164
|
+
if(SVFUtil::isProgEntryFunction(fun))
|
|
165
165
|
return false;
|
|
166
166
|
for (Value::const_user_iterator i = fun->user_begin(), e = fun->user_end(); i != e; ++i)
|
|
167
167
|
{
|
|
@@ -190,7 +190,7 @@ bool SVFUtil::isDeadFunction (const Function * fun)
|
|
|
190
190
|
/*!
|
|
191
191
|
* Return true if this is a value in a dead function (function without any caller)
|
|
192
192
|
*/
|
|
193
|
-
bool
|
|
193
|
+
bool LLVMUtil::isPtrInDeadFunction (const Value * value)
|
|
194
194
|
{
|
|
195
195
|
if(const Instruction* inst = SVFUtil::dyn_cast<Instruction>(value))
|
|
196
196
|
{
|
|
@@ -208,7 +208,7 @@ bool SVFUtil::isPtrInDeadFunction (const Value * value)
|
|
|
208
208
|
/*!
|
|
209
209
|
* Strip constant casts
|
|
210
210
|
*/
|
|
211
|
-
const Value *
|
|
211
|
+
const Value * LLVMUtil::stripConstantCasts(const Value *val)
|
|
212
212
|
{
|
|
213
213
|
if (SVFUtil::isa<GlobalValue>(val) || isInt2PtrConstantExpr(val))
|
|
214
214
|
return val;
|
|
@@ -223,7 +223,7 @@ const Value * SVFUtil::stripConstantCasts(const Value *val)
|
|
|
223
223
|
/*!
|
|
224
224
|
* Strip all casts
|
|
225
225
|
*/
|
|
226
|
-
const Value *
|
|
226
|
+
const Value * LLVMUtil::stripAllCasts(const Value *val)
|
|
227
227
|
{
|
|
228
228
|
while (true)
|
|
229
229
|
{
|
|
@@ -247,12 +247,12 @@ const Value * SVFUtil::stripAllCasts(const Value *val)
|
|
|
247
247
|
}
|
|
248
248
|
|
|
249
249
|
/// Get the next instructions following control flow
|
|
250
|
-
void
|
|
250
|
+
void LLVMUtil::getNextInsts(const Instruction* curInst, std::vector<const Instruction*>& instList)
|
|
251
251
|
{
|
|
252
252
|
if (!curInst->isTerminator())
|
|
253
253
|
{
|
|
254
254
|
const Instruction* nextInst = curInst->getNextNode();
|
|
255
|
-
if (isIntrinsicInst(nextInst))
|
|
255
|
+
if (SVFUtil::isIntrinsicInst(nextInst))
|
|
256
256
|
getNextInsts(nextInst, instList);
|
|
257
257
|
else
|
|
258
258
|
instList.push_back(nextInst);
|
|
@@ -264,7 +264,7 @@ void SVFUtil::getNextInsts(const Instruction* curInst, std::vector<const Instruc
|
|
|
264
264
|
for (succ_const_iterator it = succ_begin(BB), ie = succ_end(BB); it != ie; ++it)
|
|
265
265
|
{
|
|
266
266
|
const Instruction* nextInst = &((*it)->front());
|
|
267
|
-
if (isIntrinsicInst(nextInst))
|
|
267
|
+
if (SVFUtil::isIntrinsicInst(nextInst))
|
|
268
268
|
getNextInsts(nextInst, instList);
|
|
269
269
|
else
|
|
270
270
|
instList.push_back(nextInst);
|
|
@@ -274,12 +274,12 @@ void SVFUtil::getNextInsts(const Instruction* curInst, std::vector<const Instruc
|
|
|
274
274
|
|
|
275
275
|
|
|
276
276
|
/// Get the previous instructions following control flow
|
|
277
|
-
void
|
|
277
|
+
void LLVMUtil::getPrevInsts(const Instruction* curInst, std::vector<const Instruction*>& instList)
|
|
278
278
|
{
|
|
279
279
|
if (curInst != &(curInst->getParent()->front()))
|
|
280
280
|
{
|
|
281
281
|
const Instruction* prevInst = curInst->getPrevNode();
|
|
282
|
-
if (isIntrinsicInst(prevInst))
|
|
282
|
+
if (SVFUtil::isIntrinsicInst(prevInst))
|
|
283
283
|
getPrevInsts(prevInst, instList);
|
|
284
284
|
else
|
|
285
285
|
instList.push_back(prevInst);
|
|
@@ -291,7 +291,7 @@ void SVFUtil::getPrevInsts(const Instruction* curInst, std::vector<const Instruc
|
|
|
291
291
|
for (const_pred_iterator it = pred_begin(BB), ie = pred_end(BB); it != ie; ++it)
|
|
292
292
|
{
|
|
293
293
|
const Instruction* prevInst = &((*it)->back());
|
|
294
|
-
if (isIntrinsicInst(prevInst))
|
|
294
|
+
if (SVFUtil::isIntrinsicInst(prevInst))
|
|
295
295
|
getPrevInsts(prevInst, instList);
|
|
296
296
|
else
|
|
297
297
|
instList.push_back(prevInst);
|
|
@@ -304,7 +304,7 @@ void SVFUtil::getPrevInsts(const Instruction* curInst, std::vector<const Instruc
|
|
|
304
304
|
* for example, %4 = call align 16 i8* @malloc(i64 10); %5 = bitcast i8* %4 to i32*
|
|
305
305
|
* return %5 whose type is i32* but not %4 whose type is i8*
|
|
306
306
|
*/
|
|
307
|
-
const Value*
|
|
307
|
+
const Value* LLVMUtil::getUniqueUseViaCastInst(const Value* val)
|
|
308
308
|
{
|
|
309
309
|
const PointerType * type = SVFUtil::dyn_cast<PointerType>(val->getType());
|
|
310
310
|
assert(type && "this value should be a pointer type!");
|
|
@@ -323,11 +323,11 @@ const Value* SVFUtil::getUniqueUseViaCastInst(const Value* val)
|
|
|
323
323
|
/*!
|
|
324
324
|
* Return the type of the object from a heap allocation
|
|
325
325
|
*/
|
|
326
|
-
const Type*
|
|
326
|
+
const Type* LLVMUtil::getTypeOfHeapAlloc(const Instruction *inst)
|
|
327
327
|
{
|
|
328
328
|
const PointerType* type = SVFUtil::dyn_cast<PointerType>(inst->getType());
|
|
329
329
|
|
|
330
|
-
if(isHeapAllocExtCallViaRet(inst))
|
|
330
|
+
if(SVFUtil::isHeapAllocExtCallViaRet(inst))
|
|
331
331
|
{
|
|
332
332
|
if(const Value* v = getUniqueUseViaCastInst(inst))
|
|
333
333
|
{
|
|
@@ -335,10 +335,10 @@ const Type* SVFUtil::getTypeOfHeapAlloc(const Instruction *inst)
|
|
|
335
335
|
type = newTy;
|
|
336
336
|
}
|
|
337
337
|
}
|
|
338
|
-
else if(isHeapAllocExtCallViaArg(inst))
|
|
338
|
+
else if(SVFUtil::isHeapAllocExtCallViaArg(inst))
|
|
339
339
|
{
|
|
340
|
-
CallSite cs = getLLVMCallSite(inst);
|
|
341
|
-
int arg_pos = getHeapAllocHoldingArgPosition(getCallee(cs));
|
|
340
|
+
CallSite cs = SVFUtil::getLLVMCallSite(inst);
|
|
341
|
+
int arg_pos = SVFUtil::getHeapAllocHoldingArgPosition(SVFUtil::getCallee(cs));
|
|
342
342
|
const Value *arg = cs.getArgument(arg_pos);
|
|
343
343
|
type = SVFUtil::dyn_cast<PointerType>(arg->getType());
|
|
344
344
|
}
|
|
@@ -354,7 +354,7 @@ const Type* SVFUtil::getTypeOfHeapAlloc(const Instruction *inst)
|
|
|
354
354
|
/*!
|
|
355
355
|
* Get position of a successor basic block
|
|
356
356
|
*/
|
|
357
|
-
u32_t
|
|
357
|
+
u32_t LLVMUtil::getBBSuccessorPos(const BasicBlock *BB, const BasicBlock *Succ)
|
|
358
358
|
{
|
|
359
359
|
u32_t i = 0;
|
|
360
360
|
for (const BasicBlock *SuccBB: successors(BB))
|
|
@@ -371,7 +371,7 @@ u32_t SVFUtil::getBBSuccessorPos(const BasicBlock *BB, const BasicBlock *Succ)
|
|
|
371
371
|
/*!
|
|
372
372
|
* Return a position index from current bb to it successor bb
|
|
373
373
|
*/
|
|
374
|
-
u32_t
|
|
374
|
+
u32_t LLVMUtil::getBBPredecessorPos(const BasicBlock *bb, const BasicBlock *succbb)
|
|
375
375
|
{
|
|
376
376
|
u32_t pos = 0;
|
|
377
377
|
for (const_pred_iterator it = pred_begin(succbb), et = pred_end(succbb); it != et; ++it, ++pos)
|
|
@@ -386,7 +386,7 @@ u32_t SVFUtil::getBBPredecessorPos(const BasicBlock *bb, const BasicBlock *succb
|
|
|
386
386
|
/*!
|
|
387
387
|
* Get the num of BB's successors
|
|
388
388
|
*/
|
|
389
|
-
u32_t
|
|
389
|
+
u32_t LLVMUtil::getBBSuccessorNum(const BasicBlock *BB)
|
|
390
390
|
{
|
|
391
391
|
return BB->getTerminator()->getNumSuccessors();
|
|
392
392
|
}
|
|
@@ -394,7 +394,7 @@ u32_t SVFUtil::getBBSuccessorNum(const BasicBlock *BB)
|
|
|
394
394
|
/*!
|
|
395
395
|
* Get the num of BB's predecessors
|
|
396
396
|
*/
|
|
397
|
-
u32_t
|
|
397
|
+
u32_t LLVMUtil::getBBPredecessorNum(const BasicBlock *BB)
|
|
398
398
|
{
|
|
399
399
|
u32_t num = 0;
|
|
400
400
|
for (const_pred_iterator it = pred_begin(BB), et = pred_end(BB); it != et; ++it)
|
|
@@ -407,7 +407,7 @@ u32_t SVFUtil::getBBPredecessorNum(const BasicBlock *BB)
|
|
|
407
407
|
* llvm::parseIRFile (lib/IRReader/IRReader.cpp)
|
|
408
408
|
* llvm::parseIR (lib/IRReader/IRReader.cpp)
|
|
409
409
|
*/
|
|
410
|
-
bool
|
|
410
|
+
bool LLVMUtil::isIRFile(const std::string &filename)
|
|
411
411
|
{
|
|
412
412
|
llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> FileOrErr = llvm::MemoryBuffer::getFileOrSTDIN(filename);
|
|
413
413
|
if (FileOrErr.getError())
|
|
@@ -424,14 +424,14 @@ bool SVFUtil::isIRFile(const std::string &filename)
|
|
|
424
424
|
|
|
425
425
|
/// Get the names of all modules into a vector
|
|
426
426
|
/// And process arguments
|
|
427
|
-
void
|
|
428
|
-
|
|
427
|
+
void LLVMUtil::processArguments(int argc, char **argv, int &arg_num, char **arg_value,
|
|
428
|
+
std::vector<std::string> &moduleNameVec)
|
|
429
429
|
{
|
|
430
430
|
bool first_ir_file = true;
|
|
431
431
|
for (int i = 0; i < argc; ++i)
|
|
432
432
|
{
|
|
433
433
|
std::string argument(argv[i]);
|
|
434
|
-
if (
|
|
434
|
+
if (LLVMUtil::isIRFile(argument))
|
|
435
435
|
{
|
|
436
436
|
if (find(moduleNameVec.begin(), moduleNameVec.end(), argument)
|
|
437
437
|
== moduleNameVec.end())
|
|
@@ -452,7 +452,7 @@ void SVFUtil::processArguments(int argc, char **argv, int &arg_num, char **arg_v
|
|
|
452
452
|
}
|
|
453
453
|
|
|
454
454
|
|
|
455
|
-
u32_t
|
|
455
|
+
u32_t LLVMUtil::getTypeSizeInBytes(const Type* type)
|
|
456
456
|
{
|
|
457
457
|
|
|
458
458
|
// if the type has size then simply return it, otherwise just return 0
|
|
@@ -462,7 +462,7 @@ u32_t SVFUtil::getTypeSizeInBytes(const Type* type)
|
|
|
462
462
|
return 0;
|
|
463
463
|
}
|
|
464
464
|
|
|
465
|
-
u32_t
|
|
465
|
+
u32_t LLVMUtil::getTypeSizeInBytes(const StructType *sty, u32_t field_idx)
|
|
466
466
|
{
|
|
467
467
|
|
|
468
468
|
const StructLayout *stTySL = getDataLayout(LLVMModuleSet::getLLVMModuleSet()->getMainLLVMModule())->getStructLayout( const_cast<StructType *>(sty) );
|
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
using namespace std;
|
|
42
42
|
using namespace SVF;
|
|
43
43
|
using namespace SVFUtil;
|
|
44
|
+
using namespace LLVMUtil;
|
|
44
45
|
|
|
45
46
|
|
|
46
47
|
/*!
|
|
@@ -201,7 +202,7 @@ void SVFIRBuilder::initialiseNodes()
|
|
|
201
202
|
{
|
|
202
203
|
DBOUT(DPAGBuild, outs() << "add address edges for constant node " << iter->second << "\n");
|
|
203
204
|
const Value* val = iter->first;
|
|
204
|
-
if (
|
|
205
|
+
if (LLVMUtil::isConstantObjSym(val))
|
|
205
206
|
{
|
|
206
207
|
NodeID ptr = pag->getValueNode(val);
|
|
207
208
|
if(ptr!= pag->getBlkPtr() && ptr!= pag->getNullPtr())
|
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
|
|
42
42
|
using namespace SVF;
|
|
43
43
|
using namespace SVFUtil;
|
|
44
|
+
using namespace LLVMUtil;
|
|
44
45
|
|
|
45
46
|
/*!
|
|
46
47
|
* This method identify which is value sym and which is object sym
|
|
@@ -194,6 +195,17 @@ void SymbolTableBuilder::buildMemModel(SVFModule* svfModule)
|
|
|
194
195
|
}
|
|
195
196
|
}
|
|
196
197
|
|
|
198
|
+
/*!
|
|
199
|
+
* Collect special sym here
|
|
200
|
+
*/
|
|
201
|
+
void SymbolTableBuilder::collectNullPtrBlackholeSyms(const Value *val)
|
|
202
|
+
{
|
|
203
|
+
if (LLVMUtil::isNullPtrSym(val))
|
|
204
|
+
symInfo->nullPtrSyms.insert(val);
|
|
205
|
+
if (LLVMUtil::isBlackholeSym(val))
|
|
206
|
+
symInfo->blackholeSyms.insert(val);
|
|
207
|
+
}
|
|
208
|
+
|
|
197
209
|
/*!
|
|
198
210
|
* Collect symbols, including value and object syms
|
|
199
211
|
*/
|
|
@@ -204,18 +216,6 @@ void SymbolTableBuilder::collectSym(const Value *val)
|
|
|
204
216
|
|
|
205
217
|
DBOUT(DMemModel, outs() << "collect sym from ##" << SVFUtil::value2String(val) << " \n");
|
|
206
218
|
|
|
207
|
-
// special sym here
|
|
208
|
-
if (SVFUtil::isNullPtrSym(val))
|
|
209
|
-
{
|
|
210
|
-
symInfo->nullPtrSyms.insert(val);
|
|
211
|
-
return;
|
|
212
|
-
}
|
|
213
|
-
if (SVFUtil::isBlackholeSym(val))
|
|
214
|
-
{
|
|
215
|
-
symInfo->blackholeSyms.insert(val);
|
|
216
|
-
return;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
219
|
//TODO handle constant expression value here??
|
|
220
220
|
handleCE(val);
|
|
221
221
|
|
|
@@ -234,6 +234,12 @@ void SymbolTableBuilder::collectSym(const Value *val)
|
|
|
234
234
|
*/
|
|
235
235
|
void SymbolTableBuilder::collectVal(const Value *val)
|
|
236
236
|
{
|
|
237
|
+
// collect and record special sym here
|
|
238
|
+
if (LLVMUtil::isNullPtrSym(val) || LLVMUtil::isBlackholeSym(val))
|
|
239
|
+
{
|
|
240
|
+
collectNullPtrBlackholeSyms(val);
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
237
243
|
SymbolTableInfo::ValueToIDMapTy::iterator iter = symInfo->valSymMap.find(val);
|
|
238
244
|
if (iter == symInfo->valSymMap.end())
|
|
239
245
|
{
|
|
@@ -247,7 +253,7 @@ void SymbolTableBuilder::collectVal(const Value *val)
|
|
|
247
253
|
handleGlobalCE(globalVar);
|
|
248
254
|
}
|
|
249
255
|
|
|
250
|
-
if (
|
|
256
|
+
if (LLVMUtil::isConstantObjSym(val))
|
|
251
257
|
collectObj(val);
|
|
252
258
|
}
|
|
253
259
|
|
|
@@ -262,7 +268,7 @@ void SymbolTableBuilder::collectObj(const Value *val)
|
|
|
262
268
|
{
|
|
263
269
|
// if the object pointed by the pointer is a constant data (e.g., i32 0) or a global constant object (e.g. string)
|
|
264
270
|
// then we treat them as one ConstantObj
|
|
265
|
-
if((
|
|
271
|
+
if((LLVMUtil::isConstantObjSym(val) && !symInfo->getModelConstants()))
|
|
266
272
|
{
|
|
267
273
|
symInfo->objSymMap.insert(std::make_pair(val, symInfo->constantSymID()));
|
|
268
274
|
}
|
|
@@ -521,7 +527,7 @@ ObjTypeInfo* SymbolTableBuilder::createObjTypeInfo(const Value *val)
|
|
|
521
527
|
writeWrnMsg("try to create an object with a non-pointer type.");
|
|
522
528
|
writeWrnMsg(val->getName().str());
|
|
523
529
|
writeWrnMsg("(" + getSourceLoc(val) + ")");
|
|
524
|
-
if(
|
|
530
|
+
if(LLVMUtil::isConstantObjSym(val))
|
|
525
531
|
{
|
|
526
532
|
ObjTypeInfo* typeInfo = new ObjTypeInfo(val->getType(), 0);
|
|
527
533
|
initTypeInfo(typeInfo,val);
|
|
@@ -645,7 +651,7 @@ void SymbolTableBuilder::initTypeInfo(ObjTypeInfo* typeinfo, const Value* val)
|
|
|
645
651
|
else if(SVFUtil::isa<GlobalVariable>(val))
|
|
646
652
|
{
|
|
647
653
|
typeinfo->setFlag(ObjTypeInfo::GLOBVAR_OBJ);
|
|
648
|
-
if(
|
|
654
|
+
if(LLVMUtil::isConstantObjSym(val))
|
|
649
655
|
typeinfo->setFlag(ObjTypeInfo::CONST_GLOBAL_OBJ);
|
|
650
656
|
analyzeObjType(typeinfo,val);
|
|
651
657
|
objSize = getObjSize(typeinfo->getType());
|
package/lib/WPA/AndersenStat.cpp
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "svf-tools",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.475",
|
|
4
4
|
"description": "* <b>[TypeClone](https://github.com/SVF-tools/SVF/wiki/TypeClone) published in our [ECOOP paper](https://yuleisui.github.io/publications/ecoop20.pdf) is now available in SVF </b> * <b>SVF now uses a single script for its build. Just type [`source ./build.sh`](https://github.com/SVF-tools/SVF/blob/master/build.sh) in your terminal, that's it!</b> * <b>SVF now supports LLVM-10.0.0! </b> * <b>We thank [bsauce](https://github.com/bsauce) for writing a user manual of SVF ([link1](https://www.jianshu.com/p/068a08ec749c) and [link2](https://www.jianshu.com/p/777c30d4240e)) in Chinese </b> * <b>SVF now supports LLVM-9.0.0 (Thank [Byoungyoung Lee](https://github.com/SVF-tools/SVF/issues/142) for his help!). </b> * <b>SVF now supports a set of [field-sensitive pointer analyses](https://yuleisui.github.io/publications/sas2019a.pdf). </b> * <b>[Use SVF as an external lib](https://github.com/SVF-tools/SVF/wiki/Using-SVF-as-a-lib-in-your-own-tool) for your own project (Contributed by [Hongxu Chen](https://github.com/HongxuChen)). </b> * <b>SVF now supports LLVM-7.0.0. </b> * <b>SVF now supports Docker. [Try SVF in Docker](https://github.com/SVF-tools/SVF/wiki/Try-SVF-in-Docker)! </b> * <b>SVF now supports [LLVM-6.0.0](https://github.com/svf-tools/SVF/pull/38) (Contributed by [Jack Anthony](https://github.com/jackanth)). </b> * <b>SVF now supports [LLVM-4.0.0](https://github.com/svf-tools/SVF/pull/23) (Contributed by Jared Carlson. Thank [Jared](https://github.com/jcarlson23) and [Will](https://github.com/dtzWill) for their in-depth [discussions](https://github.com/svf-tools/SVF/pull/18) about updating SVF!) </b> * <b>SVF now supports analysis for C++ programs.</b> <br />",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
package/tools/CFL/cfl.cpp
CHANGED
|
@@ -45,7 +45,7 @@ int main(int argc, char ** argv)
|
|
|
45
45
|
int arg_num = 0;
|
|
46
46
|
char **arg_value = new char*[argc];
|
|
47
47
|
std::vector<std::string> moduleNameVec;
|
|
48
|
-
|
|
48
|
+
LLVMUtil::processArguments(argc, argv, arg_num, arg_value, moduleNameVec);
|
|
49
49
|
cl::ParseCommandLineOptions(arg_num, arg_value,
|
|
50
50
|
"CFL Reachability Analysis\n");
|
|
51
51
|
|
package/tools/DDA/dda.cpp
CHANGED
|
@@ -44,7 +44,7 @@ int main(int argc, char ** argv)
|
|
|
44
44
|
int arg_num = 0;
|
|
45
45
|
char **arg_value = new char*[argc];
|
|
46
46
|
std::vector<std::string> moduleNameVec;
|
|
47
|
-
|
|
47
|
+
LLVMUtil::processArguments(argc, argv, arg_num, arg_value, moduleNameVec);
|
|
48
48
|
cl::ParseCommandLineOptions(arg_num, arg_value,
|
|
49
49
|
"Demand-Driven Points-to Analysis\n");
|
|
50
50
|
|
package/tools/Example/svf-ex.cpp
CHANGED
|
@@ -145,7 +145,7 @@ int main(int argc, char ** argv)
|
|
|
145
145
|
int arg_num = 0;
|
|
146
146
|
char **arg_value = new char*[argc];
|
|
147
147
|
std::vector<std::string> moduleNameVec;
|
|
148
|
-
|
|
148
|
+
LLVMUtil::processArguments(argc, argv, arg_num, arg_value, moduleNameVec);
|
|
149
149
|
cl::ParseCommandLineOptions(arg_num, arg_value,
|
|
150
150
|
"Whole Program Points-to Analysis\n");
|
|
151
151
|
|
package/tools/MTA/mta.cpp
CHANGED
|
@@ -12,7 +12,7 @@ int main(int argc, char ** argv)
|
|
|
12
12
|
int arg_num = 0;
|
|
13
13
|
char **arg_value = new char*[argc];
|
|
14
14
|
std::vector<std::string> moduleNameVec;
|
|
15
|
-
|
|
15
|
+
LLVMUtil::processArguments(argc, argv, arg_num, arg_value, moduleNameVec);
|
|
16
16
|
cl::ParseCommandLineOptions(arg_num, arg_value,
|
|
17
17
|
"MTA Analysis\n");
|
|
18
18
|
|
package/tools/SABER/saber.cpp
CHANGED
|
@@ -50,7 +50,7 @@ int main(int argc, char ** argv)
|
|
|
50
50
|
int arg_num = 0;
|
|
51
51
|
char **arg_value = new char*[argc];
|
|
52
52
|
std::vector<std::string> moduleNameVec;
|
|
53
|
-
|
|
53
|
+
LLVMUtil::processArguments(argc, argv, arg_num, arg_value, moduleNameVec);
|
|
54
54
|
cl::ParseCommandLineOptions(arg_num, arg_value,
|
|
55
55
|
"Source-Sink Bug Detector\n");
|
|
56
56
|
|
package/tools/WPA/wpa.cpp
CHANGED
|
@@ -40,7 +40,7 @@ int main(int argc, char ** argv)
|
|
|
40
40
|
int arg_num = 0;
|
|
41
41
|
char **arg_value = new char*[argc];
|
|
42
42
|
std::vector<std::string> moduleNameVec;
|
|
43
|
-
|
|
43
|
+
LLVMUtil::processArguments(argc, argv, arg_num, arg_value, moduleNameVec);
|
|
44
44
|
cl::ParseCommandLineOptions(arg_num, arg_value,
|
|
45
45
|
"Whole Program Points-to Analysis\n");
|
|
46
46
|
|