svf-tools 1.0.301 → 1.0.302
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.
|
@@ -66,7 +66,7 @@ $(function() {
|
|
|
66
66
|
<div class="title">SrcSnkDDA.cpp</div> </div>
|
|
67
67
|
</div><!--header-->
|
|
68
68
|
<div class="contents">
|
|
69
|
-
<a href="SrcSnkDDA_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">//===- SrcSnkDDA.cpp -- Source-sink analyzer --------------------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">// SVF: Static Value-Flow Analysis</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">// Copyright (C) <2013-2017> <Yulei Sui></span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">//</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> </div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">// This program is free software: you can redistribute it and/or modify</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">// it under the terms of the GNU General Public License as published by</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">// the Free Software Foundation, either version 3 of the License, or</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">// (at your option) any later version.</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> </div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">// This program is distributed in the hope that it will be useful,</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="comment">// GNU General Public License for more details.</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="comment">// You should have received a copy of the GNU General Public License</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="comment">// along with this program. If not, see <http://www.gnu.org/licenses/>.</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="comment">//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> </div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="comment">/*</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment"> * SrcSnkDDA.cpp</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="comment"> *</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment"> * Created on: Apr 1, 2014</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="comment"> * Author: Yulei Sui</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment"> */</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> </div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> </div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="preprocessor">#include "<a class="code" href="SrcSnkDDA_8h.html">SABER/SrcSnkDDA.h</a>"</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="preprocessor">#include "<a class="code" href="SVFGStat_8h.html">Graphs/SVFGStat.h</a>"</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="preprocessor">#include "<a class="code" href="PAGBuilder_8h.html">SVF-FE/PAGBuilder.h</a>"</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="preprocessor">#include "<a class="code" href="Andersen_8h.html">WPA/Andersen.h</a>"</span></div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> </div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <span class="keyword">using namespace </span>SVFUtil;</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> </div><div class="line"><a name="l00042"></a><span class="lineno"><a class="line" href="classSVF_1_1SrcSnkDDA.html#a8883b9a42106ed8c55835d2ba9a579cd"> 42</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SrcSnkDDA.html#a8883b9a42106ed8c55835d2ba9a579cd">SrcSnkDDA::initialize</a>(<a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>* module)</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> {</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  <a class="code" href="classSVF_1_1PAGBuilder.html">PAGBuilder</a> builder;</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  <a class="code" href="classSVF_1_1PAG.html">PAG</a>* pag = builder.<a class="code" href="classSVF_1_1PAGBuilder.html#a757ab2c9481467842e1ad4c46a1f6291">build</a>(module);</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> </div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <a class="code" href="classSVF_1_1AndersenWaveDiff.html">AndersenWaveDiff</a>* ander = <a class="code" href="classSVF_1_1AndersenWaveDiff.html#a74134978db1c0d9c71122bc63f4b73c1">AndersenWaveDiff::createAndersenWaveDiff</a>(pag);</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1Options.html#a5fb7733fd66ecad30eea8ced3839e590">Options::SABERFULLSVFG</a>)</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  svfg = memSSA.buildFullSVFGWithoutOPT(ander);</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  svfg = memSSA.buildPTROnlySVFG(ander);</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  setGraph(memSSA.getSVFG());</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  ptaCallGraph = ander-><a class="code" href="classSVF_1_1PointerAnalysis.html#a7c9b7e5fe37ae31ba84d167945ca57df">getPTACallGraph</a>();</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  <span class="comment">//AndersenWaveDiff::releaseAndersenWaveDiff();</span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> <span class="comment"></span> getPathAllocator()->allocate(getPAG()->getModule());</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span> </div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  initSrcs();</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  initSnks();</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> }</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span> </div><div class="line"><a name="l00062"></a><span class="lineno"><a class="line" href="classSVF_1_1SrcSnkDDA.html#ac12d813bcba4ec70de5e9048bbe16afc"> 62</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SrcSnkDDA.html#ac12d813bcba4ec70de5e9048bbe16afc">SrcSnkDDA::analyze</a>(<a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>* module)</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span> {</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span> </div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  initialize(module);</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span> </div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <a class="code" href="classSVF_1_1ContextCond.html#a92e89bbae0f31bb9eb971ab3edcc8071">ContextCond::setMaxCxtLen</a>(<a class="code" href="classSVF_1_1Options.html#a21cbaab292e9f5bd39109f774fcc88d4">Options::CxtLimit</a>);</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span> </div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SrcSnkDDA.html#ad6935e27bbd95d26a01b22b879efed58">SVFGNodeSetIter</a> iter = sourcesBegin(), eiter = sourcesEnd();</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  iter != eiter; ++iter)</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  {</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  setCurSlice(*iter);</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span> </div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"Analysing slice:"</span> << (*iter)->getId() << <span class="stringliteral">")\n"</span>);</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  <a class="code" href="classSVF_1_1ContextCond.html">ContextCond</a> cxt;</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  <a class="code" href="classSVF_1_1CxtDPItem.html">DPIm</a> item((*iter)->getId(),cxt);</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  forwardTraverse(item);</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span> </div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  <span class="keywordflow">if</span> (getCurSlice()->isReachGlobal())</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  {</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a817abc424f7cfcdec5954c7807970f36">DSaber</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"Forward analysis reaches globals for slice:"</span> << (*iter)->getId() << <span class="stringliteral">")\n"</span>);</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  }</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  {</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a817abc424f7cfcdec5954c7807970f36">DSaber</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"Forward process for slice:"</span> << (*iter)->getId() << <span class="stringliteral">" (size = "</span> << getCurSlice()->getForwardSliceSize() << <span class="stringliteral">")\n"</span>);</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span> </div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SrcSnkDDA.html#ad6935e27bbd95d26a01b22b879efed58">SVFGNodeSetIter</a> sit = getCurSlice()->sinksBegin(), esit =</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  getCurSlice()->sinksEnd(); sit != esit; ++sit)</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  {</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  <a class="code" href="classSVF_1_1ContextCond.html">ContextCond</a> cxt;</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  <a class="code" href="classSVF_1_1CxtDPItem.html">DPIm</a> item((*sit)->getId(),cxt);</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  backwardTraverse(item);</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  }</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span> </div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a817abc424f7cfcdec5954c7807970f36">DSaber</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"Backward process for slice:"</span> << (*iter)->getId() << <span class="stringliteral">" (size = "</span> << getCurSlice()->getBackwardSliceSize() << <span class="stringliteral">")\n"</span>);</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span> </div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1Options.html#ace1f2368a0a466f98c9e53def47db3ab">Options::DumpSlice</a>)</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  annotateSlice(_curSlice);</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span> </div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  <span class="keywordflow">if</span>(_curSlice->AllPathReachableSolve())</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  _curSlice->setAllReachable();</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span> </div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a817abc424f7cfcdec5954c7807970f36">DSaber</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"Guard computation for slice:"</span> << (*iter)->getId() << <span class="stringliteral">")\n"</span>);</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  }</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span> </div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  reportBug(getCurSlice());</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  }</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span> </div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  finalize();</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span> }</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span> </div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span> </div><div class="line"><a name="l00119"></a><span class="lineno"><a class="line" href="classSVF_1_1SrcSnkDDA.html#afc75e55af839ef535d80555fd422342c"> 119</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SrcSnkDDA.html#afc75e55af839ef535d80555fd422342c">SrcSnkDDA::isInAWrapper</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* src, <a class="code" href="classSVF_1_1SrcSnkDDA.html#af254f2a00cabb91c61a0a592bdb7f0f1">CallSiteSet</a>& csIdSet)</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span> {</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span> </div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  <span class="keywordtype">bool</span> reachFunExit = <span class="keyword">false</span>;</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span> </div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <a class="code" href="classSVF_1_1FIFOWorkList.html">WorkList</a> worklist;</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#ad4c6a48b60c870d63049fe7272cc7eb8">push</a>(src);</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <a class="code" href="classSVF_1_1SrcSnkDDA.html#a70cff8ea7c033c01400935c9e446f2c6">SVFGNodeBS</a> visited;</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> step = 0;</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="keywordflow">while</span> (!worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#a7056704c224dfb4b57287fe90c004aa8">empty</a>())</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  {</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* node = worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#a8fa72918fce7e9c0b2dc34b683a797c6">pop</a>();</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span> </div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <span class="keywordflow">if</span>(visited.test(node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>())==0)</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  visited.set(node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  <span class="comment">// reaching maximum steps when traversing on SVFG to identify a memory allocation wrapper</span></div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  <span class="keywordflow">if</span> (step++ > <a class="code" href="classSVF_1_1Options.html#a0b82f16ee0c7e6566a6ae20662525e84">Options::MaxStepInWrapper</a>)</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span> </div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1VFGNode.html#a3c558955f60c237c558d8faafed781e8">SVFGNode::const_iterator</a> it = node-><a class="code" href="classSVF_1_1GenericNode.html#aa4f103330118c8976bf95e4bf53416eb">OutEdgeBegin</a>(), eit =</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  node-><a class="code" href="classSVF_1_1GenericNode.html#a19a3366fd8a58290d0c740c46c3dcb3d">OutEdgeEnd</a>(); it != eit; ++it)</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  {</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge = (*it);</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  <span class="comment">//assert(edge->isDirectVFGEdge() && "the edge should always be direct VF");</span></div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  <span class="comment">// if this is a call edge</span></div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  <span class="keywordflow">if</span>(edge-><a class="code" href="classSVF_1_1VFGEdge.html#a92e3da59f7f5a693945b9a93f169da04">isCallDirectVFGEdge</a>())</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  {</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  }</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  <span class="comment">// if this is a return edge</span></div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(edge-><a class="code" href="classSVF_1_1VFGEdge.html#a49cbf2a714c9b965b19452d266cd8bdf">isRetDirectVFGEdge</a>())</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  {</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  reachFunExit = <span class="keyword">true</span>;</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  csIdSet.insert(getSVFG()->getCallSite(SVFUtil::cast<RetDirSVFGEdge>(edge)->getCallSiteId()));</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  }</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  <span class="comment">// (1) an intra direct edge, we will keep tracking</span></div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  <span class="comment">// (2) an intra indirect edge, we only track if the succ SVFGNode is a load, which means we only track one level store-load pair .</span></div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <span class="comment">// (3) do not track for all other interprocedural edges.</span></div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  {</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* succ = edge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>();</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  <span class="keywordflow">if</span>(SVFUtil::isa<IntraDirSVFGEdge>(edge)){</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  <span class="keywordflow">if</span> (SVFUtil::isa<CopySVFGNode>(succ) || SVFUtil::isa<GepSVFGNode>(succ)</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  || SVFUtil::isa<PHISVFGNode>(succ) || SVFUtil::isa<FormalRetSVFGNode>(succ)</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  || SVFUtil::isa<ActualRetSVFGNode>(succ) || SVFUtil::isa<StoreSVFGNode>(succ))</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  {</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#ad4c6a48b60c870d63049fe7272cc7eb8">push</a>(succ);</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  }</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  }</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(SVFUtil::isa<IntraIndSVFGEdge>(edge))</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  {</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="keywordflow">if</span>(SVFUtil::isa<LoadSVFGNode>(succ))</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  {</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#ad4c6a48b60c870d63049fe7272cc7eb8">push</a>(succ);</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  }</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  }</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  }</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  }</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  }</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <span class="keywordflow">if</span>(reachFunExit)</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span> }</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span> </div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span> </div><div class="line"><a name="l00192"></a><span class="lineno"><a class="line" href="classSVF_1_1SrcSnkDDA.html#ad2203ca5bd08c6fbebd31a8a010edebb"> 192</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SrcSnkDDA.html#ad2203ca5bd08c6fbebd31a8a010edebb">SrcSnkDDA::FWProcessOutgoingEdge</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtDPItem.html">DPIm</a>& item, <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge)</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span> {</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a817abc424f7cfcdec5954c7807970f36">DSaber</a>,<a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"\n##processing source: "</span> << getCurSlice()->getSource()->getId() <<<span class="stringliteral">" forward propagate from ("</span> << edge-><a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>());</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span> </div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  <span class="comment">// for indirect SVFGEdge, the propagation should follow the def-use chains</span></div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  <span class="comment">// points-to on the edge indicate whether the object of source node can be propagated</span></div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span> </div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* dstNode = edge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>();</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  <a class="code" href="classSVF_1_1CxtDPItem.html">DPIm</a> newItem(dstNode->getId(),item.<a class="code" href="classSVF_1_1CxtDPItem.html#a1dea25cd5d72c52cef1cff23b832a196">getContexts</a>());</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span> </div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  <span class="keywordflow">if</span>(isGlobalSVFGNode(dstNode) || getCurSlice()->isReachGlobal())</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  {</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  getCurSlice()->setReachGlobal();</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  }</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span> </div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span> </div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <span class="comment">// push context for calling</span></div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  <span class="keywordflow">if</span> (edge-><a class="code" href="classSVF_1_1VFGEdge.html#a4352297ef44c4eff1efe2f348cce6fe9">isCallVFGEdge</a>())</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  {</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <a class="code" href="namespaceSVF.html#a03d88a0302bcd253387690f13f693f64">CallSiteID</a> csId = 0;</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallDirSVFGEdge.html">CallDirSVFGEdge</a>* callEdge = SVFUtil::dyn_cast<CallDirSVFGEdge>(edge))</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  csId = callEdge->getCallSiteId();</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  csId = SVFUtil::cast<CallIndSVFGEdge>(edge)->getCallSiteId();</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span> </div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  newItem.pushContext(csId);</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a817abc424f7cfcdec5954c7807970f36">DSaber</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">" push cxt ["</span> << csId << <span class="stringliteral">"] "</span>);</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  }</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <span class="comment">// match context for return</span></div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (edge-><a class="code" href="classSVF_1_1VFGEdge.html#a3937eef974c3953f1d1e7d64c5a24ff3">isRetVFGEdge</a>())</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  {</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <a class="code" href="namespaceSVF.html#a03d88a0302bcd253387690f13f693f64">CallSiteID</a> csId = 0;</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1RetDirSVFGEdge.html">RetDirSVFGEdge</a>* callEdge = SVFUtil::dyn_cast<RetDirSVFGEdge>(edge))</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  csId = callEdge->getCallSiteId();</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  csId = SVFUtil::cast<RetIndSVFGEdge>(edge)->getCallSiteId();</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span> </div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  <span class="keywordflow">if</span> (newItem.matchContext(csId) == <span class="keyword">false</span>)</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  {</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a817abc424f7cfcdec5954c7807970f36">DSaber</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"-|-\n"</span>);</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  }</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a817abc424f7cfcdec5954c7807970f36">DSaber</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">" pop cxt ["</span> << csId << <span class="stringliteral">"] "</span>);</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  }</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span> </div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <span class="keywordflow">if</span>(forwardVisited(dstNode,newItem))</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  {</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a817abc424f7cfcdec5954c7807970f36">DSaber</a>,<a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">" node "</span><< dstNode->getId() <<<span class="stringliteral">" has been visited\n"</span>);</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  }</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  addForwardVisited(dstNode, newItem);</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span> </div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  <span class="keywordflow">if</span>(pushIntoWorklist(newItem))</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a817abc424f7cfcdec5954c7807970f36">DSaber</a>,<a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">" --> "</span> << edge-><a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>() << <span class="stringliteral">", cxt size: "</span> << newItem.getContexts().cxtSize() <<<span class="stringliteral">")\n"</span>);</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span> </div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span> }</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span> </div><div class="line"><a name="l00257"></a><span class="lineno"><a class="line" href="classSVF_1_1SrcSnkDDA.html#a1ea0d4c4e53ff6986dd50d624ba2bff5"> 257</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SrcSnkDDA.html#a1ea0d4c4e53ff6986dd50d624ba2bff5">SrcSnkDDA::BWProcessIncomingEdge</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtDPItem.html">DPIm</a>&, <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge)</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span> {</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a817abc424f7cfcdec5954c7807970f36">DSaber</a>,<a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"backward propagate from ("</span> << edge-><a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>() << <span class="stringliteral">" --> "</span> << edge-><a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>() << <span class="stringliteral">")\n"</span>);</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* srcNode = edge-><a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>();</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <span class="keywordflow">if</span>(backwardVisited(srcNode))</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  addBackwardVisited(srcNode);</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span> </div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <a class="code" href="classSVF_1_1ContextCond.html">ContextCond</a> cxt;</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  <a class="code" href="classSVF_1_1CxtDPItem.html">DPIm</a> newItem(srcNode->getId(), cxt);</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  pushIntoWorklist(newItem);</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span> }</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span> </div><div class="line"><a name="l00272"></a><span class="lineno"><a class="line" href="classSVF_1_1SrcSnkDDA.html#ab35c0d1f02c83a2c10717905f1abf5cd"> 272</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SrcSnkDDA.html#ab35c0d1f02c83a2c10717905f1abf5cd">SrcSnkDDA::setCurSlice</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* src)</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span> {</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  <span class="keywordflow">if</span>(_curSlice!=<span class="keyword">nullptr</span>)</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  {</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <span class="keyword">delete</span> _curSlice;</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  _curSlice = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  clearVisitedMap();</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  }</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span> </div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  _curSlice = <span class="keyword">new</span> <a class="code" href="classSVF_1_1ProgSlice.html">ProgSlice</a>(src,getPathAllocator(), getSVFG());</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span> }</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span> </div><div class="line"><a name="l00284"></a><span class="lineno"><a class="line" href="classSVF_1_1SrcSnkDDA.html#a8817604b20724703121e9466e5cdb4cd"> 284</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SrcSnkDDA.html#a8817604b20724703121e9466e5cdb4cd">SrcSnkDDA::annotateSlice</a>(<a class="code" href="classSVF_1_1ProgSlice.html">ProgSlice</a>* slice)</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span> {</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  getSVFG()->getStat()->addToSources(slice-><a class="code" href="classSVF_1_1ProgSlice.html#ac1dc48ea64a89ce37394a22e609a0cd0">getSource</a>());</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <span class="keywordflow">for</span>(<a class="code" href="classSVF_1_1SrcSnkDDA.html#ad6935e27bbd95d26a01b22b879efed58">SVFGNodeSetIter</a> it = slice-><a class="code" href="classSVF_1_1ProgSlice.html#adf620c97daed49735d21b485c448b4a2">sinksBegin</a>(), eit = slice-><a class="code" href="classSVF_1_1ProgSlice.html#a27636f096ec825c4d5cb1dca608afb31">sinksEnd</a>(); it!=eit; ++it )</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  getSVFG()->getStat()->addToSinks(*it);</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <span class="keywordflow">for</span>(<a class="code" href="classSVF_1_1SrcSnkDDA.html#ad6935e27bbd95d26a01b22b879efed58">SVFGNodeSetIter</a> it = slice-><a class="code" href="classSVF_1_1ProgSlice.html#ae482fcb138aaf345586a39daa34ff895">forwardSliceBegin</a>(), eit = slice-><a class="code" href="classSVF_1_1ProgSlice.html#add10d8fd041ac7e6eb611df8a6b1384b">forwardSliceEnd</a>(); it!=eit; ++it )</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  getSVFG()->getStat()->addToForwardSlice(*it);</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  <span class="keywordflow">for</span>(<a class="code" href="classSVF_1_1SrcSnkDDA.html#ad6935e27bbd95d26a01b22b879efed58">SVFGNodeSetIter</a> it = slice-><a class="code" href="classSVF_1_1ProgSlice.html#ab5810f8a7a994f0637c54b94d0367a89">backwardSliceBegin</a>(), eit = slice-><a class="code" href="classSVF_1_1ProgSlice.html#aed4bedc716a3e252e44a6f28e677d61c">backwardSliceEnd</a>(); it!=eit; ++it )</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  getSVFG()->getStat()->addToBackwardSlice(*it);</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span> }</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span> </div><div class="line"><a name="l00295"></a><span class="lineno"><a class="line" href="classSVF_1_1SrcSnkDDA.html#acae985068ff1c20fb81c4c9ba730aaba"> 295</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SrcSnkDDA.html#acae985068ff1c20fb81c4c9ba730aaba">SrcSnkDDA::dumpSlices</a>()</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span> {</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span> </div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1Options.html#ace1f2368a0a466f98c9e53def47db3ab">Options::DumpSlice</a>)</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  <span class="keyword">const_cast<</span><a class="code" href="classSVF_1_1SVFG.html">SVFG</a>*<span class="keyword">></span>(getSVFG())->dump(<span class="stringliteral">"Slice"</span>,<span class="keyword">true</span>);</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span> }</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span> </div><div class="line"><a name="l00302"></a><span class="lineno"><a class="line" href="classSVF_1_1SrcSnkDDA.html#ae3d665ff1e796348131e797eb0283bfb"> 302</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SrcSnkDDA.html#ae3d665ff1e796348131e797eb0283bfb">SrcSnkDDA::printBDDStat</a>()</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span> {</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span> </div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"BDD Mem usage: "</span> << getPathAllocator()->getMemUsage() << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"BDD Number: "</span> << getPathAllocator()->getCondNum() << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span> }</div><div class="ttc" id="Andersen_8h_html"><div class="ttname"><a href="Andersen_8h.html">Andersen.h</a></div></div>
|
|
69
|
+
<a href="SrcSnkDDA_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">//===- SrcSnkDDA.cpp -- Source-sink analyzer --------------------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">// SVF: Static Value-Flow Analysis</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">// Copyright (C) <2013-2017> <Yulei Sui></span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">//</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> </div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">// This program is free software: you can redistribute it and/or modify</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">// it under the terms of the GNU General Public License as published by</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">// the Free Software Foundation, either version 3 of the License, or</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">// (at your option) any later version.</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> </div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">// This program is distributed in the hope that it will be useful,</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="comment">// GNU General Public License for more details.</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="comment">// You should have received a copy of the GNU General Public License</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="comment">// along with this program. If not, see <http://www.gnu.org/licenses/>.</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="comment">//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> </div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="comment">/*</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment"> * SrcSnkDDA.cpp</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="comment"> *</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment"> * Created on: Apr 1, 2014</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="comment"> * Author: Yulei Sui</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment"> */</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> </div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> </div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="preprocessor">#include "<a class="code" href="SrcSnkDDA_8h.html">SABER/SrcSnkDDA.h</a>"</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="preprocessor">#include "<a class="code" href="SVFGStat_8h.html">Graphs/SVFGStat.h</a>"</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="preprocessor">#include "<a class="code" href="PAGBuilder_8h.html">SVF-FE/PAGBuilder.h</a>"</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="preprocessor">#include "<a class="code" href="Andersen_8h.html">WPA/Andersen.h</a>"</span></div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> </div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <span class="keyword">using namespace </span>SVFUtil;</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> </div><div class="line"><a name="l00042"></a><span class="lineno"><a class="line" href="classSVF_1_1SrcSnkDDA.html#a8883b9a42106ed8c55835d2ba9a579cd"> 42</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SrcSnkDDA.html#a8883b9a42106ed8c55835d2ba9a579cd">SrcSnkDDA::initialize</a>(<a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>* module)</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> {</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  <a class="code" href="classSVF_1_1PAGBuilder.html">PAGBuilder</a> builder;</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  <a class="code" href="classSVF_1_1PAG.html">PAG</a>* pag = builder.<a class="code" href="classSVF_1_1PAGBuilder.html#a757ab2c9481467842e1ad4c46a1f6291">build</a>(module);</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> </div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <a class="code" href="classSVF_1_1AndersenWaveDiff.html">AndersenWaveDiff</a>* ander = <a class="code" href="classSVF_1_1AndersenWaveDiff.html#a74134978db1c0d9c71122bc63f4b73c1">AndersenWaveDiff::createAndersenWaveDiff</a>(pag);</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1Options.html#a5fb7733fd66ecad30eea8ced3839e590">Options::SABERFULLSVFG</a>)</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  svfg = memSSA.buildFullSVFGWithoutOPT(ander);</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  svfg = memSSA.buildPTROnlySVFGWithoutOPT(ander);</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  setGraph(memSSA.getSVFG());</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  ptaCallGraph = ander-><a class="code" href="classSVF_1_1PointerAnalysis.html#a7c9b7e5fe37ae31ba84d167945ca57df">getPTACallGraph</a>();</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  <span class="comment">//AndersenWaveDiff::releaseAndersenWaveDiff();</span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> <span class="comment"></span> getPathAllocator()->allocate(getPAG()->getModule());</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span> </div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  initSrcs();</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  initSnks();</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> }</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span> </div><div class="line"><a name="l00062"></a><span class="lineno"><a class="line" href="classSVF_1_1SrcSnkDDA.html#ac12d813bcba4ec70de5e9048bbe16afc"> 62</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SrcSnkDDA.html#ac12d813bcba4ec70de5e9048bbe16afc">SrcSnkDDA::analyze</a>(<a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>* module)</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span> {</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span> </div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  initialize(module);</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span> </div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <a class="code" href="classSVF_1_1ContextCond.html#a92e89bbae0f31bb9eb971ab3edcc8071">ContextCond::setMaxCxtLen</a>(<a class="code" href="classSVF_1_1Options.html#a21cbaab292e9f5bd39109f774fcc88d4">Options::CxtLimit</a>);</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span> </div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SrcSnkDDA.html#ad6935e27bbd95d26a01b22b879efed58">SVFGNodeSetIter</a> iter = sourcesBegin(), eiter = sourcesEnd();</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  iter != eiter; ++iter)</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  {</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  setCurSlice(*iter);</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span> </div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"Analysing slice:"</span> << (*iter)->getId() << <span class="stringliteral">")\n"</span>);</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  <a class="code" href="classSVF_1_1ContextCond.html">ContextCond</a> cxt;</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  <a class="code" href="classSVF_1_1CxtDPItem.html">DPIm</a> item((*iter)->getId(),cxt);</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  forwardTraverse(item);</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span> </div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  <span class="keywordflow">if</span> (getCurSlice()->isReachGlobal())</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  {</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a817abc424f7cfcdec5954c7807970f36">DSaber</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"Forward analysis reaches globals for slice:"</span> << (*iter)->getId() << <span class="stringliteral">")\n"</span>);</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  }</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  {</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a817abc424f7cfcdec5954c7807970f36">DSaber</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"Forward process for slice:"</span> << (*iter)->getId() << <span class="stringliteral">" (size = "</span> << getCurSlice()->getForwardSliceSize() << <span class="stringliteral">")\n"</span>);</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span> </div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SrcSnkDDA.html#ad6935e27bbd95d26a01b22b879efed58">SVFGNodeSetIter</a> sit = getCurSlice()->sinksBegin(), esit =</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  getCurSlice()->sinksEnd(); sit != esit; ++sit)</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  {</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  <a class="code" href="classSVF_1_1ContextCond.html">ContextCond</a> cxt;</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  <a class="code" href="classSVF_1_1CxtDPItem.html">DPIm</a> item((*sit)->getId(),cxt);</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  backwardTraverse(item);</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  }</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span> </div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a817abc424f7cfcdec5954c7807970f36">DSaber</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"Backward process for slice:"</span> << (*iter)->getId() << <span class="stringliteral">" (size = "</span> << getCurSlice()->getBackwardSliceSize() << <span class="stringliteral">")\n"</span>);</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span> </div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1Options.html#ace1f2368a0a466f98c9e53def47db3ab">Options::DumpSlice</a>)</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  annotateSlice(_curSlice);</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span> </div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  <span class="keywordflow">if</span>(_curSlice->AllPathReachableSolve())</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  _curSlice->setAllReachable();</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span> </div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a817abc424f7cfcdec5954c7807970f36">DSaber</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"Guard computation for slice:"</span> << (*iter)->getId() << <span class="stringliteral">")\n"</span>);</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  }</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span> </div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  reportBug(getCurSlice());</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  }</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span> </div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  finalize();</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span> }</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span> </div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span> </div><div class="line"><a name="l00119"></a><span class="lineno"><a class="line" href="classSVF_1_1SrcSnkDDA.html#afc75e55af839ef535d80555fd422342c"> 119</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1SrcSnkDDA.html#afc75e55af839ef535d80555fd422342c">SrcSnkDDA::isInAWrapper</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* src, <a class="code" href="classSVF_1_1SrcSnkDDA.html#af254f2a00cabb91c61a0a592bdb7f0f1">CallSiteSet</a>& csIdSet)</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span> {</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span> </div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  <span class="keywordtype">bool</span> reachFunExit = <span class="keyword">false</span>;</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span> </div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <a class="code" href="classSVF_1_1FIFOWorkList.html">WorkList</a> worklist;</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#ad4c6a48b60c870d63049fe7272cc7eb8">push</a>(src);</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <a class="code" href="classSVF_1_1SrcSnkDDA.html#a70cff8ea7c033c01400935c9e446f2c6">SVFGNodeBS</a> visited;</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> step = 0;</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="keywordflow">while</span> (!worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#a7056704c224dfb4b57287fe90c004aa8">empty</a>())</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  {</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* node = worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#a8fa72918fce7e9c0b2dc34b683a797c6">pop</a>();</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span> </div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <span class="keywordflow">if</span>(visited.test(node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>())==0)</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  visited.set(node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  <span class="comment">// reaching maximum steps when traversing on SVFG to identify a memory allocation wrapper</span></div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  <span class="keywordflow">if</span> (step++ > <a class="code" href="classSVF_1_1Options.html#a0b82f16ee0c7e6566a6ae20662525e84">Options::MaxStepInWrapper</a>)</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span> </div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1VFGNode.html#a3c558955f60c237c558d8faafed781e8">SVFGNode::const_iterator</a> it = node-><a class="code" href="classSVF_1_1GenericNode.html#aa4f103330118c8976bf95e4bf53416eb">OutEdgeBegin</a>(), eit =</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  node-><a class="code" href="classSVF_1_1GenericNode.html#a19a3366fd8a58290d0c740c46c3dcb3d">OutEdgeEnd</a>(); it != eit; ++it)</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  {</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge = (*it);</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  <span class="comment">//assert(edge->isDirectVFGEdge() && "the edge should always be direct VF");</span></div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  <span class="comment">// if this is a call edge</span></div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  <span class="keywordflow">if</span>(edge-><a class="code" href="classSVF_1_1VFGEdge.html#a92e3da59f7f5a693945b9a93f169da04">isCallDirectVFGEdge</a>())</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  {</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  }</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  <span class="comment">// if this is a return edge</span></div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(edge-><a class="code" href="classSVF_1_1VFGEdge.html#a49cbf2a714c9b965b19452d266cd8bdf">isRetDirectVFGEdge</a>())</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  {</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  reachFunExit = <span class="keyword">true</span>;</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  csIdSet.insert(getSVFG()->getCallSite(SVFUtil::cast<RetDirSVFGEdge>(edge)->getCallSiteId()));</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  }</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  <span class="comment">// (1) an intra direct edge, we will keep tracking</span></div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  <span class="comment">// (2) an intra indirect edge, we only track if the succ SVFGNode is a load, which means we only track one level store-load pair .</span></div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <span class="comment">// (3) do not track for all other interprocedural edges.</span></div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  {</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* succ = edge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>();</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  <span class="keywordflow">if</span>(SVFUtil::isa<IntraDirSVFGEdge>(edge)){</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  <span class="keywordflow">if</span> (SVFUtil::isa<CopySVFGNode>(succ) || SVFUtil::isa<GepSVFGNode>(succ)</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  || SVFUtil::isa<PHISVFGNode>(succ) || SVFUtil::isa<FormalRetSVFGNode>(succ)</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  || SVFUtil::isa<ActualRetSVFGNode>(succ) || SVFUtil::isa<StoreSVFGNode>(succ))</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  {</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#ad4c6a48b60c870d63049fe7272cc7eb8">push</a>(succ);</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  }</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  }</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(SVFUtil::isa<IntraIndSVFGEdge>(edge))</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  {</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="keywordflow">if</span>(SVFUtil::isa<LoadSVFGNode>(succ))</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  {</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#ad4c6a48b60c870d63049fe7272cc7eb8">push</a>(succ);</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  }</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  }</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  }</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  }</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  }</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <span class="keywordflow">if</span>(reachFunExit)</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span> }</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span> </div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span> </div><div class="line"><a name="l00192"></a><span class="lineno"><a class="line" href="classSVF_1_1SrcSnkDDA.html#ad2203ca5bd08c6fbebd31a8a010edebb"> 192</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SrcSnkDDA.html#ad2203ca5bd08c6fbebd31a8a010edebb">SrcSnkDDA::FWProcessOutgoingEdge</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtDPItem.html">DPIm</a>& item, <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge)</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span> {</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a817abc424f7cfcdec5954c7807970f36">DSaber</a>,<a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"\n##processing source: "</span> << getCurSlice()->getSource()->getId() <<<span class="stringliteral">" forward propagate from ("</span> << edge-><a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>());</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span> </div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  <span class="comment">// for indirect SVFGEdge, the propagation should follow the def-use chains</span></div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  <span class="comment">// points-to on the edge indicate whether the object of source node can be propagated</span></div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span> </div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* dstNode = edge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>();</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  <a class="code" href="classSVF_1_1CxtDPItem.html">DPIm</a> newItem(dstNode->getId(),item.<a class="code" href="classSVF_1_1CxtDPItem.html#a1dea25cd5d72c52cef1cff23b832a196">getContexts</a>());</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span> </div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  <span class="keywordflow">if</span>(isGlobalSVFGNode(dstNode) || getCurSlice()->isReachGlobal())</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  {</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  getCurSlice()->setReachGlobal();</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  }</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span> </div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span> </div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <span class="comment">// push context for calling</span></div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  <span class="keywordflow">if</span> (edge-><a class="code" href="classSVF_1_1VFGEdge.html#a4352297ef44c4eff1efe2f348cce6fe9">isCallVFGEdge</a>())</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  {</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <a class="code" href="namespaceSVF.html#a03d88a0302bcd253387690f13f693f64">CallSiteID</a> csId = 0;</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallDirSVFGEdge.html">CallDirSVFGEdge</a>* callEdge = SVFUtil::dyn_cast<CallDirSVFGEdge>(edge))</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  csId = callEdge->getCallSiteId();</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  csId = SVFUtil::cast<CallIndSVFGEdge>(edge)->getCallSiteId();</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span> </div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  newItem.pushContext(csId);</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a817abc424f7cfcdec5954c7807970f36">DSaber</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">" push cxt ["</span> << csId << <span class="stringliteral">"] "</span>);</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  }</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <span class="comment">// match context for return</span></div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (edge-><a class="code" href="classSVF_1_1VFGEdge.html#a3937eef974c3953f1d1e7d64c5a24ff3">isRetVFGEdge</a>())</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  {</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <a class="code" href="namespaceSVF.html#a03d88a0302bcd253387690f13f693f64">CallSiteID</a> csId = 0;</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1RetDirSVFGEdge.html">RetDirSVFGEdge</a>* callEdge = SVFUtil::dyn_cast<RetDirSVFGEdge>(edge))</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  csId = callEdge->getCallSiteId();</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  csId = SVFUtil::cast<RetIndSVFGEdge>(edge)->getCallSiteId();</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span> </div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  <span class="keywordflow">if</span> (newItem.matchContext(csId) == <span class="keyword">false</span>)</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  {</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a817abc424f7cfcdec5954c7807970f36">DSaber</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"-|-\n"</span>);</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  }</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a817abc424f7cfcdec5954c7807970f36">DSaber</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">" pop cxt ["</span> << csId << <span class="stringliteral">"] "</span>);</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  }</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span> </div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <span class="keywordflow">if</span>(forwardVisited(dstNode,newItem))</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  {</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a817abc424f7cfcdec5954c7807970f36">DSaber</a>,<a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">" node "</span><< dstNode->getId() <<<span class="stringliteral">" has been visited\n"</span>);</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  }</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  addForwardVisited(dstNode, newItem);</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span> </div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  <span class="keywordflow">if</span>(pushIntoWorklist(newItem))</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a817abc424f7cfcdec5954c7807970f36">DSaber</a>,<a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">" --> "</span> << edge-><a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>() << <span class="stringliteral">", cxt size: "</span> << newItem.getContexts().cxtSize() <<<span class="stringliteral">")\n"</span>);</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span> </div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span> }</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span> </div><div class="line"><a name="l00257"></a><span class="lineno"><a class="line" href="classSVF_1_1SrcSnkDDA.html#a1ea0d4c4e53ff6986dd50d624ba2bff5"> 257</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SrcSnkDDA.html#a1ea0d4c4e53ff6986dd50d624ba2bff5">SrcSnkDDA::BWProcessIncomingEdge</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtDPItem.html">DPIm</a>&, <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge)</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span> {</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a817abc424f7cfcdec5954c7807970f36">DSaber</a>,<a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"backward propagate from ("</span> << edge-><a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>() << <span class="stringliteral">" --> "</span> << edge-><a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>() << <span class="stringliteral">")\n"</span>);</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* srcNode = edge-><a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>();</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <span class="keywordflow">if</span>(backwardVisited(srcNode))</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  addBackwardVisited(srcNode);</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span> </div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <a class="code" href="classSVF_1_1ContextCond.html">ContextCond</a> cxt;</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  <a class="code" href="classSVF_1_1CxtDPItem.html">DPIm</a> newItem(srcNode->getId(), cxt);</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  pushIntoWorklist(newItem);</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span> }</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span> </div><div class="line"><a name="l00272"></a><span class="lineno"><a class="line" href="classSVF_1_1SrcSnkDDA.html#ab35c0d1f02c83a2c10717905f1abf5cd"> 272</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SrcSnkDDA.html#ab35c0d1f02c83a2c10717905f1abf5cd">SrcSnkDDA::setCurSlice</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* src)</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span> {</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  <span class="keywordflow">if</span>(_curSlice!=<span class="keyword">nullptr</span>)</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  {</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <span class="keyword">delete</span> _curSlice;</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  _curSlice = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  clearVisitedMap();</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  }</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span> </div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  _curSlice = <span class="keyword">new</span> <a class="code" href="classSVF_1_1ProgSlice.html">ProgSlice</a>(src,getPathAllocator(), getSVFG());</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span> }</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span> </div><div class="line"><a name="l00284"></a><span class="lineno"><a class="line" href="classSVF_1_1SrcSnkDDA.html#a8817604b20724703121e9466e5cdb4cd"> 284</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SrcSnkDDA.html#a8817604b20724703121e9466e5cdb4cd">SrcSnkDDA::annotateSlice</a>(<a class="code" href="classSVF_1_1ProgSlice.html">ProgSlice</a>* slice)</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span> {</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  getSVFG()->getStat()->addToSources(slice-><a class="code" href="classSVF_1_1ProgSlice.html#ac1dc48ea64a89ce37394a22e609a0cd0">getSource</a>());</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <span class="keywordflow">for</span>(<a class="code" href="classSVF_1_1SrcSnkDDA.html#ad6935e27bbd95d26a01b22b879efed58">SVFGNodeSetIter</a> it = slice-><a class="code" href="classSVF_1_1ProgSlice.html#adf620c97daed49735d21b485c448b4a2">sinksBegin</a>(), eit = slice-><a class="code" href="classSVF_1_1ProgSlice.html#a27636f096ec825c4d5cb1dca608afb31">sinksEnd</a>(); it!=eit; ++it )</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  getSVFG()->getStat()->addToSinks(*it);</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <span class="keywordflow">for</span>(<a class="code" href="classSVF_1_1SrcSnkDDA.html#ad6935e27bbd95d26a01b22b879efed58">SVFGNodeSetIter</a> it = slice-><a class="code" href="classSVF_1_1ProgSlice.html#ae482fcb138aaf345586a39daa34ff895">forwardSliceBegin</a>(), eit = slice-><a class="code" href="classSVF_1_1ProgSlice.html#add10d8fd041ac7e6eb611df8a6b1384b">forwardSliceEnd</a>(); it!=eit; ++it )</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  getSVFG()->getStat()->addToForwardSlice(*it);</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  <span class="keywordflow">for</span>(<a class="code" href="classSVF_1_1SrcSnkDDA.html#ad6935e27bbd95d26a01b22b879efed58">SVFGNodeSetIter</a> it = slice-><a class="code" href="classSVF_1_1ProgSlice.html#ab5810f8a7a994f0637c54b94d0367a89">backwardSliceBegin</a>(), eit = slice-><a class="code" href="classSVF_1_1ProgSlice.html#aed4bedc716a3e252e44a6f28e677d61c">backwardSliceEnd</a>(); it!=eit; ++it )</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  getSVFG()->getStat()->addToBackwardSlice(*it);</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span> }</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span> </div><div class="line"><a name="l00295"></a><span class="lineno"><a class="line" href="classSVF_1_1SrcSnkDDA.html#acae985068ff1c20fb81c4c9ba730aaba"> 295</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SrcSnkDDA.html#acae985068ff1c20fb81c4c9ba730aaba">SrcSnkDDA::dumpSlices</a>()</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span> {</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span> </div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1Options.html#ace1f2368a0a466f98c9e53def47db3ab">Options::DumpSlice</a>)</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  <span class="keyword">const_cast<</span><a class="code" href="classSVF_1_1SVFG.html">SVFG</a>*<span class="keyword">></span>(getSVFG())->dump(<span class="stringliteral">"Slice"</span>,<span class="keyword">true</span>);</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span> }</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span> </div><div class="line"><a name="l00302"></a><span class="lineno"><a class="line" href="classSVF_1_1SrcSnkDDA.html#ae3d665ff1e796348131e797eb0283bfb"> 302</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1SrcSnkDDA.html#ae3d665ff1e796348131e797eb0283bfb">SrcSnkDDA::printBDDStat</a>()</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span> {</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span> </div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"BDD Mem usage: "</span> << getPathAllocator()->getMemUsage() << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"BDD Number: "</span> << getPathAllocator()->getCondNum() << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span> }</div><div class="ttc" id="Andersen_8h_html"><div class="ttname"><a href="Andersen_8h.html">Andersen.h</a></div></div>
|
|
70
70
|
<div class="ttc" id="classSVF_1_1SrcSnkDDA_html_af254f2a00cabb91c61a0a592bdb7f0f1"><div class="ttname"><a href="classSVF_1_1SrcSnkDDA.html#af254f2a00cabb91c61a0a592bdb7f0f1">SVF::SrcSnkDDA::CallSiteSet</a></div><div class="ttdeci">Set< const CallBlockNode * > CallSiteSet</div><div class="ttdef"><b>Definition:</b> <a href="SrcSnkDDA_8h_source.html#l00056">SrcSnkDDA.h:56</a></div></div>
|
|
71
71
|
<div class="ttc" id="classSVF_1_1ProgSlice_html_ac1dc48ea64a89ce37394a22e609a0cd0"><div class="ttname"><a href="classSVF_1_1ProgSlice.html#ac1dc48ea64a89ce37394a22e609a0cd0">SVF::ProgSlice::getSource</a></div><div class="ttdeci">const SVFGNode * getSource() const</div><div class="ttdoc">root and sink operations </div><div class="ttdef"><b>Definition:</b> <a href="ProgSlice_8h_source.html#l00112">ProgSlice.h:112</a></div></div>
|
|
72
72
|
<div class="ttc" id="classSVF_1_1SrcSnkDDA_html_a8817604b20724703121e9466e5cdb4cd"><div class="ttname"><a href="classSVF_1_1SrcSnkDDA.html#a8817604b20724703121e9466e5cdb4cd">SVF::SrcSnkDDA::annotateSlice</a></div><div class="ttdeci">void annotateSlice(ProgSlice *slice)</div><div class="ttdef"><b>Definition:</b> <a href="SrcSnkDDA_8cpp_source.html#l00284">SrcSnkDDA.cpp:284</a></div></div>
|
|
@@ -1449,16 +1449,16 @@ Private Attributes</h2></td></tr>
|
|
|
1449
1449
|
<p>allocate control-flow graph branch conditions </p>
|
|
1450
1450
|
|
|
1451
1451
|
<p class="definition">Definition at line <a class="el" href="SrcSnkDDA_8cpp_source.html#l00042">42</a> of file <a class="el" href="SrcSnkDDA_8cpp_source.html">SrcSnkDDA.cpp</a>.</p>
|
|
1452
|
-
<div class="fragment"><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> {</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  <a class="code" href="classSVF_1_1PAGBuilder.html">PAGBuilder</a> builder;</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  <a class="code" href="classSVF_1_1PAG.html">PAG</a>* pag = builder.<a class="code" href="classSVF_1_1PAGBuilder.html#a757ab2c9481467842e1ad4c46a1f6291">build</a>(module);</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> </div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <a class="code" href="classSVF_1_1AndersenWaveDiff.html">AndersenWaveDiff</a>* ander = <a class="code" href="classSVF_1_1AndersenWaveDiff.html#a74134978db1c0d9c71122bc63f4b73c1">AndersenWaveDiff::createAndersenWaveDiff</a>(pag);</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1Options.html#a5fb7733fd66ecad30eea8ced3839e590">Options::SABERFULLSVFG</a>)</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <a class="code" href="classSVF_1_1SrcSnkDDA.html#ae657ebdeae8a083cfec210859a0023e4">svfg</a> = <a class="code" href="classSVF_1_1SrcSnkDDA.html#ab6803f0a2b3507213ad2979b9b12f700">memSSA</a>.<a class="code" href="classSVF_1_1SVFGBuilder.html#a7a43ae081645eb74fa48c136548f0809">buildFullSVFGWithoutOPT</a>(ander);</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  <a class="code" href="classSVF_1_1SrcSnkDDA.html#ae657ebdeae8a083cfec210859a0023e4">svfg</a> = <a class="code" href="classSVF_1_1SrcSnkDDA.html#ab6803f0a2b3507213ad2979b9b12f700">memSSA</a>.<a class="code" href="classSVF_1_1SVFGBuilder.html#
|
|
1452
|
+
<div class="fragment"><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> {</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  <a class="code" href="classSVF_1_1PAGBuilder.html">PAGBuilder</a> builder;</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  <a class="code" href="classSVF_1_1PAG.html">PAG</a>* pag = builder.<a class="code" href="classSVF_1_1PAGBuilder.html#a757ab2c9481467842e1ad4c46a1f6291">build</a>(module);</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> </div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <a class="code" href="classSVF_1_1AndersenWaveDiff.html">AndersenWaveDiff</a>* ander = <a class="code" href="classSVF_1_1AndersenWaveDiff.html#a74134978db1c0d9c71122bc63f4b73c1">AndersenWaveDiff::createAndersenWaveDiff</a>(pag);</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1Options.html#a5fb7733fd66ecad30eea8ced3839e590">Options::SABERFULLSVFG</a>)</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <a class="code" href="classSVF_1_1SrcSnkDDA.html#ae657ebdeae8a083cfec210859a0023e4">svfg</a> = <a class="code" href="classSVF_1_1SrcSnkDDA.html#ab6803f0a2b3507213ad2979b9b12f700">memSSA</a>.<a class="code" href="classSVF_1_1SVFGBuilder.html#a7a43ae081645eb74fa48c136548f0809">buildFullSVFGWithoutOPT</a>(ander);</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  <a class="code" href="classSVF_1_1SrcSnkDDA.html#ae657ebdeae8a083cfec210859a0023e4">svfg</a> = <a class="code" href="classSVF_1_1SrcSnkDDA.html#ab6803f0a2b3507213ad2979b9b12f700">memSSA</a>.<a class="code" href="classSVF_1_1SVFGBuilder.html#a3b162da8dfb123cada7a13ce0c154a46">buildPTROnlySVFGWithoutOPT</a>(ander);</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  <a class="code" href="classSVF_1_1CFLSolver.html#ae0a02179b2489f65988819666ec52a7c">setGraph</a>(<a class="code" href="classSVF_1_1SrcSnkDDA.html#ab6803f0a2b3507213ad2979b9b12f700">memSSA</a>.<a class="code" href="classSVF_1_1SVFGBuilder.html#ad70dc4134a6290223b4168bde146b6d5">getSVFG</a>());</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  <a class="code" href="classSVF_1_1SrcSnkDDA.html#a97be553370acf305f86e903bc3f0bb1a">ptaCallGraph</a> = ander-><a class="code" href="classSVF_1_1PointerAnalysis.html#a7c9b7e5fe37ae31ba84d167945ca57df">getPTACallGraph</a>();</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  <span class="comment">//AndersenWaveDiff::releaseAndersenWaveDiff();</span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> <span class="comment"></span> <a class="code" href="classSVF_1_1SrcSnkDDA.html#a1a6ae6b1f6864057067d0e5533ea801e">getPathAllocator</a>()-><a class="code" href="classSVF_1_1PathCondAllocator.html#a3fce010083b85a4421eed4c17eb54640">allocate</a>(<a class="code" href="classSVF_1_1SrcSnkDDA.html#af55a78139e0bde3e166b0d43e5890c98">getPAG</a>()->getModule());</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span> </div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  <a class="code" href="classSVF_1_1SrcSnkDDA.html#a1c8f91ffa0b9f01d51c8cd5e14f076d5">initSrcs</a>();</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  <a class="code" href="classSVF_1_1SrcSnkDDA.html#a0f6cfa30c346aab1fb03a44e47c32559">initSnks</a>();</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> }</div><div class="ttc" id="classSVF_1_1SVFGBuilder_html_a7a43ae081645eb74fa48c136548f0809"><div class="ttname"><a href="classSVF_1_1SVFGBuilder.html#a7a43ae081645eb74fa48c136548f0809">SVF::SVFGBuilder::buildFullSVFGWithoutOPT</a></div><div class="ttdeci">SVFG * buildFullSVFGWithoutOPT(BVDataPTAImpl *pta)</div><div class="ttdef"><b>Definition:</b> <a href="SVFGBuilder_8cpp_source.html#l00059">SVFGBuilder.cpp:59</a></div></div>
|
|
1453
1453
|
<div class="ttc" id="classSVF_1_1CFLSolver_html_ae0a02179b2489f65988819666ec52a7c"><div class="ttname"><a href="classSVF_1_1CFLSolver.html#ae0a02179b2489f65988819666ec52a7c">SVF::CFLSolver::setGraph</a></div><div class="ttdeci">void setGraph(GraphType g)</div><div class="ttdef"><b>Definition:</b> <a href="CFLSolver_8h_source.html#l00078">CFLSolver.h:78</a></div></div>
|
|
1454
1454
|
<div class="ttc" id="classSVF_1_1SrcSnkDDA_html_a1a6ae6b1f6864057067d0e5533ea801e"><div class="ttname"><a href="classSVF_1_1SrcSnkDDA.html#a1a6ae6b1f6864057067d0e5533ea801e">SVF::SrcSnkDDA::getPathAllocator</a></div><div class="ttdeci">PathCondAllocator * getPathAllocator() const</div><div class="ttdoc">Get path condition allocator. </div><div class="ttdef"><b>Definition:</b> <a href="SrcSnkDDA_8h_source.html#l00231">SrcSnkDDA.h:231</a></div></div>
|
|
1455
|
+
<div class="ttc" id="classSVF_1_1SVFGBuilder_html_a3b162da8dfb123cada7a13ce0c154a46"><div class="ttname"><a href="classSVF_1_1SVFGBuilder.html#a3b162da8dfb123cada7a13ce0c154a46">SVF::SVFGBuilder::buildPTROnlySVFGWithoutOPT</a></div><div class="ttdeci">SVFG * buildPTROnlySVFGWithoutOPT(BVDataPTAImpl *pta)</div><div class="ttdef"><b>Definition:</b> <a href="SVFGBuilder_8cpp_source.html#l00049">SVFGBuilder.cpp:49</a></div></div>
|
|
1455
1456
|
<div class="ttc" id="classSVF_1_1SrcSnkDDA_html_a0f6cfa30c346aab1fb03a44e47c32559"><div class="ttname"><a href="classSVF_1_1SrcSnkDDA.html#a0f6cfa30c346aab1fb03a44e47c32559">SVF::SrcSnkDDA::initSnks</a></div><div class="ttdeci">virtual void initSnks()=0</div></div>
|
|
1456
1457
|
<div class="ttc" id="classSVF_1_1AndersenWaveDiff_html"><div class="ttname"><a href="classSVF_1_1AndersenWaveDiff.html">SVF::AndersenWaveDiff</a></div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00425">Andersen.h:425</a></div></div>
|
|
1457
1458
|
<div class="ttc" id="classSVF_1_1Options_html_a5fb7733fd66ecad30eea8ced3839e590"><div class="ttname"><a href="classSVF_1_1Options.html#a5fb7733fd66ecad30eea8ced3839e590">SVF::Options::SABERFULLSVFG</a></div><div class="ttdeci">static const llvm::cl::opt< bool > SABERFULLSVFG</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00242">Options.h:242</a></div></div>
|
|
1458
1459
|
<div class="ttc" id="classSVF_1_1PAG_html"><div class="ttname"><a href="classSVF_1_1PAG.html">SVF::PAG</a></div><div class="ttdef"><b>Definition:</b> <a href="PAG_8h_source.html#l00047">PAG.h:47</a></div></div>
|
|
1459
1460
|
<div class="ttc" id="classSVF_1_1SrcSnkDDA_html_ab6803f0a2b3507213ad2979b9b12f700"><div class="ttname"><a href="classSVF_1_1SrcSnkDDA.html#ab6803f0a2b3507213ad2979b9b12f700">SVF::SrcSnkDDA::memSSA</a></div><div class="ttdeci">SaberSVFGBuilder memSSA</div><div class="ttdef"><b>Definition:</b> <a href="SrcSnkDDA_8h_source.html#l00069">SrcSnkDDA.h:69</a></div></div>
|
|
1460
1461
|
<div class="ttc" id="classSVF_1_1SrcSnkDDA_html_a97be553370acf305f86e903bc3f0bb1a"><div class="ttname"><a href="classSVF_1_1SrcSnkDDA.html#a97be553370acf305f86e903bc3f0bb1a">SVF::SrcSnkDDA::ptaCallGraph</a></div><div class="ttdeci">PTACallGraph * ptaCallGraph</div><div class="ttdef"><b>Definition:</b> <a href="SrcSnkDDA_8h_source.html#l00071">SrcSnkDDA.h:71</a></div></div>
|
|
1461
|
-
<div class="ttc" id="classSVF_1_1SVFGBuilder_html_ab7353191edd06568e2598177d253c1d9"><div class="ttname"><a href="classSVF_1_1SVFGBuilder.html#ab7353191edd06568e2598177d253c1d9">SVF::SVFGBuilder::buildPTROnlySVFG</a></div><div class="ttdeci">SVFG * buildPTROnlySVFG(BVDataPTAImpl *pta)</div><div class="ttdef"><b>Definition:</b> <a href="SVFGBuilder_8cpp_source.html#l00044">SVFGBuilder.cpp:44</a></div></div>
|
|
1462
1462
|
<div class="ttc" id="classSVF_1_1PointerAnalysis_html_a7c9b7e5fe37ae31ba84d167945ca57df"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#a7c9b7e5fe37ae31ba84d167945ca57df">SVF::PointerAnalysis::getPTACallGraph</a></div><div class="ttdeci">PTACallGraph * getPTACallGraph() const</div><div class="ttdoc">Return call graph. </div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#l00178">PointerAnalysis.h:178</a></div></div>
|
|
1463
1463
|
<div class="ttc" id="classSVF_1_1PAGBuilder_html_a757ab2c9481467842e1ad4c46a1f6291"><div class="ttname"><a href="classSVF_1_1PAGBuilder.html#a757ab2c9481467842e1ad4c46a1f6291">SVF::PAGBuilder::build</a></div><div class="ttdeci">virtual PAG * build(SVFModule *svfModule)</div><div class="ttdoc">Start building PAG here. </div><div class="ttdef"><b>Definition:</b> <a href="PAGBuilder_8cpp_source.html#l00047">PAGBuilder.cpp:47</a></div></div>
|
|
1464
1464
|
<div class="ttc" id="classSVF_1_1SrcSnkDDA_html_ae657ebdeae8a083cfec210859a0023e4"><div class="ttname"><a href="classSVF_1_1SrcSnkDDA.html#ae657ebdeae8a083cfec210859a0023e4">SVF::SrcSnkDDA::svfg</a></div><div class="ttdeci">SVFG * svfg</div><div class="ttdef"><b>Definition:</b> <a href="SrcSnkDDA_8h_source.html#l00070">SrcSnkDDA.h:70</a></div></div>
|
package/lib/SABER/SrcSnkDDA.cpp
CHANGED
|
@@ -48,7 +48,7 @@ void SrcSnkDDA::initialize(SVFModule* module)
|
|
|
48
48
|
if(Options::SABERFULLSVFG)
|
|
49
49
|
svfg = memSSA.buildFullSVFGWithoutOPT(ander);
|
|
50
50
|
else
|
|
51
|
-
svfg = memSSA.
|
|
51
|
+
svfg = memSSA.buildPTROnlySVFGWithoutOPT(ander);
|
|
52
52
|
setGraph(memSSA.getSVFG());
|
|
53
53
|
ptaCallGraph = ander->getPTACallGraph();
|
|
54
54
|
//AndersenWaveDiff::releaseAndersenWaveDiff();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "svf-tools",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.302",
|
|
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": {
|