svf-tools 1.0.524 → 1.0.527

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/CMakeLists.txt +1 -1
  2. package/README.md +5 -18
  3. package/SVF-doxygen/html/html/ExtAPI_8cpp.html +8 -7
  4. package/SVF-doxygen/html/html/ExtAPI_8cpp_source.html +24 -21
  5. package/SVF-doxygen/html/html/ExtAPI_8h_source.html +21 -18
  6. package/SVF-doxygen/html/html/SVFModule_8h_source.html +1 -1
  7. package/SVF-doxygen/html/html/SVFUtil_8h_source.html +8 -8
  8. package/SVF-doxygen/html/html/classSVF_1_1ExtAPI-members.html +70 -67
  9. package/SVF-doxygen/html/html/classSVF_1_1ExtAPI.html +146 -54
  10. package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +6 -6
  11. package/SVF-doxygen/html/html/classSVF_1_1SVFModule.html +1 -1
  12. package/SVF-doxygen/html/html/functions_a.html +11 -8
  13. package/SVF-doxygen/html/html/functions_e.html +5 -2
  14. package/SVF-doxygen/html/html/functions_func.html +14 -11
  15. package/SVF-doxygen/html/html/functions_func_e.html +5 -2
  16. package/SVF-doxygen/html/html/functions_func_g.html +10 -10
  17. package/SVF-doxygen/html/html/functions_g.html +10 -10
  18. package/SVF-doxygen/html/html/functions_l.html +3 -3
  19. package/SVF-doxygen/html/html/functions_m.html +1 -1
  20. package/SVF-doxygen/html/html/functions_n.html +3 -3
  21. package/SVF-doxygen/html/html/functions_o.html +3 -3
  22. package/SVF-doxygen/html/html/functions_p.html +6 -6
  23. package/SVF-doxygen/html/html/functions_r.html +4 -6
  24. package/SVF-doxygen/html/html/functions_s.html +12 -10
  25. package/SVF-doxygen/html/html/functions_t.html +8 -10
  26. package/SVF-doxygen/html/html/functions_w.html +11 -11
  27. package/SVF-doxygen/html/html/search/all_1.js +1 -0
  28. package/SVF-doxygen/html/html/search/all_10.js +4 -4
  29. package/SVF-doxygen/html/html/search/all_11.js +2 -2
  30. package/SVF-doxygen/html/html/search/all_12.js +8 -8
  31. package/SVF-doxygen/html/html/search/all_13.js +4 -4
  32. package/SVF-doxygen/html/html/search/all_16.js +2 -2
  33. package/SVF-doxygen/html/html/search/all_5.js +2 -1
  34. package/SVF-doxygen/html/html/search/all_7.js +2 -2
  35. package/SVF-doxygen/html/html/search/all_c.js +1 -1
  36. package/SVF-doxygen/html/html/search/all_d.js +1 -1
  37. package/SVF-doxygen/html/html/search/all_e.js +2 -2
  38. package/SVF-doxygen/html/html/search/all_f.js +1 -1
  39. package/SVF-doxygen/html/html/search/functions_0.js +1 -0
  40. package/SVF-doxygen/html/html/search/functions_4.js +2 -1
  41. package/SVF-doxygen/html/html/search/functions_6.js +2 -2
  42. package/SVF-doxygen/html/html/search/variables_13.js +1 -1
  43. package/SVF-doxygen/html/html/search/variables_e.js +1 -1
  44. package/{doc → docs}/.gitignore +0 -0
  45. package/docs/README.md +8 -0
  46. package/{doc → docs}/doxygen.config +0 -0
  47. package/{images → docs/images}/PAG.png +0 -0
  48. package/{images → docs/images}/andersen.png +0 -0
  49. package/{images → docs/images}/callgraph.png +0 -0
  50. package/{images → docs/images}/consG.png +0 -0
  51. package/{images → docs/images}/cpu2000-flto +0 -0
  52. package/{images → docs/images}/cpu2006-flto +0 -0
  53. package/{images → docs/images}/database.png +0 -0
  54. package/{images → docs/images}/framework.png +0 -0
  55. package/{images → docs/images}/help.png +0 -0
  56. package/{images → docs/images}/icfg.png +0 -0
  57. package/{images → docs/images}/mssa-cha.png +0 -0
  58. package/{images → docs/images}/pagedge.png +0 -0
  59. package/{images → docs/images}/pagnode.png +0 -0
  60. package/{images → docs/images}/pt.png +0 -0
  61. package/{images → docs/images}/setupcmake.png +0 -0
  62. package/{images → docs/images}/setupconfiguration.png +0 -0
  63. package/{images → docs/images}/setupdashboard.png +0 -0
  64. package/{images → docs/images}/setupdebug.png +0 -0
  65. package/{images → docs/images}/setupenv.png +0 -0
  66. package/{images → docs/images}/startup.png +0 -0
  67. package/{images → docs/images}/svf-stat.pdf +0 -0
  68. package/{images → docs/images}/svfg-framework.png +0 -0
  69. package/{images → docs/images}/svfg.png +0 -0
  70. package/{images → docs/images}/svfg_opt.png +0 -0
  71. package/{images → docs/images}/svfgedge-cha.png +0 -0
  72. package/{images → docs/images}/svfgnode-cha.png +0 -0
  73. package/{images → docs/images}/tools.png +0 -0
  74. package/{images → docs/images}/users.png +0 -0
  75. package/{images → docs/images}/vm1.png +0 -0
  76. package/{images → docs/images}/vm2.png +0 -0
  77. package/{images → docs/images}/vm3.png +0 -0
  78. package/{images → docs/images}/vm4.png +0 -0
  79. package/{images → docs/images}/vm5.png +0 -0
  80. package/{stylesheets → docs/stylesheets}/github-light.css +0 -0
  81. package/{stylesheets → docs/stylesheets}/normalize.css +0 -0
  82. package/{stylesheets → docs/stylesheets}/stylesheet.css +0 -0
  83. package/include/Util/ExtAPI.h +7 -2
  84. package/index.html +3 -3
  85. package/lib/Util/ExtAPI.cpp +37 -4
  86. package/package.json +1 -1
  87. package/config.in +0 -6
package/CMakeLists.txt CHANGED
@@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.13.4)
3
3
  project("SVF")
4
4
 
5
5
 
6
- configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.in ${CMAKE_CURRENT_SOURCE_DIR}/include/Util/config.h @ONLY)
6
+ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/.config.in ${CMAKE_CURRENT_SOURCE_DIR}/include/Util/config.h @ONLY)
7
7
 
8
8
  # To support both in- and out-of-source builds,
9
9
  # we check for the presence of the add_llvm_loadable_module command.
package/README.md CHANGED
@@ -21,28 +21,19 @@
21
21
 
22
22
  ## Documentation
23
23
 
24
- If you want to build the documentation yourself go into doc and invoke doxygen:
25
- ```
26
- cd doc && doxygen doxygen.config
27
- ```
28
-
29
- #### We are looking for self-motivated PhD students and we welcome industry collaboration/sponsorship to improve SVF (Please contact yulei.sui@uts.edu.au if you are interested)
30
-
24
+ <b>SVF</b> is a source code analysis tool that enables interprocedural dependence analysis for LLVM-based languages. <b>SVF</b> is able to perform pointer alias analysis, memory SSA form construction, value-flow tracking, context-free-reachability analysis, path-sensitive typestate analysis and memory error checking. <b>SVF</b>'s doxygen document is [here](https://svf-tools.github.io/SVF-doxygen/html).
31
25
 
32
- <br />
33
- <br />
34
- <br />
35
- SVF is a source code analysis tool that enables interprocedural dependence analysis for LLVM-based languages. SVF is able to perform pointer alias analysis, memory SSA form construction, value-flow tracking for program variables and memory error checking.
36
- <br />
37
26
  <br />
38
27
 
39
28
  | About SVF | Setup Guide | User Guide | Developer Guide |
40
29
  | ------------- |:-------------:| -----:|-----:|
41
- | ![About](https://github.com/svf-tools/SVF/blob/master/images/help.png?raw=true)| ![Setup](https://github.com/svf-tools/SVF/blob/master/images/tools.png?raw=true) | ![User](https://github.com/svf-tools/SVF/blob/master/images/users.png?raw=true) | ![Developer](https://github.com/svf-tools/SVF/blob/master/images/database.png?raw=true)
30
+ | ![About](https://github.com/svf-tools/SVF/blob/master/docs/images/help.png?raw=true)| ![Setup](https://github.com/svf-tools/SVF/blob/master/docs/images/tools.png?raw=true) | ![User](https://github.com/svf-tools/SVF/blob/master/docs/images/users.png?raw=true) | ![Developer](https://github.com/svf-tools/SVF/blob/master/docs/images/database.png?raw=true)
42
31
  | Introducing SVF -- [what it does](https://github.com/svf-tools/SVF/wiki/About#what-is-svf) and [how we design it](https://github.com/svf-tools/SVF/wiki/SVF-Design#svf-design) | A step by step [setup guide](https://github.com/svf-tools/SVF/wiki/Setup-Guide#getting-started) to build SVF | Command-line options to [run SVF](https://github.com/svf-tools/SVF/wiki/User-Guide#quick-start), get [analysis outputs](https://github.com/svf-tools/SVF/wiki/User-Guide#analysis-outputs), and test SVF with [an example](https://github.com/svf-tools/SVF/wiki/Analyze-a-Simple-C-Program) or [PTABen](https://github.com/SVF-tools/PTABen) | Detailed [technical documentation](https://github.com/svf-tools/SVF/wiki/Technical-documentation) and how to [write your own analyses](https://github.com/svf-tools/SVF/wiki/Write-your-own-analysis-in-SVF) in SVF or [use SVF as a lib](https://github.com/SVF-tools/SVF-example) for your tool |
43
32
 
44
-
45
33
  <br />
34
+
35
+ #### We are looking for self-motivated PhD students and we welcome industry collaboration/sponsorship to improve SVF (Please contact yulei.sui@uts.edu.au if you are interested)
36
+
46
37
  <br />
47
38
  <p>We release SVF source code in the hope of benefiting others. You are kindly asked to acknowledge usage of the tool by citing some of our publications listed http://svf-tools.github.io/SVF, especially the following two: </p>
48
39
 
@@ -69,7 +60,3 @@ SVF is a source code analysis tool that enables interprocedural dependence analy
69
60
  publisher={IEEE}
70
61
  }
71
62
  ```
72
-
73
-
74
-
75
-
@@ -70,6 +70,7 @@ $(function() {
70
70
  <div class="contents">
71
71
  <div class="textblock"><code>#include &quot;<a class="el" href="ExtAPI_8h_source.html">Util/ExtAPI.h</a>&quot;</code><br />
72
72
  <code>#include &quot;<a class="el" href="SVFUtil_8h_source.html">Util/SVFUtil.h</a>&quot;</code><br />
73
+ <code>#include &quot;<a class="el" href="cJSON_8h_source.html">Util/cJSON.h</a>&quot;</code><br />
73
74
  <code>#include &lt;string.h&gt;</code><br />
74
75
  <code>#include &lt;sys/stat.h&gt;</code><br />
75
76
  <code>#include &lt;stdlib.h&gt;</code><br />
@@ -110,9 +111,9 @@ Functions</h2></td></tr>
110
111
  </table>
111
112
  </div><div class="memdoc">
112
113
 
113
- <p class="definition">Definition at line <a class="el" href="ExtAPI_8cpp_source.html#l00066">66</a> of file <a class="el" href="ExtAPI_8cpp_source.html">ExtAPI.cpp</a>.</p>
114
- <div class="fragment"><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; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> jsonFilePath = <a class="code" href="ExtAPI_8cpp.html#a424940f91f234b23bcc633f12269f935">GetStdoutFromCommand</a>(path);</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; <span class="keywordflow">if</span> (path.compare(<span class="stringliteral">&quot;npm root&quot;</span>) == 0)</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; <span class="keywordtype">int</span> os_flag = 1;</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; <span class="comment">// SVF installed via npm needs to determine the type of operating system,</span></div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="comment">// otherwise the ExtAPI.json path may not be found</span></div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="comment">// Linux os</span></div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160;<span class="preprocessor">#ifdef linux</span></div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; os_flag = 0;</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; jsonFilePath.append(<span class="stringliteral">&quot;/svf-lib/SVF-linux&quot;</span>);</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <span class="comment">// Mac os</span></div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <span class="keywordflow">if</span> (os_flag == 1)</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; {</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; jsonFilePath.append(<span class="stringliteral">&quot;/svf-lib/SVF-osx&quot;</span>);</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; }</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; }</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; jsonFilePath.append(<a class="code" href="ExtAPI_8h.html#ad9bef4304f41728bb3edf259c6b67668">EXTAPI_JSON_PATH</a>);</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <span class="keywordflow">return</span> jsonFilePath;</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160;}</div><div class="ttc" id="ExtAPI_8h_html_ad9bef4304f41728bb3edf259c6b67668"><div class="ttname"><a href="ExtAPI_8h.html#ad9bef4304f41728bb3edf259c6b67668">EXTAPI_JSON_PATH</a></div><div class="ttdeci">#define EXTAPI_JSON_PATH</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00039">ExtAPI.h:39</a></div></div>
115
- <div class="ttc" id="ExtAPI_8cpp_html_a424940f91f234b23bcc633f12269f935"><div class="ttname"><a href="ExtAPI_8cpp.html#a424940f91f234b23bcc633f12269f935">GetStdoutFromCommand</a></div><div class="ttdeci">static std::string GetStdoutFromCommand(const std::string &amp;command)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00042">ExtAPI.cpp:42</a></div></div>
114
+ <p class="definition">Definition at line <a class="el" href="ExtAPI_8cpp_source.html#l00067">67</a> of file <a class="el" href="ExtAPI_8cpp_source.html">ExtAPI.cpp</a>.</p>
115
+ <div class="fragment"><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; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> jsonFilePath = <a class="code" href="ExtAPI_8cpp.html#a424940f91f234b23bcc633f12269f935">GetStdoutFromCommand</a>(path);</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="keywordflow">if</span> (path.compare(<span class="stringliteral">&quot;npm root&quot;</span>) == 0)</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; <span class="keywordtype">int</span> os_flag = 1;</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="comment">// SVF installed via npm needs to determine the type of operating system,</span></div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="comment">// otherwise the ExtAPI.json path may not be found</span></div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="comment">// Linux os</span></div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160;<span class="preprocessor">#ifdef linux</span></div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; os_flag = 0;</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; jsonFilePath.append(<span class="stringliteral">&quot;/svf-lib/SVF-linux&quot;</span>);</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <span class="comment">// Mac os</span></div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; <span class="keywordflow">if</span> (os_flag == 1)</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; {</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; jsonFilePath.append(<span class="stringliteral">&quot;/svf-lib/SVF-osx&quot;</span>);</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; }</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; }</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; jsonFilePath.append(<a class="code" href="ExtAPI_8h.html#ad9bef4304f41728bb3edf259c6b67668">EXTAPI_JSON_PATH</a>);</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; <span class="keywordflow">return</span> jsonFilePath;</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160;}</div><div class="ttc" id="ExtAPI_8h_html_ad9bef4304f41728bb3edf259c6b67668"><div class="ttname"><a href="ExtAPI_8h.html#ad9bef4304f41728bb3edf259c6b67668">EXTAPI_JSON_PATH</a></div><div class="ttdeci">#define EXTAPI_JSON_PATH</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00039">ExtAPI.h:39</a></div></div>
116
+ <div class="ttc" id="ExtAPI_8cpp_html_a424940f91f234b23bcc633f12269f935"><div class="ttname"><a href="ExtAPI_8cpp.html#a424940f91f234b23bcc633f12269f935">GetStdoutFromCommand</a></div><div class="ttdeci">static std::string GetStdoutFromCommand(const std::string &amp;command)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00043">ExtAPI.cpp:43</a></div></div>
116
117
  <div class="ttc" id="cJSON_8h_html_ad4c68ea99a26b0a98ad9a79982960458"><div class="ttname"><a href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">string</a></div><div class="ttdeci">const char *const string</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00172">cJSON.h:172</a></div></div>
117
118
  </div><!-- fragment -->
118
119
  </div>
@@ -141,8 +142,8 @@ Functions</h2></td></tr>
141
142
  </table>
142
143
  </div><div class="memdoc">
143
144
 
144
- <p class="definition">Definition at line <a class="el" href="ExtAPI_8cpp_source.html#l00042">42</a> of file <a class="el" href="ExtAPI_8cpp_source.html">ExtAPI.cpp</a>.</p>
145
- <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="keywordtype">char</span> <a class="code" href="cJSON_8h.html#a503753140aa27b00f99a3501280b2746">buffer</a>[128];</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> result = <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; <span class="comment">// Open pipe to file</span></div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; FILE *pipe = popen(command.c_str(), <span class="stringliteral">&quot;r&quot;</span>);</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; <span class="keywordflow">if</span> (!pipe)</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; {</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;popen failed!&quot;</span>;</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; <span class="comment">// read till end of process:</span></div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; <span class="keywordflow">while</span> (!feof(pipe))</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; {</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="comment">// use buffer to read and add to result</span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; <span class="keywordflow">if</span> (fgets(buffer, 128, pipe) != <a class="code" href="cJSON_8cpp.html#a1a05ede2ad100bf5de5dfa7ccdfa4397">NULL</a>)</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; result += buffer;</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; }</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; pclose(pipe);</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="comment">// remove &quot;\n&quot;</span></div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; result.erase(<span class="keyword">remove</span>(result.begin(), result.end(), <span class="charliteral">&#39;\n&#39;</span>), result.end());</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; <span class="keywordflow">return</span> result;</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;}</div><div class="ttc" id="cJSON_8h_html_a503753140aa27b00f99a3501280b2746"><div class="ttname"><a href="cJSON_8h.html#a503753140aa27b00f99a3501280b2746">buffer</a></div><div class="ttdeci">char * buffer</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00163">cJSON.h:163</a></div></div>
145
+ <p class="definition">Definition at line <a class="el" href="ExtAPI_8cpp_source.html#l00043">43</a> of file <a class="el" href="ExtAPI_8cpp_source.html">ExtAPI.cpp</a>.</p>
146
+ <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="keywordtype">char</span> <a class="code" href="cJSON_8h.html#a503753140aa27b00f99a3501280b2746">buffer</a>[128];</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> result = <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <span class="comment">// Open pipe to file</span></div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; FILE *pipe = popen(command.c_str(), <span class="stringliteral">&quot;r&quot;</span>);</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <span class="keywordflow">if</span> (!pipe)</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; {</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;popen failed!&quot;</span>;</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; <span class="comment">// read till end of process:</span></div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <span class="keywordflow">while</span> (!feof(pipe))</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; <span class="comment">// use buffer to read and add to result</span></div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="keywordflow">if</span> (fgets(buffer, 128, pipe) != <a class="code" href="cJSON_8cpp.html#a1a05ede2ad100bf5de5dfa7ccdfa4397">NULL</a>)</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; result += buffer;</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; }</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; pclose(pipe);</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <span class="comment">// remove &quot;\n&quot;</span></div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; result.erase(<span class="keyword">remove</span>(result.begin(), result.end(), <span class="charliteral">&#39;\n&#39;</span>), result.end());</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="keywordflow">return</span> result;</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160;}</div><div class="ttc" id="cJSON_8h_html_a503753140aa27b00f99a3501280b2746"><div class="ttname"><a href="cJSON_8h.html#a503753140aa27b00f99a3501280b2746">buffer</a></div><div class="ttdeci">char * buffer</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00163">cJSON.h:163</a></div></div>
146
147
  <div class="ttc" id="cJSON_8cpp_html_a1a05ede2ad100bf5de5dfa7ccdfa4397"><div class="ttname"><a href="cJSON_8cpp.html#a1a05ede2ad100bf5de5dfa7ccdfa4397">NULL</a></div><div class="ttdeci">return NULL</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8cpp_source.html#l01173">cJSON.cpp:1173</a></div></div>
147
148
  <div class="ttc" id="cJSON_8h_html_ad4c68ea99a26b0a98ad9a79982960458"><div class="ttname"><a href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">string</a></div><div class="ttdeci">const char *const string</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00172">cJSON.h:172</a></div></div>
148
149
  </div><!-- fragment -->
@@ -182,8 +183,8 @@ Functions</h2></td></tr>
182
183
  </table>
183
184
  </div><div class="memdoc">
184
185
 
185
- <p class="definition">Definition at line <a class="el" href="ExtAPI_8cpp_source.html#l00089">89</a> of file <a class="el" href="ExtAPI_8cpp_source.html">ExtAPI.cpp</a>.</p>
186
- <div class="fragment"><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; FILE *file = fopen(path.c_str(), <span class="stringliteral">&quot;r&quot;</span>);</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keywordflow">if</span> (!file)</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; {</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</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;</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="comment">// allocate memory size matched with file size</span></div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; <span class="keywordtype">char</span> *jsonStr = (<span class="keywordtype">char</span> *)calloc(fileSize + 1, <span class="keyword">sizeof</span>(<span class="keywordtype">char</span>));</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; <span class="comment">// read json string from file</span></div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> size = fread(jsonStr, <span class="keyword">sizeof</span>(<span class="keywordtype">char</span>), fileSize, file);</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <span class="keywordflow">if</span> (size == 0)</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; {</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">SVFUtil::errs</a>() &lt;&lt; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a5d4bb92f5df30417f414397f8e58cf01">SVFUtil::errMsg</a>(<span class="stringliteral">&quot;\t Wrong ExtAPI.json path!! &quot;</span>) &lt;&lt; <span class="stringliteral">&quot;The current ExtAPI.json path is: &quot;</span> &lt;&lt; path &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;Read ExtAPI.json file fails!&quot;</span>);</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</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; fclose(file);</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; <span class="comment">// convert json string to json pointer variable</span></div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <a class="code" href="structcJSON.html">cJSON</a> *root = cJSON_Parse(jsonStr);</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="keywordflow">if</span> (!root)</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; {</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; free(jsonStr);</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; }</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; free(jsonStr);</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="keywordflow">return</span> root;</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160;}</div><div class="ttc" id="namespaceSVF_html_ad42bff8d0a7d60a085aa32d10f4955af"><div class="ttname"><a href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">SVF::u32_t</a></div><div class="ttdeci">unsigned u32_t</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00085">SVFBasicTypes.h:85</a></div></div>
186
+ <p class="definition">Definition at line <a class="el" href="ExtAPI_8cpp_source.html#l00090">90</a> of file <a class="el" href="ExtAPI_8cpp_source.html">ExtAPI.cpp</a>.</p>
187
+ <div class="fragment"><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; FILE *file = fopen(path.c_str(), <span class="stringliteral">&quot;r&quot;</span>);</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <span class="keywordflow">if</span> (!file)</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; <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; }</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; <span class="comment">// allocate memory size matched with file size</span></div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <span class="keywordtype">char</span> *jsonStr = (<span class="keywordtype">char</span> *)calloc(fileSize + 1, <span class="keyword">sizeof</span>(<span class="keywordtype">char</span>));</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; <span class="comment">// read json string from file</span></div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> size = fread(jsonStr, <span class="keyword">sizeof</span>(<span class="keywordtype">char</span>), fileSize, file);</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="keywordflow">if</span> (size == 0)</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; {</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">SVFUtil::errs</a>() &lt;&lt; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a5d4bb92f5df30417f414397f8e58cf01">SVFUtil::errMsg</a>(<span class="stringliteral">&quot;\t Wrong ExtAPI.json path!! &quot;</span>) &lt;&lt; <span class="stringliteral">&quot;The current ExtAPI.json path is: &quot;</span> &lt;&lt; path &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;Read ExtAPI.json file fails!&quot;</span>);</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</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; fclose(file);</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160;</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="comment">// convert json string to json pointer variable</span></div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <a class="code" href="structcJSON.html">cJSON</a> *root = cJSON_Parse(jsonStr);</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; <span class="keywordflow">if</span> (!root)</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; {</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; free(jsonStr);</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</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; free(jsonStr);</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <span class="keywordflow">return</span> root;</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160;}</div><div class="ttc" id="namespaceSVF_html_ad42bff8d0a7d60a085aa32d10f4955af"><div class="ttname"><a href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">SVF::u32_t</a></div><div class="ttdeci">unsigned u32_t</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00085">SVFBasicTypes.h:85</a></div></div>
187
188
  <div class="ttc" id="structcJSON_html"><div class="ttname"><a href="structcJSON.html">cJSON</a></div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00103">cJSON.h:103</a></div></div>
188
189
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_ab65033f068bfbeb0a1c52dcec3beb6bc"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">SVF::SVFUtil::errs</a></div><div class="ttdeci">std::ostream &amp; errs()</div><div class="ttdoc">Overwrite llvm::errs() </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00055">SVFUtil.h:55</a></div></div>
189
190
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a5d4bb92f5df30417f414397f8e58cf01"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a5d4bb92f5df30417f414397f8e58cf01">SVF::SVFUtil::errMsg</a></div><div class="ttdeci">std::string errMsg(std::string msg)</div><div class="ttdoc">Print error message by converting a string into red string output. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8cpp_source.html#l00076">SVFUtil.cpp:76</a></div></div>