svf-tools 1.0.286 → 1.0.287

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 (139) hide show
  1. package/SVF-doxygen/html/html/ConditionalPT_8h.html +2 -0
  2. package/SVF-doxygen/html/html/ConditionalPT_8h_source.html +56 -53
  3. package/SVF-doxygen/html/html/DDAVFSolver_8h_source.html +1 -2
  4. package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +13 -13
  5. package/SVF-doxygen/html/html/FSMPTA_8h_source.html +50 -50
  6. package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +2 -2
  7. package/SVF-doxygen/html/html/FlowSensitiveTBHC_8cpp_source.html +2 -2
  8. package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +2 -2
  9. package/SVF-doxygen/html/html/MTAStat_8cpp_source.html +3 -3
  10. package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +1 -1
  11. package/SVF-doxygen/html/html/SVFGEdge_8h_source.html +5 -5
  12. package/SVF-doxygen/html/html/SVFGNode_8h_source.html +4 -4
  13. package/SVF-doxygen/html/html/SVFGOPT_8cpp_source.html +2 -2
  14. package/SVF-doxygen/html/html/SVFGOPT_8h_source.html +2 -2
  15. package/SVF-doxygen/html/html/SVFGStat_8cpp_source.html +1 -2
  16. package/SVF-doxygen/html/html/SVFG_8cpp_source.html +4 -4
  17. package/SVF-doxygen/html/html/SVFG_8h_source.html +1 -1
  18. package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp.html +1 -0
  19. package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +10 -10
  20. package/SVF-doxygen/html/html/SaberSVFGBuilder_8h_source.html +11 -11
  21. package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +2 -2
  22. package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +3 -3
  23. package/SVF-doxygen/html/html/annotated.html +14 -13
  24. package/SVF-doxygen/html/html/classSVF_1_1ActualINSVFGNode-members.html +2 -2
  25. package/SVF-doxygen/html/html/classSVF_1_1ActualINSVFGNode.html +7 -7
  26. package/SVF-doxygen/html/html/classSVF_1_1ActualOUTSVFGNode-members.html +2 -2
  27. package/SVF-doxygen/html/html/classSVF_1_1ActualOUTSVFGNode.html +7 -7
  28. package/SVF-doxygen/html/html/classSVF_1_1CallIndSVFGEdge-members.html +2 -2
  29. package/SVF-doxygen/html/html/classSVF_1_1CallIndSVFGEdge.html +5 -5
  30. package/SVF-doxygen/html/html/classSVF_1_1CondPointsToSet.html +115 -115
  31. package/SVF-doxygen/html/html/classSVF_1_1CondPointsToSet_1_1CondPtsSetIterator.html +35 -35
  32. package/SVF-doxygen/html/html/classSVF_1_1CondStdSet-members.html +27 -26
  33. package/SVF-doxygen/html/html/classSVF_1_1CondStdSet.html +56 -21
  34. package/SVF-doxygen/html/html/classSVF_1_1DDAVFSolver.html +2 -2
  35. package/SVF-doxygen/html/html/classSVF_1_1FSMPTA.html +25 -25
  36. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +3 -5
  37. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +2 -2
  38. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC.html +2 -2
  39. package/SVF-doxygen/html/html/classSVF_1_1FormalINSVFGNode-members.html +2 -2
  40. package/SVF-doxygen/html/html/classSVF_1_1FormalINSVFGNode.html +7 -7
  41. package/SVF-doxygen/html/html/classSVF_1_1FormalOUTSVFGNode-members.html +2 -2
  42. package/SVF-doxygen/html/html/classSVF_1_1FormalOUTSVFGNode.html +7 -7
  43. package/SVF-doxygen/html/html/classSVF_1_1IndirectSVFGEdge-members.html +3 -3
  44. package/SVF-doxygen/html/html/classSVF_1_1IndirectSVFGEdge.html +20 -20
  45. package/SVF-doxygen/html/html/classSVF_1_1InterMSSAPHISVFGNode-members.html +2 -2
  46. package/SVF-doxygen/html/html/classSVF_1_1InterMSSAPHISVFGNode.html +5 -5
  47. package/SVF-doxygen/html/html/classSVF_1_1IntraIndSVFGEdge-members.html +2 -2
  48. package/SVF-doxygen/html/html/classSVF_1_1IntraIndSVFGEdge.html +5 -5
  49. package/SVF-doxygen/html/html/classSVF_1_1IntraMSSAPHISVFGNode-members.html +2 -2
  50. package/SVF-doxygen/html/html/classSVF_1_1IntraMSSAPHISVFGNode.html +5 -5
  51. package/SVF-doxygen/html/html/classSVF_1_1MRSVFGNode-members.html +2 -2
  52. package/SVF-doxygen/html/html/classSVF_1_1MRSVFGNode.html +12 -12
  53. package/SVF-doxygen/html/html/classSVF_1_1MSSAPHISVFGNode-members.html +2 -2
  54. package/SVF-doxygen/html/html/classSVF_1_1MSSAPHISVFGNode.html +7 -7
  55. package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +106 -104
  56. package/SVF-doxygen/html/html/classSVF_1_1MTAStat.html +3 -3
  57. package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +1 -1
  58. package/SVF-doxygen/html/html/classSVF_1_1RetIndSVFGEdge-members.html +2 -2
  59. package/SVF-doxygen/html/html/classSVF_1_1RetIndSVFGEdge.html +5 -5
  60. package/SVF-doxygen/html/html/classSVF_1_1SVFG.html +11 -11
  61. package/SVF-doxygen/html/html/classSVF_1_1SVFGNodeLockSpan.html +23 -23
  62. package/SVF-doxygen/html/html/classSVF_1_1SVFGOPT.html +6 -6
  63. package/SVF-doxygen/html/html/classSVF_1_1SVFGStat.html +2 -2
  64. package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder-members.html +3 -3
  65. package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +43 -43
  66. package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +2 -2
  67. package/SVF-doxygen/html/html/classSVF_1_1ThreadMHPIndSVFGEdge-members.html +2 -2
  68. package/SVF-doxygen/html/html/classSVF_1_1ThreadMHPIndSVFGEdge.html +5 -5
  69. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +9 -9
  70. package/SVF-doxygen/html/html/classes.html +93 -92
  71. package/SVF-doxygen/html/html/functions_a.html +1 -1
  72. package/SVF-doxygen/html/html/functions_c.html +24 -19
  73. package/SVF-doxygen/html/html/functions_f.html +6 -6
  74. package/SVF-doxygen/html/html/functions_func.html +1 -1
  75. package/SVF-doxygen/html/html/functions_func_c.html +20 -17
  76. package/SVF-doxygen/html/html/functions_func_g.html +2 -2
  77. package/SVF-doxygen/html/html/functions_func_o.html +2 -1
  78. package/SVF-doxygen/html/html/functions_g.html +3 -3
  79. package/SVF-doxygen/html/html/functions_i.html +3 -3
  80. package/SVF-doxygen/html/html/functions_l.html +3 -3
  81. package/SVF-doxygen/html/html/functions_n.html +1 -1
  82. package/SVF-doxygen/html/html/functions_o.html +5 -4
  83. package/SVF-doxygen/html/html/functions_p.html +14 -16
  84. package/SVF-doxygen/html/html/functions_r.html +3 -7
  85. package/SVF-doxygen/html/html/functions_s.html +10 -12
  86. package/SVF-doxygen/html/html/functions_type_n.html +1 -1
  87. package/SVF-doxygen/html/html/functions_u.html +3 -3
  88. package/SVF-doxygen/html/html/functions_v.html +3 -3
  89. package/SVF-doxygen/html/html/functions_vars_c.html +2 -2
  90. package/SVF-doxygen/html/html/functions_vars_g.html +1 -1
  91. package/SVF-doxygen/html/html/hierarchy.html +165 -164
  92. package/SVF-doxygen/html/html/search/all_1.js +1 -1
  93. package/SVF-doxygen/html/html/search/all_10.js +10 -10
  94. package/SVF-doxygen/html/html/search/all_12.js +1 -1
  95. package/SVF-doxygen/html/html/search/all_13.js +7 -7
  96. package/SVF-doxygen/html/html/search/all_14.js +3 -3
  97. package/SVF-doxygen/html/html/search/all_15.js +2 -2
  98. package/SVF-doxygen/html/html/search/all_16.js +1 -1
  99. package/SVF-doxygen/html/html/search/all_3.js +3 -2
  100. package/SVF-doxygen/html/html/search/all_6.js +2 -2
  101. package/SVF-doxygen/html/html/search/all_7.js +2 -2
  102. package/SVF-doxygen/html/html/search/all_8.js +1 -0
  103. package/SVF-doxygen/html/html/search/all_9.js +1 -1
  104. package/SVF-doxygen/html/html/search/all_c.js +1 -1
  105. package/SVF-doxygen/html/html/search/all_d.js +1 -1
  106. package/SVF-doxygen/html/html/search/all_e.js +5 -5
  107. package/SVF-doxygen/html/html/search/all_f.js +1 -1
  108. package/SVF-doxygen/html/html/search/classes_7.js +1 -0
  109. package/SVF-doxygen/html/html/search/functions_0.js +1 -1
  110. package/SVF-doxygen/html/html/search/functions_2.js +2 -1
  111. package/SVF-doxygen/html/html/search/functions_6.js +1 -1
  112. package/SVF-doxygen/html/html/search/functions_d.js +1 -1
  113. package/SVF-doxygen/html/html/search/typedefs_d.js +1 -1
  114. package/SVF-doxygen/html/html/search/variables_14.js +2 -2
  115. package/SVF-doxygen/html/html/search/variables_15.js +1 -1
  116. package/SVF-doxygen/html/html/search/variables_3.js +1 -1
  117. package/SVF-doxygen/html/html/search/variables_7.js +1 -1
  118. package/SVF-doxygen/html/html/search/variables_d.js +1 -1
  119. package/SVF-doxygen/html/html/search/variables_e.js +2 -2
  120. package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1CondStdSet_3_01Element_01_4_01_4-members.html +81 -0
  121. package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1CondStdSet_3_01Element_01_4_01_4.html +131 -0
  122. package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1CondVar_3_01Cond_01_4_01_4.html +3 -3
  123. package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1SVFGNodeLockSpan_01_4.html +3 -3
  124. package/SVF-doxygen/html/html/structstd_1_1hash_3_01const_01SVF_1_1CondVar_3_01Cond_01_4_01_4.html +3 -3
  125. package/include/DDA/DDAVFSolver.h +1 -1
  126. package/include/Graphs/SVFGEdge.h +3 -3
  127. package/include/Graphs/SVFGNode.h +2 -2
  128. package/include/MTA/FSMPTA.h +1 -0
  129. package/include/MemoryModel/ConditionalPT.h +21 -5
  130. package/include/SABER/SaberSVFGBuilder.h +3 -3
  131. package/lib/Graphs/SVFGStat.cpp +1 -1
  132. package/lib/Graphs/ThreadCallGraph.cpp +4 -4
  133. package/lib/MTA/FSMPTA.cpp +7 -7
  134. package/lib/MemoryModel/PointerAnalysis.cpp +1 -1
  135. package/lib/SABER/SaberSVFGBuilder.cpp +2 -1
  136. package/lib/WPA/FlowSensitive.cpp +2 -2
  137. package/lib/WPA/FlowSensitiveTBHC.cpp +2 -2
  138. package/lib/WPA/VersionedFlowSensitive.cpp +1 -1
  139. package/package.json +1 -1
@@ -44,7 +44,7 @@ class SaberSVFGBuilder : public SVFGBuilder
44
44
 
45
45
  public:
46
46
  typedef Set<const SVFGNode*> SVFGNodeSet;
47
- typedef Map<NodeID, NodeBS> NodeToPTSSMap;
47
+ typedef Map<NodeID, PointsTo> NodeToPTSSMap;
48
48
  typedef FIFOWorkList<NodeID> WorkList;
49
49
 
50
50
  /// Constructor
@@ -94,9 +94,9 @@ private:
94
94
  bool accessGlobal(BVDataPTAImpl* pta,const PAGNode* pagNode);
95
95
 
96
96
  /// Collect objects along points-to chains
97
- NodeBS& CollectPtsChain(BVDataPTAImpl* pta,NodeID id, NodeToPTSSMap& cachedPtsMap);
97
+ PointsTo& CollectPtsChain(BVDataPTAImpl* pta,NodeID id, NodeToPTSSMap& cachedPtsMap);
98
98
 
99
- NodeBS globs;
99
+ PointsTo globs;
100
100
  /// Store all global SVFG nodes
101
101
  SVFGNodeSet globSVFGNodes;
102
102
  };
@@ -321,7 +321,7 @@ void SVFGStat::calculateNodeDegrees(SVFGNode* node, NodeSet& nodeHasIndInEdge, N
321
321
  nodeHasIndInEdge.insert(node->getId());
322
322
  // get edge's weight
323
323
  // TODO: try a new method to calculate weight.
324
- const PointsTo& cpts = edge->getPointsTo();
324
+ const NodeBS& cpts = edge->getPointsTo();
325
325
  avgWeight += cpts.count();
326
326
  totalIndEdgeLabels += cpts.count();
327
327
  }
@@ -74,8 +74,8 @@ void ThreadCallGraph::updateCallGraph(PointerAnalysis* pta)
74
74
  if(SVFUtil::dyn_cast<Function>(forkedval)==nullptr)
75
75
  {
76
76
  PAG* pag = pta->getPAG();
77
- const PointsTo& targets = pta->getPts(pag->getValueNode(forkedval));
78
- for (PointsTo::iterator ii = targets.begin(), ie = targets.end(); ii != ie; ii++)
77
+ const NodeBS targets = pta->getPts(pag->getValueNode(forkedval));
78
+ for (NodeBS::iterator ii = targets.begin(), ie = targets.end(); ii != ie; ii++)
79
79
  {
80
80
  if(ObjPN* objPN = SVFUtil::dyn_cast<ObjPN>(pag->getPAGNode(*ii)))
81
81
  {
@@ -98,8 +98,8 @@ void ThreadCallGraph::updateCallGraph(PointerAnalysis* pta)
98
98
  if(SVFUtil::dyn_cast<Function>(forkedval)==nullptr)
99
99
  {
100
100
  PAG* pag = pta->getPAG();
101
- const PointsTo& targets = pta->getPts(pag->getValueNode(forkedval));
102
- for (PointsTo::iterator ii = targets.begin(), ie = targets.end(); ii != ie; ii++)
101
+ const NodeBS targets = pta->getPts(pag->getValueNode(forkedval));
102
+ for (NodeBS::iterator ii = targets.begin(), ie = targets.end(); ii != ie; ii++)
103
103
  {
104
104
  if(ObjPN* objPN = SVFUtil::dyn_cast<ObjPN>(pag->getPAGNode(*ii)))
105
105
  {
@@ -141,12 +141,12 @@ void MTASVFGBuilder::performRemovingMHPEdges()
141
141
  if (edge->isIndirectVFGEdge() && (edge->getDstNode()==n2))
142
142
  {
143
143
  IndirectSVFGEdge* e = SVFUtil::cast<IndirectSVFGEdge>(edge);
144
- const PointsTo& pts = e->getPointsTo();
145
- for (NodeBS::iterator o = remove_pts.begin(), eo = remove_pts.end(); o != eo; ++o)
144
+ const NodeBS& pts = e->getPointsTo();
145
+ for (PointsTo::iterator o = remove_pts.begin(), eo = remove_pts.end(); o != eo; ++o)
146
146
  {
147
- if (const_cast<PointsTo&>(pts).test(*o))
147
+ if (const_cast<NodeBS&>(pts).test(*o))
148
148
  {
149
- const_cast<PointsTo&>(pts).reset(*o);
149
+ const_cast<NodeBS&>(pts).reset(*o);
150
150
  MTASVFGBuilder::numOfRemovedPTS ++;
151
151
  }
152
152
  }
@@ -406,7 +406,7 @@ MTASVFGBuilder::SVFGNodeIDSet MTASVFGBuilder::getSuccNodes(const StmtSVFGNode* n
406
406
  if (edge->isIndirectVFGEdge())
407
407
  {
408
408
  IndirectSVFGEdge* e = SVFUtil::cast<IndirectSVFGEdge>(edge);
409
- PointsTo pts = e->getPointsTo();
409
+ NodeBS pts = e->getPointsTo();
410
410
  if(pts.test(o))
411
411
  worklist.insert(edge->getDstNode());
412
412
  }
@@ -427,7 +427,7 @@ MTASVFGBuilder::SVFGNodeIDSet MTASVFGBuilder::getSuccNodes(const StmtSVFGNode* n
427
427
  if (edge->isIndirectVFGEdge() && visited.find(edge->getDstNode()) == visited.end())
428
428
  {
429
429
  IndirectSVFGEdge* e = SVFUtil::cast<IndirectSVFGEdge>(edge);
430
- PointsTo pts = e->getPointsTo();
430
+ NodeBS pts = e->getPointsTo();
431
431
  if(pts.test(o))
432
432
  worklist.insert(edge->getDstNode());
433
433
  }
@@ -649,7 +649,7 @@ void MTASVFGBuilder::readPrecision()
649
649
  const StmtSVFGNode* n2 = SVFUtil::cast<StmtSVFGNode>(edge->getSrcNode());
650
650
 
651
651
  IndirectSVFGEdge* e = SVFUtil::cast<IndirectSVFGEdge>(edge);
652
- PointsTo pts = e->getPointsTo();
652
+ NodeBS pts = e->getPointsTo();
653
653
  PointsTo remove_pts;
654
654
 
655
655
  for (NodeBS::iterator o = pts.begin(), eo = pts.end(); o != eo; ++o)
@@ -345,7 +345,7 @@ void PointerAnalysis::dumpPts(NodeID ptr, const PointsTo& pts)
345
345
 
346
346
  outs() << "";
347
347
 
348
- for (NodeBS::iterator it = pts.begin(), eit = pts.end(); it != eit; ++it)
348
+ for (PointsTo::iterator it = pts.begin(), eit = pts.end(); it != eit; ++it)
349
349
  {
350
350
  const PAGNode* node = pag->getPAGNode(*it);
351
351
  if(SVFUtil::isa<ObjPN>(node) == false)
@@ -29,6 +29,7 @@
29
29
 
30
30
  #include "SABER/SaberSVFGBuilder.h"
31
31
  #include "SABER/SaberCheckerAPI.h"
32
+ #include "MemoryModel/PointerAnalysisImpl.h"
32
33
  #include "Graphs/SVFG.h"
33
34
 
34
35
  using namespace SVF;
@@ -97,7 +98,7 @@ void SaberSVFGBuilder::collectGlobals(BVDataPTAImpl* pta)
97
98
  }
98
99
  }
99
100
 
100
- NodeBS& SaberSVFGBuilder::CollectPtsChain(BVDataPTAImpl* pta,NodeID id, NodeToPTSSMap& cachedPtsMap)
101
+ PointsTo& SaberSVFGBuilder::CollectPtsChain(BVDataPTAImpl* pta,NodeID id, NodeToPTSSMap& cachedPtsMap)
101
102
  {
102
103
  PAG* pag = svfg->getPAG();
103
104
 
@@ -326,7 +326,7 @@ bool FlowSensitive::propAlongIndirectEdge(const IndirectSVFGEdge* edge)
326
326
 
327
327
  // Get points-to targets may be used by next SVFG node.
328
328
  // Propagate points-to set for node used in dst.
329
- const PointsTo& pts = edge->getPointsTo();
329
+ const NodeBS& pts = edge->getPointsTo();
330
330
  for (PointsTo::iterator ptdIt = pts.begin(), ptdEit = pts.end(); ptdIt != ptdEit; ++ptdIt)
331
331
  {
332
332
  NodeID ptd = *ptdIt;
@@ -703,7 +703,7 @@ void FlowSensitive::updateConnectedNodes(const SVFGEdgeSetTy& edges)
703
703
 
704
704
  SVFGNode* srcNode = edge->getSrcNode();
705
705
 
706
- const PointsTo& pts = SVFUtil::cast<IndirectSVFGEdge>(edge)->getPointsTo();
706
+ const NodeBS& pts = SVFUtil::cast<IndirectSVFGEdge>(edge)->getPointsTo();
707
707
  for (PointsTo::iterator ptdIt = pts.begin(), ptdEit = pts.end(); ptdIt != ptdEit; ++ptdIt)
708
708
  {
709
709
  NodeID ptd = *ptdIt;
@@ -96,11 +96,11 @@ bool FlowSensitiveTBHC::propAlongIndirectEdge(const IndirectSVFGEdge* edge)
96
96
 
97
97
  // Get points-to targets may be used by next SVFG node.
98
98
  // Propagate points-to set for node used in dst.
99
- const PointsTo& pts = edge->getPointsTo();
99
+ const NodeBS & pts = edge->getPointsTo();
100
100
 
101
101
  // Since the base Andersen's analysis does NOT perform type-based heap cloning,
102
102
  // it uses only the base objects; we want to account for clones too.
103
- PointsTo edgePtsAndClones;
103
+ NodeBS edgePtsAndClones;
104
104
 
105
105
  // TODO: the conditional bool may be unnecessary.
106
106
  // Adding all clones is redundant, and introduces too many calls to propVarPts...
@@ -391,7 +391,7 @@ void VersionedFlowSensitive::updateConnectedNodes(const SVFGEdgeSetTy& newEdges)
391
391
  const IndirectSVFGEdge *ie = SVFUtil::dyn_cast<IndirectSVFGEdge>(e);
392
392
  assert(ie != nullptr && "VFS::updateConnectedNodes: given direct edge?");
393
393
 
394
- const PointsTo &ept = ie->getPointsTo();
394
+ const NodeBS &ept = ie->getPointsTo();
395
395
  // For every o, such that src --o--> dst, we need to set up reliance (and propagate).
396
396
  for (const NodeID o : ept)
397
397
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svf-tools",
3
- "version": "1.0.286",
3
+ "version": "1.0.287",
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": {