svf-tools 1.0.634 → 1.0.635

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.
@@ -124,8 +124,8 @@ Functions</h2></td></tr>
124
124
  </div><div class="memdoc">
125
125
  <p>An example to query alias results of two LLVM values </p>
126
126
 
127
- <p class="definition">Definition at line <a class="el" href="svf-ex_8cpp_source.html#l00043">43</a> of file <a class="el" href="svf-ex_8cpp_source.html">svf-ex.cpp</a>.</p>
128
- <div class="fragment"><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;{</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; <span class="keywordflow">return</span> pta-&gt;alias(v1,v2);</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;}</div></div><!-- fragment -->
127
+ <p class="definition">Definition at line <a class="el" href="svf-ex_8cpp_source.html#l00042">42</a> of file <a class="el" href="svf-ex_8cpp_source.html">svf-ex.cpp</a>.</p>
128
+ <div class="fragment"><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;{</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; <span class="keywordflow">return</span> pta-&gt;alias(v1,v2);</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;}</div></div><!-- fragment -->
129
129
  </div>
130
130
  </div>
131
131
  <a id="a3c04138a5bfe5d72780bb7e82a18e627"></a>
@@ -164,8 +164,8 @@ Functions</h2></td></tr>
164
164
  <p>Collect uses of an LLVM Value traverseOnVFG(svfg, value);</p>
165
165
  <p>Collect all successor nodes on ICFG traverseOnICFG(icfg, value); </p>
166
166
 
167
- <p class="definition">Definition at line <a class="el" href="svf-ex_8cpp_source.html#l00143">143</a> of file <a class="el" href="svf-ex_8cpp_source.html">svf-ex.cpp</a>.</p>
168
- <div class="fragment"><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160;{</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160;</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keywordtype">char</span> **arg_value = <span class="keyword">new</span> <span class="keywordtype">char</span>*[argc];</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; std::vector&lt;std::string&gt; moduleNameVec;</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; moduleNameVec = OptionBase::parseOptions(</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; argc, argv, <span class="stringliteral">&quot;Whole Program Points-to Analysis&quot;</span>, <span class="stringliteral">&quot;[options] &lt;input-bitcode...&gt;&quot;</span></div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; );</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160;</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keywordflow">if</span> (Options::WriteAnder() == <span class="stringliteral">&quot;ir_annotator&quot;</span>)</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; {</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; LLVMModuleSet::getLLVMModuleSet()-&gt;preProcessBCs(moduleNameVec);</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; }</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160;</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; SVFModule* svfModule = LLVMModuleSet::getLLVMModuleSet()-&gt;buildSVFModule(moduleNameVec);</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160;</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; SVFIRBuilder builder(svfModule);</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; SVFIR* pag = builder.build();</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160;</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; Andersen* ander = AndersenWaveDiff::createAndersenWaveDiff(pag);</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160;</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160;</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160;</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; PTACallGraph* callgraph = ander-&gt;getPTACallGraph();</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160;</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; ICFG* icfg = pag-&gt;getICFG();</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; icfg-&gt;dump(<span class="stringliteral">&quot;icfg&quot;</span>);</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160;</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; VFG* vfg = <span class="keyword">new</span> VFG(callgraph);</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160;</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; SVFGBuilder svfBuilder(<span class="keyword">true</span>);</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; <span class="comment">//SVFG* svfg =</span></div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; svfBuilder.buildFullSVFG(ander);</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160;</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160;</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160;</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="comment">// clean up memory</span></div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="keyword">delete</span> vfg;</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; AndersenWaveDiff::releaseAndersenWaveDiff();</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; SVFIR::releaseSVFIR();</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160;</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; LLVMModuleSet::getLLVMModuleSet()-&gt;dumpModulesToFile(<span class="stringliteral">&quot;.svf.bc&quot;</span>);</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; SVF::LLVMModuleSet::releaseLLVMModuleSet();</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160;</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; llvm::llvm_shutdown();</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="keyword">delete</span>[] arg_value;</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160;}</div></div><!-- fragment -->
167
+ <p class="definition">Definition at line <a class="el" href="svf-ex_8cpp_source.html#l00142">142</a> of file <a class="el" href="svf-ex_8cpp_source.html">svf-ex.cpp</a>.</p>
168
+ <div class="fragment"><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160;{</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160;</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="keywordtype">char</span> **arg_value = <span class="keyword">new</span> <span class="keywordtype">char</span>*[argc];</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; std::vector&lt;std::string&gt; moduleNameVec;</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; moduleNameVec = OptionBase::parseOptions(</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; argc, argv, <span class="stringliteral">&quot;Whole Program Points-to Analysis&quot;</span>, <span class="stringliteral">&quot;[options] &lt;input-bitcode...&gt;&quot;</span></div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; );</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160;</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; <span class="keywordflow">if</span> (Options::WriteAnder() == <span class="stringliteral">&quot;ir_annotator&quot;</span>)</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; {</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; LLVMModuleSet::getLLVMModuleSet()-&gt;preProcessBCs(moduleNameVec);</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; }</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160;</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; SVFModule* svfModule = LLVMModuleSet::getLLVMModuleSet()-&gt;buildSVFModule(moduleNameVec);</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160;</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; SVFIRBuilder builder(svfModule);</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; SVFIR* pag = builder.build();</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160;</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; Andersen* ander = AndersenWaveDiff::createAndersenWaveDiff(pag);</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160;</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160;</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160;</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; PTACallGraph* callgraph = ander-&gt;getPTACallGraph();</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160;</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; ICFG* icfg = pag-&gt;getICFG();</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; icfg-&gt;dump(<span class="stringliteral">&quot;icfg&quot;</span>);</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160;</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; VFG* vfg = <span class="keyword">new</span> VFG(callgraph);</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160;</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; SVFGBuilder svfBuilder(<span class="keyword">true</span>);</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <span class="comment">//SVFG* svfg =</span></div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; svfBuilder.buildFullSVFG(ander);</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160;</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160;</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160;</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <span class="comment">// clean up memory</span></div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="keyword">delete</span> vfg;</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; AndersenWaveDiff::releaseAndersenWaveDiff();</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; SVFIR::releaseSVFIR();</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160;</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; LLVMModuleSet::getLLVMModuleSet()-&gt;dumpModulesToFile(<span class="stringliteral">&quot;.svf.bc&quot;</span>);</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; SVF::LLVMModuleSet::releaseLLVMModuleSet();</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160;</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; llvm::llvm_shutdown();</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <span class="keyword">delete</span>[] arg_value;</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160;}</div></div><!-- fragment -->
169
169
  </div>
170
170
  </div>
171
171
  <a id="a985b6c880c7922538046c6a1fa987829"></a>
@@ -195,8 +195,8 @@ Functions</h2></td></tr>
195
195
  </div><div class="memdoc">
196
196
  <p>An example to print points-to set of an LLVM value </p>
197
197
 
198
- <p class="definition">Definition at line <a class="el" href="svf-ex_8cpp_source.html#l00051">51</a> of file <a class="el" href="svf-ex_8cpp_source.html">svf-ex.cpp</a>.</p>
199
- <div class="fragment"><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;{</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; std::string str;</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; std::stringstream rawstr(str);</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> pNodeId = pta-&gt;getPAG()-&gt;getValueNode(val);</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <span class="keyword">const</span> PointsTo&amp; pts = pta-&gt;getPts(pNodeId);</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; <span class="keywordflow">for</span> (PointsTo::iterator ii = pts.begin(), ie = pts.end();</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; ii != ie; ii++)</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; {</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; *ii &lt;&lt; <span class="stringliteral">&quot; &quot;</span>;</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; PAGNode* targetObj = pta-&gt;getPAG()-&gt;getGNode(*ii);</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="keywordflow">if</span>(targetObj-&gt;hasValue())</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; {</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;(&quot;</span> &lt;&lt; targetObj-&gt;getValue()-&gt;toString() &lt;&lt; <span class="stringliteral">&quot;)\t &quot;</span>;</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; }</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; }</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160;</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="keywordflow">return</span> rawstr.str();</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160;</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160;}</div><div class="ttc" id="namespaceSVF_html_a350ae9bf8606bdfe23c8679681b969dc"><div class="ttname"><a href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">SVF::NodeID</a></div><div class="ttdeci">unsigned NodeID</div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8h_source.html#l00020">MTAResultValidator.h:20</a></div></div>
198
+ <p class="definition">Definition at line <a class="el" href="svf-ex_8cpp_source.html#l00050">50</a> of file <a class="el" href="svf-ex_8cpp_source.html">svf-ex.cpp</a>.</p>
199
+ <div class="fragment"><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;{</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; std::string str;</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; std::stringstream rawstr(str);</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> pNodeId = pta-&gt;getPAG()-&gt;getValueNode(val);</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="keyword">const</span> PointsTo&amp; pts = pta-&gt;getPts(pNodeId);</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <span class="keywordflow">for</span> (PointsTo::iterator ii = pts.begin(), ie = pts.end();</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; ii != ie; ii++)</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; {</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; *ii &lt;&lt; <span class="stringliteral">&quot; &quot;</span>;</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; PAGNode* targetObj = pta-&gt;getPAG()-&gt;getGNode(*ii);</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="keywordflow">if</span>(targetObj-&gt;hasValue())</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; {</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;(&quot;</span> &lt;&lt; targetObj-&gt;getValue()-&gt;toString() &lt;&lt; <span class="stringliteral">&quot;)\t &quot;</span>;</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; }</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; }</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160;</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; <span class="keywordflow">return</span> rawstr.str();</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160;</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160;}</div><div class="ttc" id="namespaceSVF_html_a350ae9bf8606bdfe23c8679681b969dc"><div class="ttname"><a href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">SVF::NodeID</a></div><div class="ttdeci">unsigned NodeID</div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8h_source.html#l00020">MTAResultValidator.h:20</a></div></div>
200
200
  </div><!-- fragment -->
201
201
  </div>
202
202
  </div>
@@ -228,8 +228,8 @@ Functions</h2></td></tr>
228
228
  <p>An example to query/collect all successor nodes from a ICFGNode (iNode) along control-flow graph (ICFG) </p>
229
229
  <p>Traverse along VFG </p>
230
230
 
231
- <p class="definition">Definition at line <a class="el" href="svf-ex_8cpp_source.html#l00078">78</a> of file <a class="el" href="svf-ex_8cpp_source.html">svf-ex.cpp</a>.</p>
232
- <div class="fragment"><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160;{</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; ICFGNode* iNode = icfg-&gt;getICFGNode(svfInst);</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; FIFOWorkList&lt;const ICFGNode*&gt; worklist;</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; Set&lt;const ICFGNode*&gt; visited;</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; worklist.push(iNode);</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <span class="keywordflow">while</span> (!worklist.empty())</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; {</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <span class="keyword">const</span> ICFGNode* vNode = worklist.pop();</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <span class="keywordflow">for</span> (ICFGNode::const_iterator it = vNode-&gt;OutEdgeBegin(), eit =</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; vNode-&gt;OutEdgeEnd(); it != eit; ++it)</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; {</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; ICFGEdge* edge = *it;</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; ICFGNode* succNode = edge-&gt;getDstNode();</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; <span class="keywordflow">if</span> (visited.find(succNode) == visited.end())</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; {</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; visited.insert(succNode);</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; worklist.push(succNode);</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; }</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; }</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; }</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160;}</div></div><!-- fragment -->
231
+ <p class="definition">Definition at line <a class="el" href="svf-ex_8cpp_source.html#l00077">77</a> of file <a class="el" href="svf-ex_8cpp_source.html">svf-ex.cpp</a>.</p>
232
+ <div class="fragment"><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160;{</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; ICFGNode* iNode = icfg-&gt;getICFGNode(svfInst);</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; FIFOWorkList&lt;const ICFGNode*&gt; worklist;</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; Set&lt;const ICFGNode*&gt; visited;</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; worklist.push(iNode);</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160;</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; <span class="keywordflow">while</span> (!worklist.empty())</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; {</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; <span class="keyword">const</span> ICFGNode* vNode = worklist.pop();</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <span class="keywordflow">for</span> (ICFGNode::const_iterator it = vNode-&gt;OutEdgeBegin(), eit =</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; vNode-&gt;OutEdgeEnd(); it != eit; ++it)</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; {</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; ICFGEdge* edge = *it;</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; ICFGNode* succNode = edge-&gt;getDstNode();</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <span class="keywordflow">if</span> (visited.find(succNode) == visited.end())</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; {</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; visited.insert(succNode);</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; worklist.push(succNode);</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; }</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; }</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; }</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160;}</div></div><!-- fragment -->
233
233
  </div>
234
234
  </div>
235
235
  <a id="ad58149e5445ad22ce478339e103ab42b"></a>
@@ -262,8 +262,8 @@ Functions</h2></td></tr>
262
262
  <p>Collect all LLVM Values</p>
263
263
  <p>can only query VFGNode involving top-level pointers (starting with % or @ in LLVM IR) PAGNode* pNode = vfg-&gt;getLHSTopLevPtr(node); SVFValue* val = pNode-&gt;getValue(); </p>
264
264
 
265
- <p class="definition">Definition at line <a class="el" href="svf-ex_8cpp_source.html#l00106">106</a> of file <a class="el" href="svf-ex_8cpp_source.html">svf-ex.cpp</a>.</p>
266
- <div class="fragment"><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160;{</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; SVFIR* pag = SVFIR::getPAG();</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160;</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; PAGNode* pNode = pag-&gt;getGNode(pag-&gt;getValueNode(val));</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="keyword">const</span> VFGNode* vNode = vfg-&gt;getDefSVFGNode(pNode);</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; FIFOWorkList&lt;const VFGNode*&gt; worklist;</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; Set&lt;const VFGNode*&gt; visited;</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; worklist.push(vNode);</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160;</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; <span class="keywordflow">while</span> (!worklist.empty())</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; {</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <span class="keyword">const</span> VFGNode* vNode = worklist.pop();</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; <span class="keywordflow">for</span> (VFGNode::const_iterator it = vNode-&gt;OutEdgeBegin(), eit =</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; vNode-&gt;OutEdgeEnd(); it != eit; ++it)</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; {</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; VFGEdge* edge = *it;</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; VFGNode* succNode = edge-&gt;getDstNode();</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; <span class="keywordflow">if</span> (visited.find(succNode) == visited.end())</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; {</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; visited.insert(succNode);</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; worklist.push(succNode);</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; }</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; }</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; }</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160;</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; <span class="keywordflow">for</span>(Set&lt;const VFGNode*&gt;::const_iterator it = visited.begin(), eit = visited.end(); it!=eit; ++it)</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; {</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="comment">// const VFGNode* node = *it;</span></div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160;<span class="comment"></span> }</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160;}</div></div><!-- fragment -->
265
+ <p class="definition">Definition at line <a class="el" href="svf-ex_8cpp_source.html#l00105">105</a> of file <a class="el" href="svf-ex_8cpp_source.html">svf-ex.cpp</a>.</p>
266
+ <div class="fragment"><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160;{</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; SVFIR* pag = SVFIR::getPAG();</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160;</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; PAGNode* pNode = pag-&gt;getGNode(pag-&gt;getValueNode(val));</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="keyword">const</span> VFGNode* vNode = vfg-&gt;getDefSVFGNode(pNode);</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; FIFOWorkList&lt;const VFGNode*&gt; worklist;</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; Set&lt;const VFGNode*&gt; visited;</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; worklist.push(vNode);</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160;</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="keywordflow">while</span> (!worklist.empty())</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; {</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="keyword">const</span> VFGNode* vNode = worklist.pop();</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <span class="keywordflow">for</span> (VFGNode::const_iterator it = vNode-&gt;OutEdgeBegin(), eit =</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; vNode-&gt;OutEdgeEnd(); it != eit; ++it)</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; {</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; VFGEdge* edge = *it;</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; VFGNode* succNode = edge-&gt;getDstNode();</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keywordflow">if</span> (visited.find(succNode) == visited.end())</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; {</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; visited.insert(succNode);</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; worklist.push(succNode);</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; }</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; }</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; }</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160;</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <span class="keywordflow">for</span>(Set&lt;const VFGNode*&gt;::const_iterator it = visited.begin(), eit = visited.end(); it!=eit; ++it)</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; {</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="comment">// const VFGNode* node = *it;</span></div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160;<span class="comment"></span> }</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160;}</div></div><!-- fragment -->
267
267
  </div>
268
268
  </div>
269
269
  </div><!-- contents -->
@@ -66,15 +66,14 @@ $(function() {
66
66
  <div class="title">svf-ex.cpp</div> </div>
67
67
  </div><!--header-->
68
68
  <div class="contents">
69
- <a href="svf-ex_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>&#160;<span class="comment">//===- svf-ex.cpp -- A driver example of SVF-------------------------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">// SVF: Static Value-Flow Analysis</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment">// Copyright (C) &lt;2013-&gt; &lt;Yulei Sui&gt;</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<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>&#160;<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>&#160;<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>&#160;<span class="comment">// (at your option) any later version.</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<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>&#160;<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>&#160;<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>&#160;<span class="comment">// GNU General Public License for more details.</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<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>&#160;<span class="comment">// along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="comment">//===-----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="comment"> // A driver program of SVF including usages of SVF APIs</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="comment"> //</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="comment"> // Author: Yulei Sui,</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="preprocessor">#include &quot;SVF-LLVM/LLVMUtil.h&quot;</span></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor">#include &quot;Graphs/SVFG.h&quot;</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#include &quot;WPA/Andersen.h&quot;</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="preprocessor">#include &quot;SVF-LLVM/SVFIRBuilder.h&quot;</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="preprocessor">#include &quot;Util/CommandLine.h&quot;</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="preprocessor">#include &quot;Util/Options.h&quot;</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespacellvm.html">llvm</a>;</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespacestd.html">std</a>;</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<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>&#160;</div><div class="line"><a name="l00043"></a><span class="lineno"><a class="line" href="svf-ex_8cpp.html#ad2f24f5ef6a8eaf0e4a77a8a4d31bc9f"> 43</a></span>&#160;SVF::AliasResult <a class="code" href="svf-ex_8cpp.html#ad2f24f5ef6a8eaf0e4a77a8a4d31bc9f">aliasQuery</a>(PointerAnalysis* pta, SVFValue* v1, SVFValue* v2)</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;{</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; <span class="keywordflow">return</span> pta-&gt;alias(v1,v2);</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;}</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;</div><div class="line"><a name="l00051"></a><span class="lineno"><a class="line" href="svf-ex_8cpp.html#a985b6c880c7922538046c6a1fa987829"> 51</a></span>&#160;std::string <a class="code" href="svf-ex_8cpp.html#a985b6c880c7922538046c6a1fa987829">printPts</a>(PointerAnalysis* pta, SVFValue* val)</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;{</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; std::string str;</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; std::stringstream rawstr(str);</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> pNodeId = pta-&gt;getPAG()-&gt;getValueNode(val);</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <span class="keyword">const</span> PointsTo&amp; pts = pta-&gt;getPts(pNodeId);</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; <span class="keywordflow">for</span> (PointsTo::iterator ii = pts.begin(), ie = pts.end();</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; ii != ie; ii++)</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; {</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; *ii &lt;&lt; <span class="stringliteral">&quot; &quot;</span>;</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; PAGNode* targetObj = pta-&gt;getPAG()-&gt;getGNode(*ii);</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="keywordflow">if</span>(targetObj-&gt;hasValue())</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; {</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;(&quot;</span> &lt;&lt; targetObj-&gt;getValue()-&gt;toString() &lt;&lt; <span class="stringliteral">&quot;)\t &quot;</span>;</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; }</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; }</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160;</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="keywordflow">return</span> rawstr.str();</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160;</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160;}</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160;</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160;</div><div class="line"><a name="l00078"></a><span class="lineno"><a class="line" href="svf-ex_8cpp.html#addc5529c5b161d0c61eba4944428455e"> 78</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="svf-ex_8cpp.html#addc5529c5b161d0c61eba4944428455e">traverseOnICFG</a>(ICFG* icfg, <span class="keyword">const</span> SVFInstruction* svfInst)</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160;{</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; ICFGNode* iNode = icfg-&gt;getICFGNode(svfInst);</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; FIFOWorkList&lt;const ICFGNode*&gt; worklist;</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; Set&lt;const ICFGNode*&gt; visited;</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; worklist.push(iNode);</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <span class="keywordflow">while</span> (!worklist.empty())</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; {</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <span class="keyword">const</span> ICFGNode* vNode = worklist.pop();</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <span class="keywordflow">for</span> (ICFGNode::const_iterator it = vNode-&gt;OutEdgeBegin(), eit =</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; vNode-&gt;OutEdgeEnd(); it != eit; ++it)</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; {</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; ICFGEdge* edge = *it;</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; ICFGNode* succNode = edge-&gt;getDstNode();</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; <span class="keywordflow">if</span> (visited.find(succNode) == visited.end())</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; {</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; visited.insert(succNode);</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; worklist.push(succNode);</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; }</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; }</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; }</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160;}</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160;</div><div class="line"><a name="l00106"></a><span class="lineno"><a class="line" href="svf-ex_8cpp.html#ad58149e5445ad22ce478339e103ab42b"> 106</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="svf-ex_8cpp.html#ad58149e5445ad22ce478339e103ab42b">traverseOnVFG</a>(<span class="keyword">const</span> SVFG* vfg, SVFValue* val)</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160;{</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; SVFIR* pag = SVFIR::getPAG();</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160;</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; PAGNode* pNode = pag-&gt;getGNode(pag-&gt;getValueNode(val));</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="keyword">const</span> VFGNode* vNode = vfg-&gt;getDefSVFGNode(pNode);</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; FIFOWorkList&lt;const VFGNode*&gt; worklist;</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; Set&lt;const VFGNode*&gt; visited;</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; worklist.push(vNode);</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160;</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; <span class="keywordflow">while</span> (!worklist.empty())</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; {</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <span class="keyword">const</span> VFGNode* vNode = worklist.pop();</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; <span class="keywordflow">for</span> (VFGNode::const_iterator it = vNode-&gt;OutEdgeBegin(), eit =</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; vNode-&gt;OutEdgeEnd(); it != eit; ++it)</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; {</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; VFGEdge* edge = *it;</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; VFGNode* succNode = edge-&gt;getDstNode();</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; <span class="keywordflow">if</span> (visited.find(succNode) == visited.end())</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; {</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; visited.insert(succNode);</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; worklist.push(succNode);</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; }</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; }</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; }</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160;</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; <span class="keywordflow">for</span>(Set&lt;const VFGNode*&gt;::const_iterator it = visited.begin(), eit = visited.end(); it!=eit; ++it)</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; {</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="comment">// const VFGNode* node = *it;</span></div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160;<span class="comment"></span> }</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160;}</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160;</div><div class="line"><a name="l00143"></a><span class="lineno"><a class="line" href="svf-ex_8cpp.html#a3c04138a5bfe5d72780bb7e82a18e627"> 143</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="svf-ex_8cpp.html#a3c04138a5bfe5d72780bb7e82a18e627">main</a>(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> ** argv)</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160;{</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160;</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keywordtype">char</span> **arg_value = <span class="keyword">new</span> <span class="keywordtype">char</span>*[argc];</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; std::vector&lt;std::string&gt; moduleNameVec;</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; moduleNameVec = OptionBase::parseOptions(</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; argc, argv, <span class="stringliteral">&quot;Whole Program Points-to Analysis&quot;</span>, <span class="stringliteral">&quot;[options] &lt;input-bitcode...&gt;&quot;</span></div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; );</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160;</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keywordflow">if</span> (Options::WriteAnder() == <span class="stringliteral">&quot;ir_annotator&quot;</span>)</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; {</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; LLVMModuleSet::getLLVMModuleSet()-&gt;preProcessBCs(moduleNameVec);</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; }</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160;</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; SVFModule* svfModule = LLVMModuleSet::getLLVMModuleSet()-&gt;buildSVFModule(moduleNameVec);</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160;</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; SVFIRBuilder builder(svfModule);</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; SVFIR* pag = builder.build();</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160;</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; Andersen* ander = AndersenWaveDiff::createAndersenWaveDiff(pag);</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160;</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160;</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160;</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; PTACallGraph* callgraph = ander-&gt;getPTACallGraph();</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160;</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; ICFG* icfg = pag-&gt;getICFG();</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; icfg-&gt;dump(<span class="stringliteral">&quot;icfg&quot;</span>);</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160;</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; VFG* vfg = <span class="keyword">new</span> VFG(callgraph);</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160;</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; SVFGBuilder svfBuilder(<span class="keyword">true</span>);</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; <span class="comment">//SVFG* svfg =</span></div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; svfBuilder.buildFullSVFG(ander);</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160;</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160;</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160;</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="comment">// clean up memory</span></div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="keyword">delete</span> vfg;</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; AndersenWaveDiff::releaseAndersenWaveDiff();</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; SVFIR::releaseSVFIR();</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160;</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; LLVMModuleSet::getLLVMModuleSet()-&gt;dumpModulesToFile(<span class="stringliteral">&quot;.svf.bc&quot;</span>);</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; SVF::LLVMModuleSet::releaseLLVMModuleSet();</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160;</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; llvm::llvm_shutdown();</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="keyword">delete</span>[] arg_value;</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160;}</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160;</div><div class="ttc" id="svf-ex_8cpp_html_addc5529c5b161d0c61eba4944428455e"><div class="ttname"><a href="svf-ex_8cpp.html#addc5529c5b161d0c61eba4944428455e">traverseOnICFG</a></div><div class="ttdeci">void traverseOnICFG(ICFG *icfg, const SVFInstruction *svfInst)</div><div class="ttdef"><b>Definition:</b> <a href="svf-ex_8cpp_source.html#l00078">svf-ex.cpp:78</a></div></div>
70
- <div class="ttc" id="namespacellvm_html"><div class="ttname"><a href="namespacellvm.html">llvm</a></div></div>
69
+ <a href="svf-ex_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>&#160;<span class="comment">//===- svf-ex.cpp -- A driver example of SVF-------------------------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">// SVF: Static Value-Flow Analysis</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment">// Copyright (C) &lt;2013-&gt; &lt;Yulei Sui&gt;</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<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>&#160;<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>&#160;<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>&#160;<span class="comment">// (at your option) any later version.</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<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>&#160;<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>&#160;<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>&#160;<span class="comment">// GNU General Public License for more details.</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<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>&#160;<span class="comment">// along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="comment">//===-----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="comment"> // A driver program of SVF including usages of SVF APIs</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="comment"> //</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="comment"> // Author: Yulei Sui,</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="preprocessor">#include &quot;SVF-LLVM/LLVMUtil.h&quot;</span></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor">#include &quot;Graphs/SVFG.h&quot;</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#include &quot;WPA/Andersen.h&quot;</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="preprocessor">#include &quot;SVF-LLVM/SVFIRBuilder.h&quot;</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="preprocessor">#include &quot;Util/CommandLine.h&quot;</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="preprocessor">#include &quot;Util/Options.h&quot;</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespacestd.html">std</a>;</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;</div><div class="line"><a name="l00042"></a><span class="lineno"><a class="line" href="svf-ex_8cpp.html#ad2f24f5ef6a8eaf0e4a77a8a4d31bc9f"> 42</a></span>&#160;SVF::AliasResult <a class="code" href="svf-ex_8cpp.html#ad2f24f5ef6a8eaf0e4a77a8a4d31bc9f">aliasQuery</a>(PointerAnalysis* pta, SVFValue* v1, SVFValue* v2)</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;{</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; <span class="keywordflow">return</span> pta-&gt;alias(v1,v2);</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;}</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;</div><div class="line"><a name="l00050"></a><span class="lineno"><a class="line" href="svf-ex_8cpp.html#a985b6c880c7922538046c6a1fa987829"> 50</a></span>&#160;std::string <a class="code" href="svf-ex_8cpp.html#a985b6c880c7922538046c6a1fa987829">printPts</a>(PointerAnalysis* pta, SVFValue* val)</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;{</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; std::string str;</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; std::stringstream rawstr(str);</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> pNodeId = pta-&gt;getPAG()-&gt;getValueNode(val);</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="keyword">const</span> PointsTo&amp; pts = pta-&gt;getPts(pNodeId);</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <span class="keywordflow">for</span> (PointsTo::iterator ii = pts.begin(), ie = pts.end();</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; ii != ie; ii++)</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; {</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; *ii &lt;&lt; <span class="stringliteral">&quot; &quot;</span>;</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; PAGNode* targetObj = pta-&gt;getPAG()-&gt;getGNode(*ii);</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="keywordflow">if</span>(targetObj-&gt;hasValue())</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; {</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;(&quot;</span> &lt;&lt; targetObj-&gt;getValue()-&gt;toString() &lt;&lt; <span class="stringliteral">&quot;)\t &quot;</span>;</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; }</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; }</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160;</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; <span class="keywordflow">return</span> rawstr.str();</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160;</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160;}</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160;</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160;</div><div class="line"><a name="l00077"></a><span class="lineno"><a class="line" href="svf-ex_8cpp.html#addc5529c5b161d0c61eba4944428455e"> 77</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="svf-ex_8cpp.html#addc5529c5b161d0c61eba4944428455e">traverseOnICFG</a>(ICFG* icfg, <span class="keyword">const</span> SVFInstruction* svfInst)</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160;{</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; ICFGNode* iNode = icfg-&gt;getICFGNode(svfInst);</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; FIFOWorkList&lt;const ICFGNode*&gt; worklist;</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; Set&lt;const ICFGNode*&gt; visited;</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; worklist.push(iNode);</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160;</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; <span class="keywordflow">while</span> (!worklist.empty())</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; {</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; <span class="keyword">const</span> ICFGNode* vNode = worklist.pop();</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <span class="keywordflow">for</span> (ICFGNode::const_iterator it = vNode-&gt;OutEdgeBegin(), eit =</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; vNode-&gt;OutEdgeEnd(); it != eit; ++it)</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; {</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; ICFGEdge* edge = *it;</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; ICFGNode* succNode = edge-&gt;getDstNode();</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <span class="keywordflow">if</span> (visited.find(succNode) == visited.end())</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; {</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; visited.insert(succNode);</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; worklist.push(succNode);</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; }</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; }</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; }</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160;}</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160;</div><div class="line"><a name="l00105"></a><span class="lineno"><a class="line" href="svf-ex_8cpp.html#ad58149e5445ad22ce478339e103ab42b"> 105</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="svf-ex_8cpp.html#ad58149e5445ad22ce478339e103ab42b">traverseOnVFG</a>(<span class="keyword">const</span> SVFG* vfg, SVFValue* val)</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160;{</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; SVFIR* pag = SVFIR::getPAG();</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160;</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; PAGNode* pNode = pag-&gt;getGNode(pag-&gt;getValueNode(val));</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="keyword">const</span> VFGNode* vNode = vfg-&gt;getDefSVFGNode(pNode);</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; FIFOWorkList&lt;const VFGNode*&gt; worklist;</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; Set&lt;const VFGNode*&gt; visited;</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; worklist.push(vNode);</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160;</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="keywordflow">while</span> (!worklist.empty())</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; {</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="keyword">const</span> VFGNode* vNode = worklist.pop();</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <span class="keywordflow">for</span> (VFGNode::const_iterator it = vNode-&gt;OutEdgeBegin(), eit =</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; vNode-&gt;OutEdgeEnd(); it != eit; ++it)</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; {</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; VFGEdge* edge = *it;</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; VFGNode* succNode = edge-&gt;getDstNode();</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keywordflow">if</span> (visited.find(succNode) == visited.end())</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; {</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; visited.insert(succNode);</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; worklist.push(succNode);</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; }</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; }</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; }</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160;</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <span class="keywordflow">for</span>(Set&lt;const VFGNode*&gt;::const_iterator it = visited.begin(), eit = visited.end(); it!=eit; ++it)</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; {</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="comment">// const VFGNode* node = *it;</span></div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160;<span class="comment"></span> }</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160;}</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160;</div><div class="line"><a name="l00142"></a><span class="lineno"><a class="line" href="svf-ex_8cpp.html#a3c04138a5bfe5d72780bb7e82a18e627"> 142</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="svf-ex_8cpp.html#a3c04138a5bfe5d72780bb7e82a18e627">main</a>(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> ** argv)</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160;{</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160;</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="keywordtype">char</span> **arg_value = <span class="keyword">new</span> <span class="keywordtype">char</span>*[argc];</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; std::vector&lt;std::string&gt; moduleNameVec;</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; moduleNameVec = OptionBase::parseOptions(</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; argc, argv, <span class="stringliteral">&quot;Whole Program Points-to Analysis&quot;</span>, <span class="stringliteral">&quot;[options] &lt;input-bitcode...&gt;&quot;</span></div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; );</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160;</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; <span class="keywordflow">if</span> (Options::WriteAnder() == <span class="stringliteral">&quot;ir_annotator&quot;</span>)</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; {</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; LLVMModuleSet::getLLVMModuleSet()-&gt;preProcessBCs(moduleNameVec);</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; }</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160;</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; SVFModule* svfModule = LLVMModuleSet::getLLVMModuleSet()-&gt;buildSVFModule(moduleNameVec);</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160;</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; SVFIRBuilder builder(svfModule);</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; SVFIR* pag = builder.build();</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160;</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; Andersen* ander = AndersenWaveDiff::createAndersenWaveDiff(pag);</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160;</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160;</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160;</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; PTACallGraph* callgraph = ander-&gt;getPTACallGraph();</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160;</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; ICFG* icfg = pag-&gt;getICFG();</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; icfg-&gt;dump(<span class="stringliteral">&quot;icfg&quot;</span>);</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160;</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; VFG* vfg = <span class="keyword">new</span> VFG(callgraph);</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160;</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; SVFGBuilder svfBuilder(<span class="keyword">true</span>);</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <span class="comment">//SVFG* svfg =</span></div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; svfBuilder.buildFullSVFG(ander);</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160;</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160;</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160;</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <span class="comment">// clean up memory</span></div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="keyword">delete</span> vfg;</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; AndersenWaveDiff::releaseAndersenWaveDiff();</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; SVFIR::releaseSVFIR();</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160;</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; LLVMModuleSet::getLLVMModuleSet()-&gt;dumpModulesToFile(<span class="stringliteral">&quot;.svf.bc&quot;</span>);</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; SVF::LLVMModuleSet::releaseLLVMModuleSet();</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160;</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; llvm::llvm_shutdown();</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <span class="keyword">delete</span>[] arg_value;</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160;}</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160;</div><div class="ttc" id="svf-ex_8cpp_html_addc5529c5b161d0c61eba4944428455e"><div class="ttname"><a href="svf-ex_8cpp.html#addc5529c5b161d0c61eba4944428455e">traverseOnICFG</a></div><div class="ttdeci">void traverseOnICFG(ICFG *icfg, const SVFInstruction *svfInst)</div><div class="ttdef"><b>Definition:</b> <a href="svf-ex_8cpp_source.html#l00077">svf-ex.cpp:77</a></div></div>
71
70
  <div class="ttc" id="namespaceSVF_html_a350ae9bf8606bdfe23c8679681b969dc"><div class="ttname"><a href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">SVF::NodeID</a></div><div class="ttdeci">unsigned NodeID</div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8h_source.html#l00020">MTAResultValidator.h:20</a></div></div>
72
- <div class="ttc" id="svf-ex_8cpp_html_ad2f24f5ef6a8eaf0e4a77a8a4d31bc9f"><div class="ttname"><a href="svf-ex_8cpp.html#ad2f24f5ef6a8eaf0e4a77a8a4d31bc9f">aliasQuery</a></div><div class="ttdeci">SVF::AliasResult aliasQuery(PointerAnalysis *pta, SVFValue *v1, SVFValue *v2)</div><div class="ttdef"><b>Definition:</b> <a href="svf-ex_8cpp_source.html#l00043">svf-ex.cpp:43</a></div></div>
71
+ <div class="ttc" id="svf-ex_8cpp_html_ad2f24f5ef6a8eaf0e4a77a8a4d31bc9f"><div class="ttname"><a href="svf-ex_8cpp.html#ad2f24f5ef6a8eaf0e4a77a8a4d31bc9f">aliasQuery</a></div><div class="ttdeci">SVF::AliasResult aliasQuery(PointerAnalysis *pta, SVFValue *v1, SVFValue *v2)</div><div class="ttdef"><b>Definition:</b> <a href="svf-ex_8cpp_source.html#l00042">svf-ex.cpp:42</a></div></div>
73
72
  <div class="ttc" id="namespacestd_html"><div class="ttname"><a href="namespacestd.html">std</a></div></div>
74
- <div class="ttc" id="svf-ex_8cpp_html_a3c04138a5bfe5d72780bb7e82a18e627"><div class="ttname"><a href="svf-ex_8cpp.html#a3c04138a5bfe5d72780bb7e82a18e627">main</a></div><div class="ttdeci">int main(int argc, char **argv)</div><div class="ttdef"><b>Definition:</b> <a href="svf-ex_8cpp_source.html#l00143">svf-ex.cpp:143</a></div></div>
75
- <div class="ttc" id="svf-ex_8cpp_html_a985b6c880c7922538046c6a1fa987829"><div class="ttname"><a href="svf-ex_8cpp.html#a985b6c880c7922538046c6a1fa987829">printPts</a></div><div class="ttdeci">std::string printPts(PointerAnalysis *pta, SVFValue *val)</div><div class="ttdef"><b>Definition:</b> <a href="svf-ex_8cpp_source.html#l00051">svf-ex.cpp:51</a></div></div>
73
+ <div class="ttc" id="svf-ex_8cpp_html_a3c04138a5bfe5d72780bb7e82a18e627"><div class="ttname"><a href="svf-ex_8cpp.html#a3c04138a5bfe5d72780bb7e82a18e627">main</a></div><div class="ttdeci">int main(int argc, char **argv)</div><div class="ttdef"><b>Definition:</b> <a href="svf-ex_8cpp_source.html#l00142">svf-ex.cpp:142</a></div></div>
74
+ <div class="ttc" id="svf-ex_8cpp_html_a985b6c880c7922538046c6a1fa987829"><div class="ttname"><a href="svf-ex_8cpp.html#a985b6c880c7922538046c6a1fa987829">printPts</a></div><div class="ttdeci">std::string printPts(PointerAnalysis *pta, SVFValue *val)</div><div class="ttdef"><b>Definition:</b> <a href="svf-ex_8cpp_source.html#l00050">svf-ex.cpp:50</a></div></div>
76
75
  <div class="ttc" id="namespaceSVF_html"><div class="ttname"><a href="namespaceSVF.html">SVF</a></div><div class="ttdef"><b>Definition:</b> <a href="LockResultValidator_8cpp_source.html#l00016">LockResultValidator.cpp:16</a></div></div>
77
- <div class="ttc" id="svf-ex_8cpp_html_ad58149e5445ad22ce478339e103ab42b"><div class="ttname"><a href="svf-ex_8cpp.html#ad58149e5445ad22ce478339e103ab42b">traverseOnVFG</a></div><div class="ttdeci">void traverseOnVFG(const SVFG *vfg, SVFValue *val)</div><div class="ttdef"><b>Definition:</b> <a href="svf-ex_8cpp_source.html#l00106">svf-ex.cpp:106</a></div></div>
76
+ <div class="ttc" id="svf-ex_8cpp_html_ad58149e5445ad22ce478339e103ab42b"><div class="ttname"><a href="svf-ex_8cpp.html#ad58149e5445ad22ce478339e103ab42b">traverseOnVFG</a></div><div class="ttdeci">void traverseOnVFG(const SVFG *vfg, SVFValue *val)</div><div class="ttdef"><b>Definition:</b> <a href="svf-ex_8cpp_source.html#l00105">svf-ex.cpp:105</a></div></div>
78
77
  </div><!-- fragment --></div><!-- contents -->
79
78
  <!-- start footer part -->
80
79
  <hr class="footer"/><address class="footer"><small>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svf-tools",
3
- "version": "1.0.634",
3
+ "version": "1.0.635",
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": {
@@ -412,27 +412,25 @@ template <> struct Hash<NodePair>
412
412
  }
413
413
  };
414
414
 
415
- #ifndef DEBUG_WITH_TYPE
416
- # ifndef NDBUG
415
+ #if !defined NDBUG && defined USE_SVF_DBOUT
417
416
  // TODO: This comes from the following link
418
417
  // https://github.com/llvm/llvm-project/blob/75e33f71c2dae584b13a7d1186ae0a038ba98838/llvm/include/llvm/Support/Debug.h#L64
419
418
  // The original LLVM implementation makes use of type. But we can get that info,
420
419
  // so we can't simulate the full behaviour for now.
421
- # define DEBUG_WITH_TYPE(TYPE, X) \
422
- do \
423
- { \
424
- X; \
425
- } while (false)
426
- # else
427
- # define DEBUG_WITH_TYPE(TYPE, X) \
428
- do \
429
- { \
430
- } while (false)
431
- # endif
420
+ # define SVF_DEBUG_WITH_TYPE(TYPE, X) \
421
+ do \
422
+ { \
423
+ X; \
424
+ } while (false)
425
+ #else
426
+ # define SVF_DEBUG_WITH_TYPE(TYPE, X) \
427
+ do \
428
+ { \
429
+ } while (false)
432
430
  #endif
433
431
 
434
432
  /// LLVM debug macros, define type of your DEBUG model of each pass
435
- #define DBOUT(TYPE, X) DEBUG_WITH_TYPE(TYPE, X)
433
+ #define DBOUT(TYPE, X) SVF_DEBUG_WITH_TYPE(TYPE, X)
436
434
  #define DOSTAT(X) X
437
435
  #define DOTIMESTAT(X) X
438
436
 
@@ -33,7 +33,6 @@
33
33
  #include "Util/CommandLine.h"
34
34
  #include "Util/Options.h"
35
35
 
36
- using namespace llvm;
37
36
  using namespace std;
38
37
  using namespace SVF;
39
38