svf-tools 1.0.536 → 1.0.539

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.
Files changed (112) hide show
  1. package/SVF-doxygen/html/html/AndersenSFR_8cpp_source.html +1 -1
  2. package/SVF-doxygen/html/html/AndersenSFR_8h_source.html +1 -1
  3. package/SVF-doxygen/html/html/AndersenWaveDiff_8cpp_source.html +2 -2
  4. package/SVF-doxygen/html/html/Andersen_8cpp_source.html +16 -16
  5. package/SVF-doxygen/html/html/Andersen_8h_source.html +6 -9
  6. package/SVF-doxygen/html/html/CFLAlias_8cpp_source.html +3 -3
  7. package/SVF-doxygen/html/html/CFLGraphBuilder_8cpp_source.html +1 -1
  8. package/SVF-doxygen/html/html/ConsG_8cpp_source.html +1 -1
  9. package/SVF-doxygen/html/html/ConsG_8h_source.html +3 -3
  10. package/SVF-doxygen/html/html/DDAClient_8cpp_source.html +2 -2
  11. package/SVF-doxygen/html/html/DDAVFSolver_8h_source.html +4 -4
  12. package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +2 -2
  13. package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +1 -1
  14. package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +1 -1
  15. package/SVF-doxygen/html/html/FlowSensitive_8h_source.html +1 -1
  16. package/SVF-doxygen/html/html/IRGraph_8cpp_source.html +1 -1
  17. package/SVF-doxygen/html/html/LLVMLoopAnalysis_8cpp_source.html +1 -1
  18. package/SVF-doxygen/html/html/MTA_8cpp_source.html +1 -1
  19. package/SVF-doxygen/html/html/MemRegion_8cpp_source.html +1 -1
  20. package/SVF-doxygen/html/html/Options_8cpp_source.html +13 -12
  21. package/SVF-doxygen/html/html/Options_8h_source.html +13 -12
  22. package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +1 -1
  23. package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +1 -1
  24. package/SVF-doxygen/html/html/PointerAnalysis_8h_source.html +3 -3
  25. package/SVF-doxygen/html/html/SVFGReadWrite_8cpp_source.html +1 -1
  26. package/SVF-doxygen/html/html/SVFG_8cpp_source.html +1 -1
  27. package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +2 -1
  28. package/SVF-doxygen/html/html/SVFIRBuilder_8h_source.html +32 -32
  29. package/SVF-doxygen/html/html/SVFIR_8cpp_source.html +3 -3
  30. package/SVF-doxygen/html/html/SVFIR_8h_source.html +33 -33
  31. package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +2 -2
  32. package/SVF-doxygen/html/html/SrcSnkDDA_8cpp_source.html +3 -3
  33. package/SVF-doxygen/html/html/VFG_8h_source.html +1 -1
  34. package/SVF-doxygen/html/html/VersionedFlowSensitiveStat_8cpp_source.html +1 -1
  35. package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +1 -1
  36. package/SVF-doxygen/html/html/WPAPass_8cpp_source.html +5 -5
  37. package/SVF-doxygen/html/html/classSVF_1_1Andersen-members.html +150 -152
  38. package/SVF-doxygen/html/html/classSVF_1_1Andersen.html +45 -140
  39. package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +1 -1
  40. package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD-members.html +149 -151
  41. package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD.html +4 -10
  42. package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR-members.html +161 -163
  43. package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +3 -9
  44. package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff-members.html +156 -158
  45. package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff.html +13 -19
  46. package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +4 -4
  47. package/SVF-doxygen/html/html/classSVF_1_1CFLAlias.html +5 -5
  48. package/SVF-doxygen/html/html/classSVF_1_1CFLGraphBuilder.html +1 -1
  49. package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl.html +1 -1
  50. package/SVF-doxygen/html/html/classSVF_1_1ConstraintGraph.html +3 -3
  51. package/SVF-doxygen/html/html/classSVF_1_1DDAVFSolver.html +3 -3
  52. package/SVF-doxygen/html/html/classSVF_1_1FSMPTA.html +2 -2
  53. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +4 -4
  54. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +1 -1
  55. package/SVF-doxygen/html/html/classSVF_1_1FunptrDDAClient.html +2 -2
  56. package/SVF-doxygen/html/html/classSVF_1_1LLVMLoopAnalysis.html +1 -1
  57. package/SVF-doxygen/html/html/classSVF_1_1MRGenerator.html +1 -1
  58. package/SVF-doxygen/html/html/classSVF_1_1MTA.html +1 -1
  59. package/SVF-doxygen/html/html/classSVF_1_1Options-members.html +4 -3
  60. package/SVF-doxygen/html/html/classSVF_1_1Options.html +38 -12
  61. package/SVF-doxygen/html/html/classSVF_1_1PAGBuilderFromFile.html +2 -2
  62. package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +4 -4
  63. package/SVF-doxygen/html/html/classSVF_1_1SVFG.html +1 -1
  64. package/SVF-doxygen/html/html/classSVF_1_1SVFIR.html +86 -88
  65. package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +120 -118
  66. package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +2 -2
  67. package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA.html +3 -3
  68. package/SVF-doxygen/html/html/classSVF_1_1VFG.html +1 -1
  69. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +2 -2
  70. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitiveStat.html +1 -1
  71. package/SVF-doxygen/html/html/classSVF_1_1WPAPass.html +12 -12
  72. package/SVF-doxygen/html/html/functions_a.html +3 -6
  73. package/SVF-doxygen/html/html/functions_func.html +5 -8
  74. package/SVF-doxygen/html/html/functions_func_m.html +1 -4
  75. package/SVF-doxygen/html/html/functions_l.html +6 -6
  76. package/SVF-doxygen/html/html/functions_m.html +0 -3
  77. package/SVF-doxygen/html/html/functions_n.html +4 -4
  78. package/SVF-doxygen/html/html/functions_o.html +3 -3
  79. package/SVF-doxygen/html/html/functions_p.html +13 -13
  80. package/SVF-doxygen/html/html/functions_r.html +3 -5
  81. package/SVF-doxygen/html/html/functions_s.html +3 -3
  82. package/SVF-doxygen/html/html/functions_t.html +4 -4
  83. package/SVF-doxygen/html/html/functions_v.html +6 -3
  84. package/SVF-doxygen/html/html/functions_vars_v.html +3 -0
  85. package/SVF-doxygen/html/html/namespaceSVF.html +1 -1
  86. package/SVF-doxygen/html/html/search/all_1.js +0 -1
  87. package/SVF-doxygen/html/html/search/all_10.js +6 -6
  88. package/SVF-doxygen/html/html/search/all_11.js +1 -1
  89. package/SVF-doxygen/html/html/search/all_12.js +2 -2
  90. package/SVF-doxygen/html/html/search/all_13.js +3 -3
  91. package/SVF-doxygen/html/html/search/all_14.js +1 -1
  92. package/SVF-doxygen/html/html/search/all_15.js +3 -2
  93. package/SVF-doxygen/html/html/search/all_b.js +1 -1
  94. package/SVF-doxygen/html/html/search/all_c.js +4 -4
  95. package/SVF-doxygen/html/html/search/all_d.js +0 -1
  96. package/SVF-doxygen/html/html/search/all_e.js +2 -2
  97. package/SVF-doxygen/html/html/search/all_f.js +1 -1
  98. package/SVF-doxygen/html/html/search/functions_0.js +0 -1
  99. package/SVF-doxygen/html/html/search/functions_c.js +0 -1
  100. package/SVF-doxygen/html/html/search/variables_13.js +2 -2
  101. package/SVF-doxygen/html/html/search/variables_14.js +1 -1
  102. package/SVF-doxygen/html/html/search/variables_15.js +1 -0
  103. package/SVF-doxygen/html/html/search/variables_c.js +1 -1
  104. package/SVF-doxygen/html/html/search/variables_e.js +1 -1
  105. package/include/MemoryModel/SVFIR.h +1 -4
  106. package/include/Util/Options.h +1 -0
  107. package/include/WPA/Andersen.h +0 -11
  108. package/lib/Graphs/SVFGReadWrite.cpp +3 -3
  109. package/lib/SVF-FE/SVFIRBuilder.cpp +2 -0
  110. package/lib/Util/Options.cpp +7 -0
  111. package/lib/WPA/Andersen.cpp +0 -3
  112. package/package.json +1 -1
@@ -5,7 +5,7 @@ var searchData=
5
5
  ['uniqueintersections',['uniqueIntersections',['../classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531',1,'SVF::PersistentPointsToCache']]],
6
6
  ['uniqueunions',['uniqueUnions',['../classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4',1,'SVF::PersistentPointsToCache']]],
7
7
  ['unlocksites',['unlocksites',['../classSVF_1_1LockAnalysis.html#aec459af1d1624df55ffc95cd75655780',1,'SVF::LockAnalysis']]],
8
- ['updatecallgraphtime',['updateCallGraphTime',['../classSVF_1_1FlowSensitive.html#afc140b6c8e78dc2d962f64fdf53b1e07',1,'SVF::FlowSensitive::updateCallGraphTime()'],['../classSVF_1_1PTAStat.html#a8aedfeb35f76e6d33135637156468894',1,'SVF::PTAStat::UpdateCallGraphTime()']]],
8
+ ['updatecallgraphtime',['UpdateCallGraphTime',['../classSVF_1_1PTAStat.html#a8aedfeb35f76e6d33135637156468894',1,'SVF::PTAStat::UpdateCallGraphTime()'],['../classSVF_1_1FlowSensitive.html#afc140b6c8e78dc2d962f64fdf53b1e07',1,'SVF::FlowSensitive::updateCallGraphTime()']]],
9
9
  ['updatetime',['updateTime',['../classSVF_1_1FlowSensitive.html#af5a94d14096ae2bbc47b3b3b9f723226',1,'SVF::FlowSensitive']]],
10
10
  ['usedregs',['usedRegs',['../classSVF_1_1MemSSA.html#acf840b71b67cabe831f01f2d358f27fa',1,'SVF::MemSSA']]],
11
11
  ['usepcg',['UsePCG',['../classSVF_1_1Options.html#af2f66307e1d51947676f622c98ef0762',1,'SVF::Options']]],
@@ -35,6 +35,7 @@ var searchData=
35
35
  ['visitedset',['visitedSet',['../classSVF_1_1SrcSnkDDA.html#a2349db6c540e418600e2fdbe2e665628',1,'SVF::SrcSnkDDA']]],
36
36
  ['vptd',['vPtD',['../classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07',1,'SVF::VersionedFlowSensitive']]],
37
37
  ['vtable',['vtable',['../classSVF_1_1CHNode.html#a08a717043e8b8c3d87742f0ecd3a3cc1',1,'SVF::CHNode::vtable()'],['../classSVF_1_1DCHNode.html#a620ac2c6a9095510be5999431ff54b6d',1,'SVF::DCHNode::vtable()']]],
38
+ ['vtableinsvfir',['VtableInSVFIR',['../classSVF_1_1Options.html#a2a9fe90fae25f3de780f91b7e296b49a',1,'SVF::Options']]],
38
39
  ['vtabletocallsitemap',['vtableToCallSiteMap',['../classSVF_1_1FunptrDDAClient.html#a357db092c3c39d7b1c6dd0fec3888048',1,'SVF::FunptrDDAClient::vtableToCallSiteMap()'],['../classSVF_1_1AliasDDAClient.html#a123e98572cf077ffdf7116ac5f5fc5e4',1,'SVF::AliasDDAClient::vtableToCallSiteMap()']]],
39
40
  ['vtblchamap',['vtblCHAMap',['../classSVF_1_1DCHGraph.html#a294e7a04aff9cef87c1008e91a620155',1,'SVF::DCHGraph']]],
40
41
  ['vtbllabelafterdemangle',['vtblLabelAfterDemangle',['../CPPUtil_8cpp.html#ac43d67cde6cc257e442b3ac2ae8fb3f9',1,'CPPUtil.cpp']]],
@@ -38,7 +38,7 @@ var searchData=
38
38
  ['lookupintersections',['lookupIntersections',['../classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff',1,'SVF::PersistentPointsToCache']]],
39
39
  ['lookupunions',['lookupUnions',['../classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8',1,'SVF::PersistentPointsToCache']]],
40
40
  ['loopanalysis',['LoopAnalysis',['../classSVF_1_1Options.html#a420e6656b02fd900430d51b8b4a5c6c1',1,'SVF::Options']]],
41
- ['loopbound',['LoopBound',['../classSVF_1_1Options.html#ab7161ca7a809792af82e5aabdfcc3bfb',1,'SVF::Options::LoopBound()'],['../classSVF_1_1SVFLoop.html#ac4e2c365e2a08477381802205029b85c',1,'SVF::SVFLoop::loopBound()']]],
41
+ ['loopbound',['loopBound',['../classSVF_1_1SVFLoop.html#ac4e2c365e2a08477381802205029b85c',1,'SVF::SVFLoop::loopBound()'],['../classSVF_1_1Options.html#ab7161ca7a809792af82e5aabdfcc3bfb',1,'SVF::Options::LoopBound()']]],
42
42
  ['loopinfobuilder',['loopInfoBuilder',['../classSVF_1_1TCT.html#ae64d6203b41c92d4ca617b8e976b88b2',1,'SVF::TCT']]],
43
43
  ['lowlink',['lowlink',['../structSVF_1_1VersionedFlowSensitive_1_1SCC_1_1NodeData.html#a6d66813dfb5338c22de62c100e951cf2',1,'SVF::VersionedFlowSensitive::SCC::NodeData']]],
44
44
  ['ls',['ls',['../classSVF_1_1NormalGepCGEdge.html#a7cbcaa28acde49ef0b03a8554a41344b',1,'SVF::NormalGepCGEdge::ls()'],['../classSVF_1_1GepStmt.html#a543a3f4801b22719f7b9677246bf2ac7',1,'SVF::GepStmt::ls()'],['../classSVF_1_1GepValVar.html#a2ee5e9a2e5a92b32fd81fda09b560ad6',1,'SVF::GepValVar::ls()'],['../classSVF_1_1GepObjVar.html#a55b057663180420c6bb09bf849d83f6b',1,'SVF::GepObjVar::ls()']]],
@@ -137,7 +137,7 @@ var searchData=
137
137
  ['numofretnodes',['numOfRetNodes',['../classSVF_1_1ICFGStat.html#ac9bfce40c058ed7ab178fe1f1818e9de',1,'SVF::ICFGStat']]],
138
138
  ['numofreturns',['NumOfReturns',['../classSVF_1_1PTAStat.html#a0a552611fcd20e1310290bdae404a514',1,'SVF::PTAStat']]],
139
139
  ['numofscc',['numOfSCC',['../classSVF_1_1FlowSensitive.html#a0ac955bf06261eec1c6bb78ec99652e3',1,'SVF::FlowSensitive']]],
140
- ['numofsccdetection',['NumOfSCCDetection',['../classSVF_1_1PTAStat.html#ad1731b88c24bb79728f62cd3e9c55699',1,'SVF::PTAStat::NumOfSCCDetection()'],['../classSVF_1_1AndersenBase.html#a0d7298cbf83568f24fd2bd1926a32968',1,'SVF::AndersenBase::numOfSCCDetection()']]],
140
+ ['numofsccdetection',['numOfSCCDetection',['../classSVF_1_1AndersenBase.html#a0d7298cbf83568f24fd2bd1926a32968',1,'SVF::AndersenBase::numOfSCCDetection()'],['../classSVF_1_1PTAStat.html#ad1731b88c24bb79728f62cd3e9c55699',1,'SVF::PTAStat::NumOfSCCDetection()']]],
141
141
  ['numofsfr',['NumOfSfr',['../classSVF_1_1PTAStat.html#a07a1db62ddba50bda787b2985ef8d135',1,'SVF::PTAStat']]],
142
142
  ['numofsfrs',['numOfSfrs',['../classSVF_1_1AndersenBase.html#a25b00d9ca71cbdd27530fc5d0dc84ee5',1,'SVF::AndersenBase']]],
143
143
  ['numofstackobjs',['NumOfStackObjs',['../classSVF_1_1PTAStat.html#ae05503909688a17dc1f282d1d029d24e',1,'SVF::PTAStat']]],
@@ -367,10 +367,7 @@ public:
367
367
  }
368
368
  inline NodeID getFIObjVar(NodeID id) const
369
369
  {
370
- SVFVar* node = pag->getGNode(id);
371
- assert(SVFUtil::isa<ObjVar>(node) && "need an object node");
372
- ObjVar* obj = SVFUtil::cast<ObjVar>(node);
373
- return getFIObjVar(obj->getMemObj());
370
+ return getBaseObjVar(id);
374
371
  }
375
372
  //@}
376
373
 
@@ -236,6 +236,7 @@ public:
236
236
  static const llvm::cl::opt<std :: string> ReadAnder;
237
237
  static const llvm::cl::opt<bool> PtsDiff;
238
238
  static const llvm::cl::opt<bool> MergePWC;
239
+ static const llvm::cl::opt<bool> VtableInSVFIR;
239
240
 
240
241
  // WPAPass.cpp
241
242
  static const llvm::cl::opt<bool> AnderSVFG;
@@ -386,17 +386,6 @@ protected:
386
386
  return "AndersenWPA";
387
387
  }
388
388
 
389
- /// match types for Gep Edges
390
- virtual bool matchType(NodeID, NodeID, const NormalGepCGEdge*)
391
- {
392
- return true;
393
- }
394
- /// add type for newly created GepObjNode
395
- virtual void addTypeForGepObjNode(NodeID, const NormalGepCGEdge*)
396
- {
397
- return;
398
- }
399
-
400
389
  /// Runs a Steensgaard analysis and performs clustering based on those
401
390
  /// results set the global best mapping.
402
391
  virtual void cluster(void) const;
@@ -124,7 +124,7 @@ void SVFG::writeToFile(const string& filename)
124
124
  if(LOADMU* mu = SVFUtil::dyn_cast<LOADMU>(*it))
125
125
  {
126
126
  NodeID def = getDef(mu->getMRVer());
127
- f << "srcSVFGNodeID: " << nodeId << " => " << "dstSVFGNodeID: " << def << " >= LoadNode | MVER: {"<< *mu->getMRVer() << "}" << "\n";
127
+ f << "srcSVFGNodeID: " << nodeId << " => " << "dstSVFGNodeID: " << def << " >= LoadNode | MVER: {" << *mu->getMRVer() << "}" << "\n";
128
128
  }
129
129
  }
130
130
  }
@@ -136,7 +136,7 @@ void SVFG::writeToFile(const string& filename)
136
136
  if(STORECHI* chi = SVFUtil::dyn_cast<STORECHI>(*it))
137
137
  {
138
138
  NodeID def = getDef(chi->getOpVer());
139
- f << "srcSVFGNodeID: " << nodeId << " => " << "dstSVFGNodeID: " << def << " >= StoreNode | MVER: {"<< *chi->getOpVer() << "}" << "\n";
139
+ f << "srcSVFGNodeID: " << nodeId << " => " << "dstSVFGNodeID: " << def << " >= StoreNode | MVER: {" << *chi->getOpVer() << "}" << "\n";
140
140
  }
141
141
  }
142
142
  }
@@ -189,7 +189,7 @@ void SVFG::writeToFile(const string& filename)
189
189
  {
190
190
  const MRVer* op = it->second;
191
191
  NodeID def = getDef(op);
192
- f << "srcSVFGNodeID: " << nodeId << " => " << "dstSVFGNodeID: " << def << " >= PHISVFGNode | MVER: {"<< *op << "}" << "\n";
192
+ f << "srcSVFGNodeID: " << nodeId << " => " << "dstSVFGNodeID: " << def << " >= PHISVFGNode | MVER: {" << *op << "}" << "\n";
193
193
  }
194
194
  }
195
195
  }
@@ -492,6 +492,8 @@ void SVFIRBuilder::InitialGlobal(const GlobalVariable *gvar, Constant *C,
492
492
  }
493
493
  else if (SVFUtil::isa<ConstantArray>(C) || SVFUtil::isa<ConstantStruct>(C))
494
494
  {
495
+ if(cppUtil::isValVtbl(gvar) && !Options::VtableInSVFIR)
496
+ return;
495
497
  for (u32_t i = 0, e = C->getNumOperands(); i != e; i++)
496
498
  {
497
499
  u32_t off = SymbolTableInfo::SymbolInfo()->getFlattenedElemIdx(C->getType(), i);
@@ -727,6 +727,13 @@ const llvm::cl::opt<bool> Options::MergePWC(
727
727
  llvm::cl::desc("Enable PWC in graph solving")
728
728
  );
729
729
 
730
+ //SVFIRBuilder.cpp
731
+ const llvm::cl::opt<bool> Options::VtableInSVFIR(
732
+ "vt-in-ir",
733
+ llvm::cl::init(false),
734
+ llvm::cl::desc("Handle vtable in ConstantArray/ConstantStruct in SVFIRBuilder (already handled in CHA?)")
735
+ );
736
+
730
737
 
731
738
  //WPAPass.cpp
732
739
  const llvm::cl::opt<bool> Options::AnderSVFG(
@@ -431,11 +431,8 @@ bool Andersen::processGepPts(const PointsTo& pts, const GepCGEdge* edge)
431
431
  continue;
432
432
  }
433
433
 
434
- if (!matchType(edge->getSrcID(), o, normalGepEdge)) continue;
435
-
436
434
  NodeID fieldSrcPtdNode = consCG->getGepObjVar(o, normalGepEdge->getLocationSet());
437
435
  tmpDstPts.set(fieldSrcPtdNode);
438
- addTypeForGepObjNode(fieldSrcPtdNode, normalGepEdge);
439
436
  }
440
437
  }
441
438
  else
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svf-tools",
3
- "version": "1.0.536",
3
+ "version": "1.0.539",
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": {