svf-tools 1.0.526 → 1.0.529
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.
- package/SVF-doxygen/html/html/ExtAPI_8cpp.html +8 -7
- package/SVF-doxygen/html/html/ExtAPI_8cpp_source.html +24 -21
- package/SVF-doxygen/html/html/ExtAPI_8h_source.html +21 -18
- package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +6 -6
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/SVFModule_8h_source.html +1 -1
- package/SVF-doxygen/html/html/SVFUtil_8h_source.html +8 -8
- package/SVF-doxygen/html/html/TypeAnalysis_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/VersionedFlowSensitiveStat_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ExtAPI-members.html +70 -67
- package/SVF-doxygen/html/html/classSVF_1_1ExtAPI.html +146 -54
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +18 -16
- package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1SVFModule.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitiveStat.html +9 -7
- package/SVF-doxygen/html/html/functions_a.html +11 -8
- package/SVF-doxygen/html/html/functions_e.html +5 -2
- package/SVF-doxygen/html/html/functions_func.html +14 -11
- package/SVF-doxygen/html/html/functions_func_e.html +5 -2
- package/SVF-doxygen/html/html/functions_func_g.html +10 -10
- package/SVF-doxygen/html/html/functions_g.html +10 -10
- package/SVF-doxygen/html/html/functions_l.html +3 -3
- package/SVF-doxygen/html/html/functions_m.html +1 -1
- package/SVF-doxygen/html/html/functions_n.html +3 -3
- package/SVF-doxygen/html/html/functions_o.html +3 -3
- package/SVF-doxygen/html/html/functions_p.html +6 -6
- package/SVF-doxygen/html/html/functions_r.html +4 -6
- package/SVF-doxygen/html/html/functions_s.html +12 -10
- package/SVF-doxygen/html/html/functions_t.html +8 -10
- package/SVF-doxygen/html/html/functions_w.html +11 -11
- package/SVF-doxygen/html/html/search/all_1.js +1 -0
- package/SVF-doxygen/html/html/search/all_10.js +4 -4
- package/SVF-doxygen/html/html/search/all_11.js +2 -2
- package/SVF-doxygen/html/html/search/all_12.js +8 -8
- package/SVF-doxygen/html/html/search/all_13.js +4 -4
- package/SVF-doxygen/html/html/search/all_16.js +2 -2
- package/SVF-doxygen/html/html/search/all_5.js +2 -1
- package/SVF-doxygen/html/html/search/all_7.js +2 -2
- package/SVF-doxygen/html/html/search/all_c.js +1 -1
- package/SVF-doxygen/html/html/search/all_d.js +1 -1
- package/SVF-doxygen/html/html/search/all_e.js +2 -2
- package/SVF-doxygen/html/html/search/all_f.js +1 -1
- package/SVF-doxygen/html/html/search/functions_0.js +1 -0
- package/SVF-doxygen/html/html/search/functions_4.js +2 -1
- package/SVF-doxygen/html/html/search/functions_6.js +2 -2
- package/SVF-doxygen/html/html/search/variables_13.js +1 -1
- package/SVF-doxygen/html/html/search/variables_e.js +1 -1
- package/include/Util/ExtAPI.h +7 -2
- package/lib/MemoryModel/PointerAnalysisImpl.cpp +1 -1
- package/lib/Util/ExtAPI.cpp +37 -4
- package/lib/WPA/FlowSensitiveStat.cpp +3 -2
- package/lib/WPA/TypeAnalysis.cpp +1 -0
- package/lib/WPA/VersionedFlowSensitiveStat.cpp +3 -2
- package/package.json +1 -1
|
@@ -66,12 +66,12 @@ $(function() {
|
|
|
66
66
|
<div class="title">ExtAPI.cpp</div> </div>
|
|
67
67
|
</div><!--header-->
|
|
68
68
|
<div class="contents">
|
|
69
|
-
<a href="ExtAPI_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">//===- ExtAPI.cpp -- External functions -----------------------------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">// SVF: Static Value-Flow Analysis</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">// Copyright (C) <2013-2017> <Yulei Sui></span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">//</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> </div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">// This program is free software: you can redistribute it and/or modify</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">// it under the terms of the GNU General Public License as published by</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">// the Free Software Foundation, either version 3 of the License, or</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">// (at your option) any later version.</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> </div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">// This program is distributed in the hope that it will be useful,</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="comment">// GNU General Public License for more details.</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="comment">// You should have received a copy of the GNU General Public License</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="comment">// along with this program. If not, see <http://www.gnu.org/licenses/>.</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="comment">//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> </div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="comment">/*</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment"> * ExtAPI.cpp</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="comment"> *</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment"> * Created on: July 1, 2022</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="comment"> * Author: Shuangxiang Kan</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment"> */</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> </div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="preprocessor">#include "<a class="code" href="ExtAPI_8h.html">Util/ExtAPI.h</a>"</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="preprocessor">#include "<a class="code" href="SVFUtil_8h.html">Util/SVFUtil.h</a>"</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="preprocessor">#include <string.h></span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="preprocessor">#include <sys/stat.h></span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="preprocessor">#include <stdlib.h></span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> </div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> </div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> <a class="code" href="classSVF_1_1ExtAPI.html">ExtAPI</a> *<a class="code" href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">ExtAPI::extOp</a> = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <a class="code" href="structcJSON.html">cJSON</a> *<a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">ExtAPI::root</a> = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> </div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="comment">// Get environment variables $SVF_DIR and "npm root" through popen() method</span></div><div class="line"><a name="l00042"></a><span class="lineno"><a class="line" href="ExtAPI_8cpp.html#a424940f91f234b23bcc633f12269f935"> 42</a></span> <span class="keyword">static</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="ExtAPI_8cpp.html#a424940f91f234b23bcc633f12269f935">GetStdoutFromCommand</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &command)</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> {</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  <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>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> result = <span class="stringliteral">""</span>;</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  <span class="comment">// Open pipe to file</span></div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  FILE *pipe = popen(command.c_str(), <span class="stringliteral">"r"</span>);</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  <span class="keywordflow">if</span> (!pipe)</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  {</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <span class="keywordflow">return</span> <span class="stringliteral">"popen failed!"</span>;</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  }</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  <span class="comment">// read till end of process:</span></div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  <span class="keywordflow">while</span> (!feof(pipe))</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  {</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  <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>  <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>  result += buffer;</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  }</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  pclose(pipe);</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <span class="comment">// remove "\n"</span></div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  result.erase(<span class="keyword">remove</span>(result.begin(), result.end(), <span class="charliteral">'\n'</span>), result.end());</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span> }</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span> </div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> <span class="comment">// Get ExtAPI.json file</span></div><div class="line"><a name="l00066"></a><span class="lineno"><a class="line" href="ExtAPI_8cpp.html#a82e0f4095086de7f384a1f55838b5d28"> 66</a></span> <span class="keyword">static</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="ExtAPI_8cpp.html#a82e0f4095086de7f384a1f55838b5d28">getJsonFile</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &path)</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span> {</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  <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>  <span class="keywordflow">if</span> (path.compare(<span class="stringliteral">"npm root"</span>) == 0)</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  {</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  <span class="keywordtype">int</span> os_flag = 1;</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  <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>  <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>  <span class="comment">// Linux os</span></div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span> <span class="preprocessor">#ifdef linux</span></div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  os_flag = 0;</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  jsonFilePath.append(<span class="stringliteral">"/svf-lib/SVF-linux"</span>);</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  <span class="comment">// Mac os</span></div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  <span class="keywordflow">if</span> (os_flag == 1)</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  {</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  jsonFilePath.append(<span class="stringliteral">"/svf-lib/SVF-osx"</span>);</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  }</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  }</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  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>  <span class="keywordflow">return</span> jsonFilePath;</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span> }</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span> </div><div class="line"><a name="l00089"></a><span class="lineno"><a class="line" href="ExtAPI_8cpp.html#a3957468a4d85cef02d8be1f82bcdfc69"> 89</a></span> <span class="keyword">static</span> <a class="code" href="structcJSON.html">cJSON</a> *<a class="code" href="ExtAPI_8cpp.html#a3957468a4d85cef02d8be1f82bcdfc69">parseJson</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &path, off_t fileSize)</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span> {</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  FILE *file = fopen(path.c_str(), <span class="stringliteral">"r"</span>);</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  <span class="keywordflow">if</span> (!file)</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  {</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  }</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span> </div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  <span class="comment">// allocate memory size matched with file size</span></div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  <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> </div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <span class="comment">// read json string from file</span></div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  <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>  <span class="keywordflow">if</span> (size == 0)</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  {</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">SVFUtil::errs</a>() << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a5d4bb92f5df30417f414397f8e58cf01">SVFUtil::errMsg</a>(<span class="stringliteral">"\t Wrong ExtAPI.json path!! "</span>) << <span class="stringliteral">"The current ExtAPI.json path is: "</span> << path << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"Read ExtAPI.json file fails!"</span>);</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  }</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  fclose(file);</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span> </div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="comment">// convert json string to json pointer variable</span></div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  <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>  <span class="keywordflow">if</span> (!root)</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  {</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  free(jsonStr);</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  }</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  free(jsonStr);</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <span class="keywordflow">return</span> root;</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span> }</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span> </div><div class="line"><a name="l00121"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a02380d22fd6021ebce1e54723d695c99"> 121</a></span> <a class="code" href="classSVF_1_1ExtAPI.html">ExtAPI</a> *<a class="code" href="classSVF_1_1ExtAPI.html#a02380d22fd6021ebce1e54723d695c99">ExtAPI::getExtAPI</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &path)</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span> {</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">extOp</a> == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  {</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">extOp</a> = <span class="keyword">new</span> <a class="code" href="classSVF_1_1ExtAPI.html#ab793be4b6f8f0a025599e76f5df2a4eb">ExtAPI</a>;</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  }</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">root</a> == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  {</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  <span class="keyword">struct </span>stat statbuf;</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span> </div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  <span class="comment">// Four ways to get ExtAPI.json path</span></div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <span class="comment">// 1. Explicit path provided</span></div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  <span class="comment">// 2. default path (get ExtAPI.json path from Util/config.h)</span></div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="comment">// 3. from $SVF_DIR</span></div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <span class="comment">// 4. from "npm root"(If SVF is installed via npm)</span></div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span> </div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> jsonFilePath = path;</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <span class="keywordflow">if</span> (!jsonFilePath.empty() && !stat(jsonFilePath.c_str(), &statbuf))</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  {</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">root</a> = <a class="code" href="ExtAPI_8cpp.html#a3957468a4d85cef02d8be1f82bcdfc69">parseJson</a>(jsonFilePath, statbuf.st_size);</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">extOp</a>;</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  }</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span> </div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  jsonFilePath = <a class="code" href="config_8h.html#a799965f801bbe1f540c3100566f78d81">PROJECT_PATH</a> + <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a>(<a class="code" href="ExtAPI_8h.html#ad9bef4304f41728bb3edf259c6b67668">EXTAPI_JSON_PATH</a>);</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  <span class="keywordflow">if</span> (!stat(jsonFilePath.c_str(), &statbuf))</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  {</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">root</a> = <a class="code" href="ExtAPI_8cpp.html#a3957468a4d85cef02d8be1f82bcdfc69">parseJson</a>(jsonFilePath, statbuf.st_size);</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">extOp</a>;</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  }</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span> </div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  jsonFilePath = <a class="code" href="ExtAPI_8cpp.html#a82e0f4095086de7f384a1f55838b5d28">getJsonFile</a>(<span class="stringliteral">"$SVF_DIR"</span>);</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <span class="keywordflow">if</span> (!stat(jsonFilePath.c_str(), &statbuf))</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  {</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">root</a> = <a class="code" href="ExtAPI_8cpp.html#a3957468a4d85cef02d8be1f82bcdfc69">parseJson</a>(jsonFilePath, statbuf.st_size);</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">extOp</a>;</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  }</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span> </div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  jsonFilePath = <a class="code" href="ExtAPI_8cpp.html#a82e0f4095086de7f384a1f55838b5d28">getJsonFile</a>(<span class="stringliteral">"npm root"</span>);</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <span class="keywordflow">if</span> (!stat(jsonFilePath.c_str(), &statbuf))</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  {</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">root</a> = <a class="code" href="ExtAPI_8cpp.html#a3957468a4d85cef02d8be1f82bcdfc69">parseJson</a>(jsonFilePath, statbuf.st_size);</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">extOp</a>;</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  }</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span> </div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"Open ExtAPI.json file fails!"</span>);</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  }</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">extOp</a>;</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span> }</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span> </div><div class="line"><a name="l00170"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#abe3e0e2500532acfc01cee7e2ce1cd90"> 170</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1ExtAPI.html#abe3e0e2500532acfc01cee7e2ce1cd90">ExtAPI::destory</a>()</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span> {</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">extOp</a> != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  {</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <span class="keyword">delete</span> <a class="code" href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">extOp</a>;</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">extOp</a> = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  }</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">root</a> != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  {</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  <a class="code" href="cJSON_8cpp.html#afde5c619f31577b3d821b56b23953c85">cJSON_Delete</a>(<a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">root</a>);</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">root</a> = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  }</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span> }</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span> </div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span> <span class="comment">// Get the corresponding name in ext_t, e.g. "EXT_ADDR" in {"addr", EXT_ADDR},</span></div><div class="line"><a name="l00185"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a6298f765cd73e9d71fc6b3b55fb7e56f"> 185</a></span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094">ExtAPI::extf_t</a> <a class="code" href="classSVF_1_1ExtAPI.html#a6298f765cd73e9d71fc6b3b55fb7e56f">ExtAPI::get_opName</a>(<a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> s)</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span> {</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  std::map<std::string, extf_t>::iterator pos = <a class="code" href="classSVF_1_1ExtAPI.html#a495b6db60a6266b83cf511965a57f6a3">op_pair</a>.find(s);</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  <span class="keywordflow">if</span> (pos != <a class="code" href="classSVF_1_1ExtAPI.html#a495b6db60a6266b83cf511965a57f6a3">op_pair</a>.end())</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  {</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  <span class="keywordflow">return</span> pos->second;</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  }</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  {</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094a894fdba1a423fe49fa357f87ea69cf69">EXT_OTHER</a>;</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  }</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span> }</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span> </div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span> <span class="comment">// Get external function name, e.g "memcpy"</span></div><div class="line"><a name="l00199"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#ac3e34227968d6a2835d63b1052da3c1a"> 199</a></span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1ExtAPI.html#ac3e34227968d6a2835d63b1052da3c1a">ExtAPI::get_name</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span> {</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  assert(F);</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> funName = F-><a class="code" href="classSVF_1_1SVFValue.html#a2409c01221b9a6632655cee43d1b35e4">getName</a>();</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  <span class="keywordflow">if</span> (F-><a class="code" href="classSVF_1_1SVFFunction.html#a7b4c6c7143d012802ea5ee962bec2deb">isIntrinsic</a>())</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  {</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <span class="keywordtype">unsigned</span> start = funName.find(<span class="charliteral">'.'</span>);</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  <span class="keywordtype">unsigned</span> end = funName.substr(start + 1).find(<span class="charliteral">'.'</span>);</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  funName = <span class="stringliteral">"llvm."</span> + funName.substr(start + 1, end);</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  }</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  <span class="keywordflow">return</span> funName;</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span> }</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span> </div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span> <span class="comment">// Get specifications of external functions in ExtAPI.json file</span></div><div class="line"><a name="l00213"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#ab61fbc80acc89e26df2b451cbab81246"> 213</a></span> <a class="code" href="structcJSON.html">cJSON</a> *<a class="code" href="classSVF_1_1ExtAPI.html#ab61fbc80acc89e26df2b451cbab81246">ExtAPI::get_FunJson</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &funName)</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span> {</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  assert(<a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">root</a> && <span class="stringliteral">"JSON not loaded"</span>);</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  <span class="keywordflow">return</span> cJSON_GetObjectItemCaseSensitive(<a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">root</a>, funName.c_str());</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span> }</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span> </div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span> <span class="comment">// Get arguments of the operation, e.g. ["A1R", "A0", "A2"]</span></div><div class="line"><a name="l00220"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a906a3728bbcfb7a43ac0938ffcb3df23"> 220</a></span> std::vector<std::string> <a class="code" href="classSVF_1_1ExtAPI.html#a906a3728bbcfb7a43ac0938ffcb3df23">ExtAPI::get_opArgs</a>(<span class="keyword">const</span> <a class="code" href="structcJSON.html">cJSON</a> *value)</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span> {</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  std::vector<std::string> args;</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <span class="keywordflow">while</span> (value)</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  {</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  <span class="keywordflow">if</span> (value-><a class="code" href="structcJSON.html#ab13084c574681593b12f6e0a3db0dcfc">type</a> == <a class="code" href="cJSON_8h.html#aa2cb4765308e2bbdf01988b2acdf92d9">cJSON_String</a>)</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  args.push_back(value-><a class="code" href="structcJSON.html#ad43f8de2571e504c4c5ce0a36990e6e1">valuestring</a>);</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  value = value-><a class="code" href="structcJSON.html#ade862b880379b5e2a591f7326401fa8d">next</a>;</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  }</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keywordflow">return</span> args;</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span> }</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span> </div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span> <span class="comment">// Get property of the operation, e.g. "EFT_A1R_A0R"</span></div><div class="line"><a name="l00233"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41"> 233</a></span> <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">ExtAPI::get_type</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVF::SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span> {</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> funName = <a class="code" href="classSVF_1_1ExtAPI.html#ac3e34227968d6a2835d63b1052da3c1a">get_name</a>(F);</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  <a class="code" href="structcJSON.html">cJSON</a> *<a class="code" href="cJSON_8h.html#ac76cea59d438ba893d2f82aabb367d14">item</a> = <a class="code" href="classSVF_1_1ExtAPI.html#ab61fbc80acc89e26df2b451cbab81246">get_FunJson</a>(funName);</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> = <span class="stringliteral">""</span>;</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  <span class="keywordflow">if</span> (item != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  {</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <span class="comment">// Get the first operation of the function</span></div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <a class="code" href="structcJSON.html">cJSON</a> *obj = item-><a class="code" href="structcJSON.html#a401b274c2da358dac5c23ab8b2c71f85">child</a>;</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="keywordflow">if</span> (strcmp(obj-><a class="code" href="structcJSON.html#aa6b47e9a4b0e0a26f519b1a2b6739983">string</a>, <a class="code" href="ExtAPI_8h.html#a8af07ec3fec2ac9636dfb81bb7a8961e">JSON_OPT_FUNCTIONTYPE</a>) == 0)</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  type = obj-><a class="code" href="structcJSON.html#ad43f8de2571e504c4c5ce0a36990e6e1">valuestring</a>;</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"The function operation format is illegal!"</span>);</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  }</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  std::map<std::string, extType>::const_iterator it = <a class="code" href="classSVF_1_1ExtAPI.html#a95ac45d2367b3d3124d5d98958e74cc5">type_pair</a>.find(type);</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  <span class="keywordflow">if</span> (it == <a class="code" href="classSVF_1_1ExtAPI.html#a95ac45d2367b3d3124d5d98958e74cc5">type_pair</a>.end())</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa7ad779bd3527f7cd220ca74c736fd2df">EFT_NULL</a>;</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  <span class="keywordflow">return</span> it->second;</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span> }</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span> </div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span> <span class="comment">// Get priority of he function, return value</span></div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span> <span class="comment">// 0: Apply user-defined functions</span></div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span> <span class="comment">// 1: Apply function specification in ExtAPI.json</span></div><div class="line"><a name="l00257"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a5ef7edb1664ab87f00418e7808d00258"> 257</a></span> <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1ExtAPI.html#a5ef7edb1664ab87f00418e7808d00258">ExtAPI::isOverwrittenAppFunction</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVF::SVFFunction</a> *callee)</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span> {</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> funName = <a class="code" href="classSVF_1_1ExtAPI.html#ac3e34227968d6a2835d63b1052da3c1a">get_name</a>(callee);</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <a class="code" href="structcJSON.html">cJSON</a> *<a class="code" href="cJSON_8h.html#ac76cea59d438ba893d2f82aabb367d14">item</a> = <a class="code" href="classSVF_1_1ExtAPI.html#ab61fbc80acc89e26df2b451cbab81246">get_FunJson</a>(funName);</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <span class="keywordflow">if</span> (item != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  {</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <a class="code" href="structcJSON.html">cJSON</a> *obj = item-><a class="code" href="structcJSON.html#a401b274c2da358dac5c23ab8b2c71f85">child</a>;</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  obj = obj-><a class="code" href="structcJSON.html#ade862b880379b5e2a591f7326401fa8d">next</a>;</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keywordflow">if</span> (strcmp(obj-><a class="code" href="structcJSON.html#aa6b47e9a4b0e0a26f519b1a2b6739983">string</a>, <a class="code" href="ExtAPI_8h.html#a6dec9d5ce6e777757e97065129d96874">JSON_OPT_OVERWRITE</a>) == 0)</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <span class="keywordflow">return</span> obj-><a class="code" href="structcJSON.html#a369cea49494eb5d4409d532a731a0fbf">valueint</a>;</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"The function operation format is illegal!"</span>);</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  }</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span> }</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span> </div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span> <span class="comment">// Does (F) have a static var X (unavailable to us) that its return points to?</span></div><div class="line"><a name="l00274"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#ae20ea24cce02de87d89a2d0b773a2357"> 274</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExtAPI.html#ae20ea24cce02de87d89a2d0b773a2357">ExtAPI::has_static</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span> {</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> t = <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">get_type</a>(F);</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <span class="keywordflow">return</span> t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa94f514e925fdb422632840ca44343af0">EFT_STAT</a> || t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa515c2184a7461fc1788a514432a7ec22">EFT_STAT2</a>;</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span> }</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span> </div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span> <span class="comment">// Assuming hasStatic(F), does (F) have a second static Y where X -> Y?</span></div><div class="line"><a name="l00281"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#ad3eefa086aa514e4d245a975ea3d45b5"> 281</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExtAPI.html#ad3eefa086aa514e4d245a975ea3d45b5">ExtAPI::has_static2</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span> {</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> t = <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">get_type</a>(F);</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  <span class="keywordflow">return</span> t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa515c2184a7461fc1788a514432a7ec22">EFT_STAT2</a>;</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span> }</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span> </div><div class="line"><a name="l00287"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a0d865c55681a3b4a9bb965fd0200029d"> 287</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExtAPI.html#a0d865c55681a3b4a9bb965fd0200029d">ExtAPI::is_alloc</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span> {</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> t = <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">get_type</a>(F);</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <span class="keywordflow">return</span> t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caac57ade96d1d18b9f2d4d36bc6928c5c4">EFT_ALLOC</a> || t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa8782293305260b1500a09b473439d3b0">EFT_NOSTRUCT_ALLOC</a>;</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span> }</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span> </div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span> <span class="comment">// Does (F) allocate a new object and assign it to one of its arguments?</span></div><div class="line"><a name="l00294"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a158e7da51d45b746e067dc40e912c477"> 294</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExtAPI.html#a158e7da51d45b746e067dc40e912c477">ExtAPI::is_arg_alloc</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span> {</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> t = <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">get_type</a>(F);</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  <span class="keywordflow">return</span> t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa035cf8a39c192608ec0e91d48e479899">EFT_A0R_NEW</a> || t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa4353ad2b443e7f7ce2151869eed9c097">EFT_A1R_NEW</a> || t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa27b8dfa0742daa17c3e1a520d03dbd14">EFT_A2R_NEW</a> || t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caafe69efc20e29f95e0e333d1a462576a2">EFT_A4R_NEW</a> || t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa8b59b6966952577361826d09b95b76be">EFT_A11R_NEW</a>;</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span> }</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span> </div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span> <span class="comment">// Get the position of argument which holds the new object</span></div><div class="line"><a name="l00301"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a68939c789d0530151a4e79e79317531a"> 301</a></span> <a class="code" href="namespaceSVF.html#a9b707002523ece2ac54ca893ee9a2d4e">s32_t</a> <a class="code" href="classSVF_1_1ExtAPI.html#a68939c789d0530151a4e79e79317531a">ExtAPI::get_alloc_arg_pos</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span> {</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> t = <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">get_type</a>(F);</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  <span class="keywordflow">switch</span> (t)</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  {</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa035cf8a39c192608ec0e91d48e479899">EFT_A0R_NEW</a>:</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa4353ad2b443e7f7ce2151869eed9c097">EFT_A1R_NEW</a>:</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa27b8dfa0742daa17c3e1a520d03dbd14">EFT_A2R_NEW</a>:</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  <span class="keywordflow">return</span> 2;</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caafe69efc20e29f95e0e333d1a462576a2">EFT_A4R_NEW</a>:</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <span class="keywordflow">return</span> 4;</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa8b59b6966952577361826d09b95b76be">EFT_A11R_NEW</a>:</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  <span class="keywordflow">return</span> 11;</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <span class="keywordflow">default</span>:</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"Not an alloc call via argument."</span>);</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  }</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span> }</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span> </div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span> <span class="comment">// Does (F) allocate only non-struct objects?</span></div><div class="line"><a name="l00323"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a934e293bd4050cb1ab5c19e8ad391ebe"> 323</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExtAPI.html#a934e293bd4050cb1ab5c19e8ad391ebe">ExtAPI::no_struct_alloc</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span> {</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> t = <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">get_type</a>(F);</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  <span class="keywordflow">return</span> t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa8782293305260b1500a09b473439d3b0">EFT_NOSTRUCT_ALLOC</a>;</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span> }</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span> </div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span> <span class="comment">// Does (F) not free/release any memory?</span></div><div class="line"><a name="l00330"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#aeef27a358ba1815760c893bd2d2335b1"> 330</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExtAPI.html#aeef27a358ba1815760c893bd2d2335b1">ExtAPI::is_dealloc</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span> {</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> t = <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">get_type</a>(F);</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  <span class="keywordflow">return</span> t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa9b98279d1926e4ebfb237a43536c7b73">EFT_FREE</a>;</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span> }</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span> </div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span> <span class="comment">// Does (F) not do anything with the known pointers?</span></div><div class="line"><a name="l00337"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a82ebf71c5214f891f17e842e0b133b4f"> 337</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExtAPI.html#a82ebf71c5214f891f17e842e0b133b4f">ExtAPI::is_noop</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span> {</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> t = <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">get_type</a>(F);</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <span class="keywordflow">return</span> t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa87c4ba17ac3567a0673d6516995e06ef">EFT_NOOP</a> || t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa9b98279d1926e4ebfb237a43536c7b73">EFT_FREE</a>;</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span> }</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span> </div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span> <span class="comment">// Does (F) reallocate a new object?</span></div><div class="line"><a name="l00344"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#ac6d6bdc51a6b75d6d5741cb751559fe4"> 344</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExtAPI.html#ac6d6bdc51a6b75d6d5741cb751559fe4">ExtAPI::is_realloc</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span> {</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> t = <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">get_type</a>(F);</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="keywordflow">return</span> t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa1f23e7b8cdd103943f515e807bf36b1c">EFT_REALLOC</a>;</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span> }</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span> </div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span> <span class="comment">// Should (F) be considered "external" (either not defined in the program</span></div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span> <span class="comment">// or a user-defined version of a known alloc or no-op)?</span></div><div class="line"><a name="l00352"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a21f45c806672255c044d39490990eae2"> 352</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExtAPI.html#a21f45c806672255c044d39490990eae2">ExtAPI::is_ext</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span> {</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  assert(F);</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  <span class="keywordtype">bool</span> res;</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  <span class="keywordflow">if</span> (F-><a class="code" href="classSVF_1_1SVFFunction.html#ab672f0255ec8e42d5e414bc8c72b7c76">isDeclaration</a>() || F-><a class="code" href="classSVF_1_1SVFFunction.html#a7b4c6c7143d012802ea5ee962bec2deb">isIntrinsic</a>())</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  {</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  res = 1;</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  }</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  {</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> t = <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">get_type</a>(F);</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  <span class="keywordflow">if</span> (t != <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa7ad779bd3527f7cd220ca74c736fd2df">EFT_NULL</a>)</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  {</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> overwrittenAppFunction = <a class="code" href="classSVF_1_1ExtAPI.html#a5ef7edb1664ab87f00418e7808d00258">isOverwrittenAppFunction</a>(F);</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  <span class="comment">// overwrittenAppFunction = 1: Execute function specification in ExtAPI.json</span></div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  <span class="comment">// F is considered as external function</span></div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  <span class="keywordflow">if</span> (overwrittenAppFunction == 1)</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  res = 1;</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  <span class="comment">// overwrittenAppFunction = 0: Execute user-defined functions</span></div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  <span class="comment">// F is not considered as external function</span></div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  res = 0;</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  }</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  res = 0;</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  }</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  <span class="keywordflow">return</span> res;</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span> }</div><div class="ttc" id="classSVF_1_1ExtAPI_html_a82ebf71c5214f891f17e842e0b133b4f"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a82ebf71c5214f891f17e842e0b133b4f">SVF::ExtAPI::is_noop</a></div><div class="ttdeci">bool is_noop(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00337">ExtAPI.cpp:337</a></div></div>
|
|
69
|
+
<a href="ExtAPI_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">//===- ExtAPI.cpp -- External functions -----------------------------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">// SVF: Static Value-Flow Analysis</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">// Copyright (C) <2013-2017> <Yulei Sui></span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">//</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> </div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">// This program is free software: you can redistribute it and/or modify</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">// it under the terms of the GNU General Public License as published by</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">// the Free Software Foundation, either version 3 of the License, or</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">// (at your option) any later version.</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> </div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">// This program is distributed in the hope that it will be useful,</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="comment">// GNU General Public License for more details.</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="comment">// You should have received a copy of the GNU General Public License</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="comment">// along with this program. If not, see <http://www.gnu.org/licenses/>.</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="comment">//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> </div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="comment">/*</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment"> * ExtAPI.cpp</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="comment"> *</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment"> * Created on: July 1, 2022</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="comment"> * Author: Shuangxiang Kan</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment"> */</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> </div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="preprocessor">#include "<a class="code" href="ExtAPI_8h.html">Util/ExtAPI.h</a>"</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="preprocessor">#include "<a class="code" href="SVFUtil_8h.html">Util/SVFUtil.h</a>"</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="preprocessor">#include "<a class="code" href="cJSON_8h.html">Util/cJSON.h</a>"</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="preprocessor">#include <string.h></span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="preprocessor">#include <sys/stat.h></span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="preprocessor">#include <stdlib.h></span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> </div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> <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> </div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <a class="code" href="classSVF_1_1ExtAPI.html">ExtAPI</a> *<a class="code" href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">ExtAPI::extOp</a> = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> <a class="code" href="structcJSON.html">cJSON</a> *<a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">ExtAPI::root</a> = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> </div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="comment">// Get environment variables $SVF_DIR and "npm root" through popen() method</span></div><div class="line"><a name="l00043"></a><span class="lineno"><a class="line" href="ExtAPI_8cpp.html#a424940f91f234b23bcc633f12269f935"> 43</a></span> <span class="keyword">static</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="ExtAPI_8cpp.html#a424940f91f234b23bcc633f12269f935">GetStdoutFromCommand</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &command)</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> {</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  <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>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> result = <span class="stringliteral">""</span>;</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <span class="comment">// Open pipe to file</span></div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  FILE *pipe = popen(command.c_str(), <span class="stringliteral">"r"</span>);</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <span class="keywordflow">if</span> (!pipe)</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  {</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  <span class="keywordflow">return</span> <span class="stringliteral">"popen failed!"</span>;</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  }</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  <span class="comment">// read till end of process:</span></div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  <span class="keywordflow">while</span> (!feof(pipe))</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  {</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  <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>  <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>  result += buffer;</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  }</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  pclose(pipe);</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  <span class="comment">// remove "\n"</span></div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  result.erase(<span class="keyword">remove</span>(result.begin(), result.end(), <span class="charliteral">'\n'</span>), result.end());</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span> }</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> </div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span> <span class="comment">// Get ExtAPI.json file</span></div><div class="line"><a name="l00067"></a><span class="lineno"><a class="line" href="ExtAPI_8cpp.html#a82e0f4095086de7f384a1f55838b5d28"> 67</a></span> <span class="keyword">static</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="ExtAPI_8cpp.html#a82e0f4095086de7f384a1f55838b5d28">getJsonFile</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &path)</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span> {</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  <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>  <span class="keywordflow">if</span> (path.compare(<span class="stringliteral">"npm root"</span>) == 0)</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  {</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  <span class="keywordtype">int</span> os_flag = 1;</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  <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>  <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>  <span class="comment">// Linux os</span></div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span> <span class="preprocessor">#ifdef linux</span></div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  os_flag = 0;</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  jsonFilePath.append(<span class="stringliteral">"/svf-lib/SVF-linux"</span>);</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  <span class="comment">// Mac os</span></div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  <span class="keywordflow">if</span> (os_flag == 1)</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  {</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  jsonFilePath.append(<span class="stringliteral">"/svf-lib/SVF-osx"</span>);</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  }</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  }</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  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>  <span class="keywordflow">return</span> jsonFilePath;</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span> }</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span> </div><div class="line"><a name="l00090"></a><span class="lineno"><a class="line" href="ExtAPI_8cpp.html#a3957468a4d85cef02d8be1f82bcdfc69"> 90</a></span> <span class="keyword">static</span> <a class="code" href="structcJSON.html">cJSON</a> *<a class="code" href="ExtAPI_8cpp.html#a3957468a4d85cef02d8be1f82bcdfc69">parseJson</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &path, off_t fileSize)</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span> {</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  FILE *file = fopen(path.c_str(), <span class="stringliteral">"r"</span>);</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  <span class="keywordflow">if</span> (!file)</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  {</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  }</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span> </div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  <span class="comment">// allocate memory size matched with file size</span></div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <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> </div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  <span class="comment">// read json string from file</span></div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  <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>  <span class="keywordflow">if</span> (size == 0)</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  {</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">SVFUtil::errs</a>() << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a5d4bb92f5df30417f414397f8e58cf01">SVFUtil::errMsg</a>(<span class="stringliteral">"\t Wrong ExtAPI.json path!! "</span>) << <span class="stringliteral">"The current ExtAPI.json path is: "</span> << path << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"Read ExtAPI.json file fails!"</span>);</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  }</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  fclose(file);</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span> </div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  <span class="comment">// convert json string to json pointer variable</span></div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  <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>  <span class="keywordflow">if</span> (!root)</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  {</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  free(jsonStr);</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  }</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  free(jsonStr);</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  <span class="keywordflow">return</span> root;</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span> }</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span> </div><div class="line"><a name="l00122"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a02380d22fd6021ebce1e54723d695c99"> 122</a></span> <a class="code" href="classSVF_1_1ExtAPI.html">ExtAPI</a> *<a class="code" href="classSVF_1_1ExtAPI.html#a02380d22fd6021ebce1e54723d695c99">ExtAPI::getExtAPI</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &path)</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span> {</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">extOp</a> == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  {</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">extOp</a> = <span class="keyword">new</span> <a class="code" href="classSVF_1_1ExtAPI.html#ab793be4b6f8f0a025599e76f5df2a4eb">ExtAPI</a>;</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  }</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">root</a> == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  {</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  <span class="keyword">struct </span>stat statbuf;</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span> </div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <span class="comment">// Four ways to get ExtAPI.json path</span></div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  <span class="comment">// 1. Explicit path provided</span></div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="comment">// 2. default path (get ExtAPI.json path from Util/config.h)</span></div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <span class="comment">// 3. from $SVF_DIR</span></div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  <span class="comment">// 4. from "npm root"(If SVF is installed via npm)</span></div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span> </div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> jsonFilePath = path;</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  <span class="keywordflow">if</span> (!jsonFilePath.empty() && !stat(jsonFilePath.c_str(), &statbuf))</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  {</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">root</a> = <a class="code" href="ExtAPI_8cpp.html#a3957468a4d85cef02d8be1f82bcdfc69">parseJson</a>(jsonFilePath, statbuf.st_size);</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">extOp</a>;</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  }</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span> </div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  jsonFilePath = <a class="code" href="config_8h.html#a799965f801bbe1f540c3100566f78d81">PROJECT_PATH</a> + <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a>(<a class="code" href="ExtAPI_8h.html#ad9bef4304f41728bb3edf259c6b67668">EXTAPI_JSON_PATH</a>);</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  <span class="keywordflow">if</span> (!stat(jsonFilePath.c_str(), &statbuf))</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  {</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">root</a> = <a class="code" href="ExtAPI_8cpp.html#a3957468a4d85cef02d8be1f82bcdfc69">parseJson</a>(jsonFilePath, statbuf.st_size);</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">extOp</a>;</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  }</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span> </div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  jsonFilePath = <a class="code" href="ExtAPI_8cpp.html#a82e0f4095086de7f384a1f55838b5d28">getJsonFile</a>(<span class="stringliteral">"$SVF_DIR"</span>);</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <span class="keywordflow">if</span> (!stat(jsonFilePath.c_str(), &statbuf))</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  {</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">root</a> = <a class="code" href="ExtAPI_8cpp.html#a3957468a4d85cef02d8be1f82bcdfc69">parseJson</a>(jsonFilePath, statbuf.st_size);</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">extOp</a>;</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  }</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span> </div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  jsonFilePath = <a class="code" href="ExtAPI_8cpp.html#a82e0f4095086de7f384a1f55838b5d28">getJsonFile</a>(<span class="stringliteral">"npm root"</span>);</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  <span class="keywordflow">if</span> (!stat(jsonFilePath.c_str(), &statbuf))</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  {</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">root</a> = <a class="code" href="ExtAPI_8cpp.html#a3957468a4d85cef02d8be1f82bcdfc69">parseJson</a>(jsonFilePath, statbuf.st_size);</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">extOp</a>;</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  }</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span> </div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"Open ExtAPI.json file fails!"</span>);</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  }</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">extOp</a>;</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span> }</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span> </div><div class="line"><a name="l00171"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#abe3e0e2500532acfc01cee7e2ce1cd90"> 171</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1ExtAPI.html#abe3e0e2500532acfc01cee7e2ce1cd90">ExtAPI::destory</a>()</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span> {</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">extOp</a> != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  {</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <span class="keyword">delete</span> <a class="code" href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">extOp</a>;</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">extOp</a> = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  }</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">root</a> != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  {</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <a class="code" href="cJSON_8cpp.html#afde5c619f31577b3d821b56b23953c85">cJSON_Delete</a>(<a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">root</a>);</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">root</a> = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  }</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span> }</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span> </div><div class="line"><a name="l00185"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a945fb815af09e4f7b22c637effd64d8b"> 185</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1ExtAPI.html#a945fb815af09e4f7b22c637effd64d8b">ExtAPI::add_entry</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* funName, <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">extType</a> <a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>, <span class="keywordtype">bool</span> overwrite_app_function)</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span> {</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  assert(<a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">root</a>);</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  assert(<a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">get_type</a>(funName) == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa7ad779bd3527f7cd220ca74c736fd2df">EFT_NULL</a>);</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  <span class="keyword">auto</span> entry = cJSON_CreateObject();</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span> </div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  <span class="comment">// add the type field</span></div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  <span class="keyword">auto</span> typeString = cJSON_CreateString(<a class="code" href="classSVF_1_1ExtAPI.html#aa98b80dc86d0549183ec69b44b391bd7">extType_toString</a>(type).c_str());</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  cJSON_AddItemToObject(entry, <a class="code" href="ExtAPI_8h.html#a8af07ec3fec2ac9636dfb81bb7a8961e">JSON_OPT_FUNCTIONTYPE</a>, typeString);</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span> </div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  <span class="comment">// add the 'overwrite_app_function' field</span></div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  <span class="keyword">auto</span> overwriteBool = cJSON_CreateNumber(overwrite_app_function ? 1 : 0);</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  cJSON_AddItemToObject(entry, <a class="code" href="ExtAPI_8h.html#a6dec9d5ce6e777757e97065129d96874">JSON_OPT_OVERWRITE</a>, overwriteBool);</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span> </div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <span class="comment">// we don't know where the `funName` comes from, so copy it just in case</span></div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  cJSON_AddItemToObject(<a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">root</a>, strdup(funName), entry);</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span> }</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span> </div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span> <span class="comment">// Get the corresponding name in ext_t, e.g. "EXT_ADDR" in {"addr", EXT_ADDR},</span></div><div class="line"><a name="l00204"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a1832c19de2fd7ff01793e75a051d3f24"> 204</a></span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094">ExtAPI::extf_t</a> <a class="code" href="classSVF_1_1ExtAPI.html#a1832c19de2fd7ff01793e75a051d3f24">ExtAPI::get_opName</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a>& s)</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span> {</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  std::map<std::string, extf_t>::iterator pos = <a class="code" href="classSVF_1_1ExtAPI.html#a495b6db60a6266b83cf511965a57f6a3">op_pair</a>.find(s);</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="keywordflow">if</span> (pos != <a class="code" href="classSVF_1_1ExtAPI.html#a495b6db60a6266b83cf511965a57f6a3">op_pair</a>.end())</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  {</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  <span class="keywordflow">return</span> pos->second;</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  }</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  {</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094a894fdba1a423fe49fa357f87ea69cf69">EXT_OTHER</a>;</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  }</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span> }</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span> </div><div class="line"><a name="l00217"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#aa98b80dc86d0549183ec69b44b391bd7"> 217</a></span> <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a>& <a class="code" href="classSVF_1_1ExtAPI.html#aa98b80dc86d0549183ec69b44b391bd7">ExtAPI::extType_toString</a>(<a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">extType</a> <a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>)</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span> {</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  <span class="keyword">auto</span> it = llvm::find_if(<a class="code" href="classSVF_1_1ExtAPI.html#a95ac45d2367b3d3124d5d98958e74cc5">type_pair</a>, [&](<span class="keyword">const</span> <span class="keyword">auto</span>& pair)</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  {</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  <span class="keywordflow">return</span> pair.second == <a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>;</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  });</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  assert(it != <a class="code" href="classSVF_1_1ExtAPI.html#a95ac45d2367b3d3124d5d98958e74cc5">type_pair</a>.end());</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <span class="keywordflow">return</span> it->first;</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span> }</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span> </div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span> <span class="comment">// Get external function name, e.g "memcpy"</span></div><div class="line"><a name="l00228"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#ac3e34227968d6a2835d63b1052da3c1a"> 228</a></span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1ExtAPI.html#ac3e34227968d6a2835d63b1052da3c1a">ExtAPI::get_name</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span> {</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  assert(F);</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> funName = F-><a class="code" href="classSVF_1_1SVFValue.html#a2409c01221b9a6632655cee43d1b35e4">getName</a>();</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  <span class="keywordflow">if</span> (F-><a class="code" href="classSVF_1_1SVFFunction.html#a7b4c6c7143d012802ea5ee962bec2deb">isIntrinsic</a>())</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  {</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <span class="keywordtype">unsigned</span> start = funName.find(<span class="charliteral">'.'</span>);</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <span class="keywordtype">unsigned</span> end = funName.substr(start + 1).find(<span class="charliteral">'.'</span>);</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  funName = <span class="stringliteral">"llvm."</span> + funName.substr(start + 1, end);</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  }</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  <span class="keywordflow">return</span> funName;</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span> }</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span> </div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span> <span class="comment">// Get specifications of external functions in ExtAPI.json file</span></div><div class="line"><a name="l00242"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#ab61fbc80acc89e26df2b451cbab81246"> 242</a></span> <a class="code" href="structcJSON.html">cJSON</a> *<a class="code" href="classSVF_1_1ExtAPI.html#ab61fbc80acc89e26df2b451cbab81246">ExtAPI::get_FunJson</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> &funName)</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span> {</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  assert(<a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">root</a> && <span class="stringliteral">"JSON not loaded"</span>);</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <span class="keywordflow">return</span> cJSON_GetObjectItemCaseSensitive(<a class="code" href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">root</a>, funName.c_str());</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span> }</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span> </div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span> <span class="comment">// Get arguments of the operation, e.g. ["A1R", "A0", "A2"]</span></div><div class="line"><a name="l00249"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a906a3728bbcfb7a43ac0938ffcb3df23"> 249</a></span> std::vector<std::string> <a class="code" href="classSVF_1_1ExtAPI.html#a906a3728bbcfb7a43ac0938ffcb3df23">ExtAPI::get_opArgs</a>(<span class="keyword">const</span> <a class="code" href="structcJSON.html">cJSON</a> *value)</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span> {</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  std::vector<std::string> args;</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  <span class="keywordflow">while</span> (value)</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  {</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  <span class="keywordflow">if</span> (value-><a class="code" href="structcJSON.html#ab13084c574681593b12f6e0a3db0dcfc">type</a> == <a class="code" href="cJSON_8h.html#aa2cb4765308e2bbdf01988b2acdf92d9">cJSON_String</a>)</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  args.push_back(value-><a class="code" href="structcJSON.html#ad43f8de2571e504c4c5ce0a36990e6e1">valuestring</a>);</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  value = value-><a class="code" href="structcJSON.html#ade862b880379b5e2a591f7326401fa8d">next</a>;</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  }</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  <span class="keywordflow">return</span> args;</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span> }</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span> </div><div class="line"><a name="l00261"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#accdb0b7f3ae8d4028bd09f3d861aa2be"> 261</a></span> <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">ExtAPI::get_type</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a>& funName)</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span> {</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <a class="code" href="structcJSON.html">cJSON</a> *<a class="code" href="cJSON_8h.html#ac76cea59d438ba893d2f82aabb367d14">item</a> = <a class="code" href="classSVF_1_1ExtAPI.html#ab61fbc80acc89e26df2b451cbab81246">get_FunJson</a>(funName);</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> = <span class="stringliteral">""</span>;</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keywordflow">if</span> (item != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  {</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  <span class="comment">// Get the first operation of the function</span></div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  <a class="code" href="structcJSON.html">cJSON</a> *obj = item-><a class="code" href="structcJSON.html#a401b274c2da358dac5c23ab8b2c71f85">child</a>;</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  <span class="keywordflow">if</span> (strcmp(obj-><a class="code" href="structcJSON.html#aa6b47e9a4b0e0a26f519b1a2b6739983">string</a>, <a class="code" href="ExtAPI_8h.html#a8af07ec3fec2ac9636dfb81bb7a8961e">JSON_OPT_FUNCTIONTYPE</a>) == 0)</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  type = obj-><a class="code" href="structcJSON.html#ad43f8de2571e504c4c5ce0a36990e6e1">valuestring</a>;</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"The function operation format is illegal!"</span>);</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  }</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  std::map<std::string, extType>::const_iterator it = <a class="code" href="classSVF_1_1ExtAPI.html#a95ac45d2367b3d3124d5d98958e74cc5">type_pair</a>.find(type);</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="keywordflow">if</span> (it == <a class="code" href="classSVF_1_1ExtAPI.html#a95ac45d2367b3d3124d5d98958e74cc5">type_pair</a>.end())</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa7ad779bd3527f7cd220ca74c736fd2df">EFT_NULL</a>;</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <span class="keywordflow">return</span> it->second;</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span> }</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span> </div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span> <span class="comment">// Get property of the operation, e.g. "EFT_A1R_A0R"</span></div><div class="line"><a name="l00282"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41"> 282</a></span> <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">ExtAPI::get_type</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVF::SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span> {</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">get_type</a>(<a class="code" href="classSVF_1_1ExtAPI.html#ac3e34227968d6a2835d63b1052da3c1a">get_name</a>(F));</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span> }</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span> </div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span> <span class="comment">// Get priority of he function, return value</span></div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span> <span class="comment">// 0: Apply user-defined functions</span></div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span> <span class="comment">// 1: Apply function specification in ExtAPI.json</span></div><div class="line"><a name="l00290"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a5ef7edb1664ab87f00418e7808d00258"> 290</a></span> <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1ExtAPI.html#a5ef7edb1664ab87f00418e7808d00258">ExtAPI::isOverwrittenAppFunction</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVF::SVFFunction</a> *callee)</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span> {</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> funName = <a class="code" href="classSVF_1_1ExtAPI.html#ac3e34227968d6a2835d63b1052da3c1a">get_name</a>(callee);</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  <a class="code" href="structcJSON.html">cJSON</a> *<a class="code" href="cJSON_8h.html#ac76cea59d438ba893d2f82aabb367d14">item</a> = <a class="code" href="classSVF_1_1ExtAPI.html#ab61fbc80acc89e26df2b451cbab81246">get_FunJson</a>(funName);</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  <span class="keywordflow">if</span> (item != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  {</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  <a class="code" href="structcJSON.html">cJSON</a> *obj = item-><a class="code" href="structcJSON.html#a401b274c2da358dac5c23ab8b2c71f85">child</a>;</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  obj = obj-><a class="code" href="structcJSON.html#ade862b880379b5e2a591f7326401fa8d">next</a>;</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  <span class="keywordflow">if</span> (strcmp(obj-><a class="code" href="structcJSON.html#aa6b47e9a4b0e0a26f519b1a2b6739983">string</a>, <a class="code" href="ExtAPI_8h.html#a6dec9d5ce6e777757e97065129d96874">JSON_OPT_OVERWRITE</a>) == 0)</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  <span class="keywordflow">return</span> obj-><a class="code" href="structcJSON.html#a369cea49494eb5d4409d532a731a0fbf">valueint</a>;</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"The function operation format is illegal!"</span>);</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  }</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span> }</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span> </div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span> <span class="comment">// Does (F) have a static var X (unavailable to us) that its return points to?</span></div><div class="line"><a name="l00307"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#ae20ea24cce02de87d89a2d0b773a2357"> 307</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExtAPI.html#ae20ea24cce02de87d89a2d0b773a2357">ExtAPI::has_static</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span> {</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> t = <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">get_type</a>(F);</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  <span class="keywordflow">return</span> t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa94f514e925fdb422632840ca44343af0">EFT_STAT</a> || t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa515c2184a7461fc1788a514432a7ec22">EFT_STAT2</a>;</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span> }</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span> </div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span> <span class="comment">// Assuming hasStatic(F), does (F) have a second static Y where X -> Y?</span></div><div class="line"><a name="l00314"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#ad3eefa086aa514e4d245a975ea3d45b5"> 314</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExtAPI.html#ad3eefa086aa514e4d245a975ea3d45b5">ExtAPI::has_static2</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span> {</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> t = <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">get_type</a>(F);</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  <span class="keywordflow">return</span> t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa515c2184a7461fc1788a514432a7ec22">EFT_STAT2</a>;</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span> }</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span> </div><div class="line"><a name="l00320"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a0d865c55681a3b4a9bb965fd0200029d"> 320</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExtAPI.html#a0d865c55681a3b4a9bb965fd0200029d">ExtAPI::is_alloc</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span> {</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> t = <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">get_type</a>(F);</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <span class="keywordflow">return</span> t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caac57ade96d1d18b9f2d4d36bc6928c5c4">EFT_ALLOC</a> || t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa8782293305260b1500a09b473439d3b0">EFT_NOSTRUCT_ALLOC</a>;</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span> }</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span> </div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span> <span class="comment">// Does (F) allocate a new object and assign it to one of its arguments?</span></div><div class="line"><a name="l00327"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a158e7da51d45b746e067dc40e912c477"> 327</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExtAPI.html#a158e7da51d45b746e067dc40e912c477">ExtAPI::is_arg_alloc</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span> {</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> t = <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">get_type</a>(F);</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  <span class="keywordflow">return</span> t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa035cf8a39c192608ec0e91d48e479899">EFT_A0R_NEW</a> || t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa4353ad2b443e7f7ce2151869eed9c097">EFT_A1R_NEW</a> || t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa27b8dfa0742daa17c3e1a520d03dbd14">EFT_A2R_NEW</a> || t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caafe69efc20e29f95e0e333d1a462576a2">EFT_A4R_NEW</a> || t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa8b59b6966952577361826d09b95b76be">EFT_A11R_NEW</a>;</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span> }</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span> </div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span> <span class="comment">// Get the position of argument which holds the new object</span></div><div class="line"><a name="l00334"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a68939c789d0530151a4e79e79317531a"> 334</a></span> <a class="code" href="namespaceSVF.html#a9b707002523ece2ac54ca893ee9a2d4e">s32_t</a> <a class="code" href="classSVF_1_1ExtAPI.html#a68939c789d0530151a4e79e79317531a">ExtAPI::get_alloc_arg_pos</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span> {</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> t = <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">get_type</a>(F);</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  <span class="keywordflow">switch</span> (t)</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  {</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa035cf8a39c192608ec0e91d48e479899">EFT_A0R_NEW</a>:</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa4353ad2b443e7f7ce2151869eed9c097">EFT_A1R_NEW</a>:</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  <span class="keywordflow">return</span> 1;</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa27b8dfa0742daa17c3e1a520d03dbd14">EFT_A2R_NEW</a>:</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  <span class="keywordflow">return</span> 2;</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caafe69efc20e29f95e0e333d1a462576a2">EFT_A4R_NEW</a>:</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  <span class="keywordflow">return</span> 4;</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa8b59b6966952577361826d09b95b76be">EFT_A11R_NEW</a>:</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  <span class="keywordflow">return</span> 11;</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  <span class="keywordflow">default</span>:</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"Not an alloc call via argument."</span>);</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  }</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span> }</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span> </div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span> <span class="comment">// Does (F) allocate only non-struct objects?</span></div><div class="line"><a name="l00356"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a934e293bd4050cb1ab5c19e8ad391ebe"> 356</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExtAPI.html#a934e293bd4050cb1ab5c19e8ad391ebe">ExtAPI::no_struct_alloc</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span> {</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> t = <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">get_type</a>(F);</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  <span class="keywordflow">return</span> t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa8782293305260b1500a09b473439d3b0">EFT_NOSTRUCT_ALLOC</a>;</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span> }</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span> </div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span> <span class="comment">// Does (F) not free/release any memory?</span></div><div class="line"><a name="l00363"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#aeef27a358ba1815760c893bd2d2335b1"> 363</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExtAPI.html#aeef27a358ba1815760c893bd2d2335b1">ExtAPI::is_dealloc</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span> {</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> t = <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">get_type</a>(F);</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  <span class="keywordflow">return</span> t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa9b98279d1926e4ebfb237a43536c7b73">EFT_FREE</a>;</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span> }</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span> </div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span> <span class="comment">// Does (F) not do anything with the known pointers?</span></div><div class="line"><a name="l00370"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a82ebf71c5214f891f17e842e0b133b4f"> 370</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExtAPI.html#a82ebf71c5214f891f17e842e0b133b4f">ExtAPI::is_noop</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span> {</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> t = <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">get_type</a>(F);</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  <span class="keywordflow">return</span> t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa87c4ba17ac3567a0673d6516995e06ef">EFT_NOOP</a> || t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa9b98279d1926e4ebfb237a43536c7b73">EFT_FREE</a>;</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span> }</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span> </div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span> <span class="comment">// Does (F) reallocate a new object?</span></div><div class="line"><a name="l00377"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#ac6d6bdc51a6b75d6d5741cb751559fe4"> 377</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExtAPI.html#ac6d6bdc51a6b75d6d5741cb751559fe4">ExtAPI::is_realloc</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span> {</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> t = <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">get_type</a>(F);</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  <span class="keywordflow">return</span> t == <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa1f23e7b8cdd103943f515e807bf36b1c">EFT_REALLOC</a>;</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span> }</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span> </div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span> <span class="comment">// Should (F) be considered "external" (either not defined in the program</span></div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span> <span class="comment">// or a user-defined version of a known alloc or no-op)?</span></div><div class="line"><a name="l00385"></a><span class="lineno"><a class="line" href="classSVF_1_1ExtAPI.html#a21f45c806672255c044d39490990eae2"> 385</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExtAPI.html#a21f45c806672255c044d39490990eae2">ExtAPI::is_ext</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span> {</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  assert(F);</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <span class="keywordtype">bool</span> res;</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  <span class="keywordflow">if</span> (F-><a class="code" href="classSVF_1_1SVFFunction.html#ab672f0255ec8e42d5e414bc8c72b7c76">isDeclaration</a>() || F-><a class="code" href="classSVF_1_1SVFFunction.html#a7b4c6c7143d012802ea5ee962bec2deb">isIntrinsic</a>())</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  {</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  res = 1;</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  }</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  {</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">ExtAPI::extType</a> t = <a class="code" href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">get_type</a>(F);</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <span class="keywordflow">if</span> (t != <a class="code" href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa7ad779bd3527f7cd220ca74c736fd2df">EFT_NULL</a>)</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  {</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> overwrittenAppFunction = <a class="code" href="classSVF_1_1ExtAPI.html#a5ef7edb1664ab87f00418e7808d00258">isOverwrittenAppFunction</a>(F);</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  <span class="comment">// overwrittenAppFunction = 1: Execute function specification in ExtAPI.json</span></div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  <span class="comment">// F is considered as external function</span></div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  <span class="keywordflow">if</span> (overwrittenAppFunction == 1)</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  res = 1;</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  <span class="comment">// overwrittenAppFunction = 0: Execute user-defined functions</span></div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  <span class="comment">// F is not considered as external function</span></div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  res = 0;</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  }</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  res = 0;</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  }</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  <span class="keywordflow">return</span> res;</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span> }</div><div class="ttc" id="classSVF_1_1ExtAPI_html_a82ebf71c5214f891f17e842e0b133b4f"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a82ebf71c5214f891f17e842e0b133b4f">SVF::ExtAPI::is_noop</a></div><div class="ttdeci">bool is_noop(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00370">ExtAPI.cpp:370</a></div></div>
|
|
70
70
|
<div class="ttc" id="ExtAPI_8h_html_a8af07ec3fec2ac9636dfb81bb7a8961e"><div class="ttname"><a href="ExtAPI_8h.html#a8af07ec3fec2ac9636dfb81bb7a8961e">JSON_OPT_FUNCTIONTYPE</a></div><div class="ttdeci">#define JSON_OPT_FUNCTIONTYPE</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00041">ExtAPI.h:41</a></div></div>
|
|
71
71
|
<div class="ttc" id="classSVF_1_1ExtAPI_html_a5df65081e82a05223ce781660ee199caa94f514e925fdb422632840ca44343af0"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa94f514e925fdb422632840ca44343af0">SVF::ExtAPI::EFT_STAT</a></div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00131">ExtAPI.h:131</a></div></div>
|
|
72
|
-
<div class="ttc" id="classSVF_1_1ExtAPI_html_ab61fbc80acc89e26df2b451cbab81246"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#ab61fbc80acc89e26df2b451cbab81246">SVF::ExtAPI::get_FunJson</a></div><div class="ttdeci">cJSON * get_FunJson(const std::string &funName)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#
|
|
72
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_ab61fbc80acc89e26df2b451cbab81246"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#ab61fbc80acc89e26df2b451cbab81246">SVF::ExtAPI::get_FunJson</a></div><div class="ttdeci">cJSON * get_FunJson(const std::string &funName)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00242">ExtAPI.cpp:242</a></div></div>
|
|
73
73
|
<div class="ttc" id="classSVF_1_1ExtAPI_html_a95ac45d2367b3d3124d5d98958e74cc5"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a95ac45d2367b3d3124d5d98958e74cc5">SVF::ExtAPI::type_pair</a></div><div class="ttdeci">std::map< std::string, extType > type_pair</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00182">ExtAPI.h:182</a></div></div>
|
|
74
|
-
<div class="ttc" id="ExtAPI_8cpp_html_a3957468a4d85cef02d8be1f82bcdfc69"><div class="ttname"><a href="ExtAPI_8cpp.html#a3957468a4d85cef02d8be1f82bcdfc69">parseJson</a></div><div class="ttdeci">static cJSON * parseJson(const std::string &path, off_t fileSize)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#
|
|
74
|
+
<div class="ttc" id="ExtAPI_8cpp_html_a3957468a4d85cef02d8be1f82bcdfc69"><div class="ttname"><a href="ExtAPI_8cpp.html#a3957468a4d85cef02d8be1f82bcdfc69">parseJson</a></div><div class="ttdeci">static cJSON * parseJson(const std::string &path, off_t fileSize)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00090">ExtAPI.cpp:90</a></div></div>
|
|
75
75
|
<div class="ttc" id="classSVF_1_1ExtAPI_html_ab793be4b6f8f0a025599e76f5df2a4eb"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#ab793be4b6f8f0a025599e76f5df2a4eb">SVF::ExtAPI::ExtAPI</a></div><div class="ttdeci">ExtAPI()=default</div></div>
|
|
76
76
|
<div class="ttc" id="classSVF_1_1ExtAPI_html_a5df65081e82a05223ce781660ee199caa9b98279d1926e4ebfb237a43536c7b73"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa9b98279d1926e4ebfb237a43536c7b73">SVF::ExtAPI::EFT_FREE</a></div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00128">ExtAPI.h:128</a></div></div>
|
|
77
77
|
<div class="ttc" id="classSVF_1_1SVFFunction_html_ab672f0255ec8e42d5e414bc8c72b7c76"><div class="ttname"><a href="classSVF_1_1SVFFunction.html#ab672f0255ec8e42d5e414bc8c72b7c76">SVF::SVFFunction::isDeclaration</a></div><div class="ttdeci">bool isDeclaration() const</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00148">BasicTypes.h:148</a></div></div>
|
|
@@ -81,58 +81,61 @@ $(function() {
|
|
|
81
81
|
<div class="ttc" id="namespaceSVF_html_a9b707002523ece2ac54ca893ee9a2d4e"><div class="ttname"><a href="namespaceSVF.html#a9b707002523ece2ac54ca893ee9a2d4e">SVF::s32_t</a></div><div class="ttdeci">signed s32_t</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00086">SVFBasicTypes.h:86</a></div></div>
|
|
82
82
|
<div class="ttc" id="structcJSON_html_a369cea49494eb5d4409d532a731a0fbf"><div class="ttname"><a href="structcJSON.html#a369cea49494eb5d4409d532a731a0fbf">cJSON::valueint</a></div><div class="ttdeci">int valueint</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00117">cJSON.h:117</a></div></div>
|
|
83
83
|
<div class="ttc" id="SVFUtil_8h_html"><div class="ttname"><a href="SVFUtil_8h.html">SVFUtil.h</a></div></div>
|
|
84
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_a945fb815af09e4f7b22c637effd64d8b"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a945fb815af09e4f7b22c637effd64d8b">SVF::ExtAPI::add_entry</a></div><div class="ttdeci">void add_entry(const char *funName, extType type, bool overwrite_app_function)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00185">ExtAPI.cpp:185</a></div></div>
|
|
84
85
|
<div class="ttc" id="structcJSON_html_ad43f8de2571e504c4c5ce0a36990e6e1"><div class="ttname"><a href="structcJSON.html#ad43f8de2571e504c4c5ce0a36990e6e1">cJSON::valuestring</a></div><div class="ttdeci">char * valuestring</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00115">cJSON.h:115</a></div></div>
|
|
85
86
|
<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>
|
|
86
87
|
<div class="ttc" id="cJSON_8cpp_html_afde5c619f31577b3d821b56b23953c85"><div class="ttname"><a href="cJSON_8cpp.html#afde5c619f31577b3d821b56b23953c85">cJSON_Delete</a></div><div class="ttdeci">cJSON_Delete(null)</div></div>
|
|
87
88
|
<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>
|
|
88
|
-
<div class="ttc" id="
|
|
89
|
+
<div class="ttc" id="cJSON_8h_html"><div class="ttname"><a href="cJSON_8h.html">cJSON.h</a></div></div>
|
|
90
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_aeef27a358ba1815760c893bd2d2335b1"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#aeef27a358ba1815760c893bd2d2335b1">SVF::ExtAPI::is_dealloc</a></div><div class="ttdeci">bool is_dealloc(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00363">ExtAPI.cpp:363</a></div></div>
|
|
89
91
|
<div class="ttc" id="classSVF_1_1ExtAPI_html_a5df65081e82a05223ce781660ee199caa035cf8a39c192608ec0e91d48e479899"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa035cf8a39c192608ec0e91d48e479899">SVF::ExtAPI::EFT_A0R_NEW</a></div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00150">ExtAPI.h:150</a></div></div>
|
|
90
|
-
<div class="ttc" id="classSVF_1_1ExtAPI_html_a02380d22fd6021ebce1e54723d695c99"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a02380d22fd6021ebce1e54723d695c99">SVF::ExtAPI::getExtAPI</a></div><div class="ttdeci">static ExtAPI * getExtAPI(const std::string &="")</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#
|
|
91
|
-
<div class="ttc" id="classSVF_1_1ExtAPI_html_abe3e0e2500532acfc01cee7e2ce1cd90"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#abe3e0e2500532acfc01cee7e2ce1cd90">SVF::ExtAPI::destory</a></div><div class="ttdeci">static void destory()</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#
|
|
92
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_a02380d22fd6021ebce1e54723d695c99"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a02380d22fd6021ebce1e54723d695c99">SVF::ExtAPI::getExtAPI</a></div><div class="ttdeci">static ExtAPI * getExtAPI(const std::string &="")</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00122">ExtAPI.cpp:122</a></div></div>
|
|
93
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_abe3e0e2500532acfc01cee7e2ce1cd90"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#abe3e0e2500532acfc01cee7e2ce1cd90">SVF::ExtAPI::destory</a></div><div class="ttdeci">static void destory()</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00171">ExtAPI.cpp:171</a></div></div>
|
|
94
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_a1832c19de2fd7ff01793e75a051d3f24"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a1832c19de2fd7ff01793e75a051d3f24">SVF::ExtAPI::get_opName</a></div><div class="ttdeci">extf_t get_opName(const std::string &s)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00204">ExtAPI.cpp:204</a></div></div>
|
|
92
95
|
<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>
|
|
93
96
|
<div class="ttc" id="classSVF_1_1ExtAPI_html_a5df65081e82a05223ce781660ee199caa87c4ba17ac3567a0673d6516995e06ef"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa87c4ba17ac3567a0673d6516995e06ef">SVF::ExtAPI::EFT_NOOP</a></div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00125">ExtAPI.h:125</a></div></div>
|
|
94
97
|
<div class="ttc" id="structcJSON_html_a401b274c2da358dac5c23ab8b2c71f85"><div class="ttname"><a href="structcJSON.html#a401b274c2da358dac5c23ab8b2c71f85">cJSON::child</a></div><div class="ttdeci">struct cJSON * child</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00109">cJSON.h:109</a></div></div>
|
|
95
98
|
<div class="ttc" id="structcJSON_html_aa6b47e9a4b0e0a26f519b1a2b6739983"><div class="ttname"><a href="structcJSON.html#aa6b47e9a4b0e0a26f519b1a2b6739983">cJSON::string</a></div><div class="ttdeci">char * string</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00122">cJSON.h:122</a></div></div>
|
|
96
|
-
<div class="ttc" id="classSVF_1_1ExtAPI_html_a158e7da51d45b746e067dc40e912c477"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a158e7da51d45b746e067dc40e912c477">SVF::ExtAPI::is_arg_alloc</a></div><div class="ttdeci">bool is_arg_alloc(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#
|
|
97
|
-
<div class="ttc" id="classSVF_1_1ExtAPI_html_a411a034f872afcf62ce5456e408ccf41"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">SVF::ExtAPI::get_type</a></div><div class="ttdeci">extType get_type(const SVF::SVFFunction *callee)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#
|
|
99
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_a158e7da51d45b746e067dc40e912c477"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a158e7da51d45b746e067dc40e912c477">SVF::ExtAPI::is_arg_alloc</a></div><div class="ttdeci">bool is_arg_alloc(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00327">ExtAPI.cpp:327</a></div></div>
|
|
100
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_a411a034f872afcf62ce5456e408ccf41"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a411a034f872afcf62ce5456e408ccf41">SVF::ExtAPI::get_type</a></div><div class="ttdeci">extType get_type(const SVF::SVFFunction *callee)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00282">ExtAPI.cpp:282</a></div></div>
|
|
98
101
|
<div class="ttc" id="classSVF_1_1ExtAPI_html_a5df65081e82a05223ce781660ee199ca"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199ca">SVF::ExtAPI::extType</a></div><div class="ttdeci">extType</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00123">ExtAPI.h:123</a></div></div>
|
|
99
102
|
<div class="ttc" id="ExtAPI_8h_html"><div class="ttname"><a href="ExtAPI_8h.html">ExtAPI.h</a></div></div>
|
|
100
103
|
<div class="ttc" id="cJSON_8cpp_html_a3f9a0d3265a6254722587175dac3e4dc"><div class="ttname"><a href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a></div><div class="ttdeci">newitem type</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8cpp_source.html#l02739">cJSON.cpp:2739</a></div></div>
|
|
101
|
-
<div class="ttc" id="ExtAPI_8cpp_html_a82e0f4095086de7f384a1f55838b5d28"><div class="ttname"><a href="ExtAPI_8cpp.html#a82e0f4095086de7f384a1f55838b5d28">getJsonFile</a></div><div class="ttdeci">static std::string getJsonFile(const std::string &path)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#
|
|
102
|
-
<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 &command)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#
|
|
104
|
+
<div class="ttc" id="ExtAPI_8cpp_html_a82e0f4095086de7f384a1f55838b5d28"><div class="ttname"><a href="ExtAPI_8cpp.html#a82e0f4095086de7f384a1f55838b5d28">getJsonFile</a></div><div class="ttdeci">static std::string getJsonFile(const std::string &path)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00067">ExtAPI.cpp:67</a></div></div>
|
|
105
|
+
<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 &command)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00043">ExtAPI.cpp:43</a></div></div>
|
|
103
106
|
<div class="ttc" id="classSVF_1_1ExtAPI_html_aaf94c82d98f8ed1514ee49c9881a4094"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094">SVF::ExtAPI::extf_t</a></div><div class="ttdeci">extf_t</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00106">ExtAPI.h:106</a></div></div>
|
|
104
107
|
<div class="ttc" id="classSVF_1_1ExtAPI_html_a5df65081e82a05223ce781660ee199caa7ad779bd3527f7cd220ca74c736fd2df"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa7ad779bd3527f7cd220ca74c736fd2df">SVF::ExtAPI::EFT_NULL</a></div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00164">ExtAPI.h:164</a></div></div>
|
|
105
108
|
<div class="ttc" id="structcJSON_html_ade862b880379b5e2a591f7326401fa8d"><div class="ttname"><a href="structcJSON.html#ade862b880379b5e2a591f7326401fa8d">cJSON::next</a></div><div class="ttdeci">struct cJSON * next</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00106">cJSON.h:106</a></div></div>
|
|
106
109
|
<div class="ttc" id="classSVF_1_1ExtAPI_html_a552feab663622681db231d5b48f00d75"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a552feab663622681db231d5b48f00d75">SVF::ExtAPI::extOp</a></div><div class="ttdeci">static ExtAPI * extOp</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00221">ExtAPI.h:221</a></div></div>
|
|
107
|
-
<div class="ttc" id="classSVF_1_1ExtAPI_html_ac6d6bdc51a6b75d6d5741cb751559fe4"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#ac6d6bdc51a6b75d6d5741cb751559fe4">SVF::ExtAPI::is_realloc</a></div><div class="ttdeci">bool is_realloc(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#
|
|
110
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_ac6d6bdc51a6b75d6d5741cb751559fe4"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#ac6d6bdc51a6b75d6d5741cb751559fe4">SVF::ExtAPI::is_realloc</a></div><div class="ttdeci">bool is_realloc(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00377">ExtAPI.cpp:377</a></div></div>
|
|
108
111
|
<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 & 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>
|
|
109
112
|
<div class="ttc" id="classSVF_1_1ExtAPI_html_a835fda8fb934d1cd040d1b3fb2dd0270"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a835fda8fb934d1cd040d1b3fb2dd0270">SVF::ExtAPI::root</a></div><div class="ttdeci">static cJSON * root</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00224">ExtAPI.h:224</a></div></div>
|
|
110
113
|
<div class="ttc" id="classSVF_1_1ExtAPI_html_a5df65081e82a05223ce781660ee199caac57ade96d1d18b9f2d4d36bc6928c5c4"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caac57ade96d1d18b9f2d4d36bc6928c5c4">SVF::ExtAPI::EFT_ALLOC</a></div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00126">ExtAPI.h:126</a></div></div>
|
|
111
114
|
<div class="ttc" id="classSVF_1_1ExtAPI_html_a5df65081e82a05223ce781660ee199caa8782293305260b1500a09b473439d3b0"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa8782293305260b1500a09b473439d3b0">SVF::ExtAPI::EFT_NOSTRUCT_ALLOC</a></div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00130">ExtAPI.h:130</a></div></div>
|
|
112
115
|
<div class="ttc" id="cJSON_8h_html_aa2cb4765308e2bbdf01988b2acdf92d9"><div class="ttname"><a href="cJSON_8h.html#aa2cb4765308e2bbdf01988b2acdf92d9">cJSON_String</a></div><div class="ttdeci">#define cJSON_String</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00094">cJSON.h:94</a></div></div>
|
|
113
|
-
<div class="ttc" id="classSVF_1_1ExtAPI_html_a6298f765cd73e9d71fc6b3b55fb7e56f"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a6298f765cd73e9d71fc6b3b55fb7e56f">SVF::ExtAPI::get_opName</a></div><div class="ttdeci">extf_t get_opName(std::string s)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00185">ExtAPI.cpp:185</a></div></div>
|
|
114
116
|
<div class="ttc" id="classSVF_1_1ExtAPI_html"><div class="ttname"><a href="classSVF_1_1ExtAPI.html">SVF::ExtAPI</a></div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00103">ExtAPI.h:103</a></div></div>
|
|
115
117
|
<div class="ttc" id="classSVF_1_1ExtAPI_html_a495b6db60a6266b83cf511965a57f6a3"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a495b6db60a6266b83cf511965a57f6a3">SVF::ExtAPI::op_pair</a></div><div class="ttdeci">std::map< std::string, extf_t > op_pair</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00168">ExtAPI.h:168</a></div></div>
|
|
116
118
|
<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>
|
|
117
119
|
<div class="ttc" id="classSVF_1_1ExtAPI_html_a5df65081e82a05223ce781660ee199caa1f23e7b8cdd103943f515e807bf36b1c"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa1f23e7b8cdd103943f515e807bf36b1c">SVF::ExtAPI::EFT_REALLOC</a></div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00127">ExtAPI.h:127</a></div></div>
|
|
118
|
-
<div class="ttc" id="classSVF_1_1ExtAPI_html_ad3eefa086aa514e4d245a975ea3d45b5"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#ad3eefa086aa514e4d245a975ea3d45b5">SVF::ExtAPI::has_static2</a></div><div class="ttdeci">bool has_static2(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#
|
|
120
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_ad3eefa086aa514e4d245a975ea3d45b5"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#ad3eefa086aa514e4d245a975ea3d45b5">SVF::ExtAPI::has_static2</a></div><div class="ttdeci">bool has_static2(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00314">ExtAPI.cpp:314</a></div></div>
|
|
119
121
|
<div class="ttc" id="classSVF_1_1SVFValue_html_a2409c01221b9a6632655cee43d1b35e4"><div class="ttname"><a href="classSVF_1_1SVFValue.html#a2409c01221b9a6632655cee43d1b35e4">SVF::SVFValue::getName</a></div><div class="ttdeci">const std::string getName() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00253">SVFBasicTypes.h:253</a></div></div>
|
|
120
|
-
<div class="ttc" id="classSVF_1_1ExtAPI_html_a68939c789d0530151a4e79e79317531a"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a68939c789d0530151a4e79e79317531a">SVF::ExtAPI::get_alloc_arg_pos</a></div><div class="ttdeci">s32_t get_alloc_arg_pos(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#
|
|
122
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_a68939c789d0530151a4e79e79317531a"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a68939c789d0530151a4e79e79317531a">SVF::ExtAPI::get_alloc_arg_pos</a></div><div class="ttdeci">s32_t get_alloc_arg_pos(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00334">ExtAPI.cpp:334</a></div></div>
|
|
121
123
|
<div class="ttc" id="config_8h_html_a799965f801bbe1f540c3100566f78d81"><div class="ttname"><a href="config_8h.html#a799965f801bbe1f540c3100566f78d81">PROJECT_PATH</a></div><div class="ttdeci">#define PROJECT_PATH</div><div class="ttdef"><b>Definition:</b> <a href="config_8h_source.html#l00004">config.h:4</a></div></div>
|
|
122
|
-
<div class="ttc" id="classSVF_1_1ExtAPI_html_a0d865c55681a3b4a9bb965fd0200029d"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a0d865c55681a3b4a9bb965fd0200029d">SVF::ExtAPI::is_alloc</a></div><div class="ttdeci">bool is_alloc(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#
|
|
124
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_a0d865c55681a3b4a9bb965fd0200029d"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a0d865c55681a3b4a9bb965fd0200029d">SVF::ExtAPI::is_alloc</a></div><div class="ttdeci">bool is_alloc(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00320">ExtAPI.cpp:320</a></div></div>
|
|
123
125
|
<div class="ttc" id="classSVF_1_1ExtAPI_html_a5df65081e82a05223ce781660ee199caa27b8dfa0742daa17c3e1a520d03dbd14"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa27b8dfa0742daa17c3e1a520d03dbd14">SVF::ExtAPI::EFT_A2R_NEW</a></div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00152">ExtAPI.h:152</a></div></div>
|
|
124
|
-
<div class="ttc" id="classSVF_1_1ExtAPI_html_ac3e34227968d6a2835d63b1052da3c1a"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#ac3e34227968d6a2835d63b1052da3c1a">SVF::ExtAPI::get_name</a></div><div class="ttdeci">std::string get_name(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#
|
|
125
|
-
<div class="ttc" id="classSVF_1_1ExtAPI_html_a5ef7edb1664ab87f00418e7808d00258"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a5ef7edb1664ab87f00418e7808d00258">SVF::ExtAPI::isOverwrittenAppFunction</a></div><div class="ttdeci">u32_t isOverwrittenAppFunction(const SVF::SVFFunction *callee)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#
|
|
126
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_ac3e34227968d6a2835d63b1052da3c1a"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#ac3e34227968d6a2835d63b1052da3c1a">SVF::ExtAPI::get_name</a></div><div class="ttdeci">std::string get_name(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00228">ExtAPI.cpp:228</a></div></div>
|
|
127
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_a5ef7edb1664ab87f00418e7808d00258"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a5ef7edb1664ab87f00418e7808d00258">SVF::ExtAPI::isOverwrittenAppFunction</a></div><div class="ttdeci">u32_t isOverwrittenAppFunction(const SVF::SVFFunction *callee)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00290">ExtAPI.cpp:290</a></div></div>
|
|
128
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_aa98b80dc86d0549183ec69b44b391bd7"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#aa98b80dc86d0549183ec69b44b391bd7">SVF::ExtAPI::extType_toString</a></div><div class="ttdeci">const std::string & extType_toString(extType type)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00217">ExtAPI.cpp:217</a></div></div>
|
|
126
129
|
<div class="ttc" id="namespaceSVF_html"><div class="ttname"><a href="namespaceSVF.html">SVF</a></div><div class="ttdoc">for isBitcode </div><div class="ttdef"><b>Definition:</b> <a href="CFGNormalizer_8h_source.html#l00035">CFGNormalizer.h:35</a></div></div>
|
|
127
|
-
<div class="ttc" id="classSVF_1_1ExtAPI_html_a21f45c806672255c044d39490990eae2"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a21f45c806672255c044d39490990eae2">SVF::ExtAPI::is_ext</a></div><div class="ttdeci">bool is_ext(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#
|
|
130
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_a21f45c806672255c044d39490990eae2"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a21f45c806672255c044d39490990eae2">SVF::ExtAPI::is_ext</a></div><div class="ttdeci">bool is_ext(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00385">ExtAPI.cpp:385</a></div></div>
|
|
128
131
|
<div class="ttc" id="CFLGrammar_8txt_html_a00967427d1c110ffcc82ea2a966f4564"><div class="ttname"><a href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a></div><div class="ttdeci">V Fbar V F</div><div class="ttdef"><b>Definition:</b> <a href="CFLGrammar_8txt_source.html#l00016">CFLGrammar.txt:16</a></div></div>
|
|
129
132
|
<div class="ttc" id="classSVF_1_1ExtAPI_html_a5df65081e82a05223ce781660ee199caafe69efc20e29f95e0e333d1a462576a2"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caafe69efc20e29f95e0e333d1a462576a2">SVF::ExtAPI::EFT_A4R_NEW</a></div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00153">ExtAPI.h:153</a></div></div>
|
|
130
133
|
<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>
|
|
131
134
|
<div class="ttc" id="classSVF_1_1SVFFunction_html_a7b4c6c7143d012802ea5ee962bec2deb"><div class="ttname"><a href="classSVF_1_1SVFFunction.html#a7b4c6c7143d012802ea5ee962bec2deb">SVF::SVFFunction::isIntrinsic</a></div><div class="ttdeci">bool isIntrinsic() const</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00153">BasicTypes.h:153</a></div></div>
|
|
132
|
-
<div class="ttc" id="classSVF_1_1ExtAPI_html_a934e293bd4050cb1ab5c19e8ad391ebe"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a934e293bd4050cb1ab5c19e8ad391ebe">SVF::ExtAPI::no_struct_alloc</a></div><div class="ttdeci">bool no_struct_alloc(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#
|
|
135
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_a934e293bd4050cb1ab5c19e8ad391ebe"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a934e293bd4050cb1ab5c19e8ad391ebe">SVF::ExtAPI::no_struct_alloc</a></div><div class="ttdeci">bool no_struct_alloc(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00356">ExtAPI.cpp:356</a></div></div>
|
|
133
136
|
<div class="ttc" id="structcJSON_html_ab13084c574681593b12f6e0a3db0dcfc"><div class="ttname"><a href="structcJSON.html#ab13084c574681593b12f6e0a3db0dcfc">cJSON::type</a></div><div class="ttdeci">int type</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00112">cJSON.h:112</a></div></div>
|
|
134
|
-
<div class="ttc" id="classSVF_1_1ExtAPI_html_a906a3728bbcfb7a43ac0938ffcb3df23"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a906a3728bbcfb7a43ac0938ffcb3df23">SVF::ExtAPI::get_opArgs</a></div><div class="ttdeci">std::vector< std::string > get_opArgs(const cJSON *value)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#
|
|
135
|
-
<div class="ttc" id="classSVF_1_1ExtAPI_html_ae20ea24cce02de87d89a2d0b773a2357"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#ae20ea24cce02de87d89a2d0b773a2357">SVF::ExtAPI::has_static</a></div><div class="ttdeci">bool has_static(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#
|
|
137
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_a906a3728bbcfb7a43ac0938ffcb3df23"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a906a3728bbcfb7a43ac0938ffcb3df23">SVF::ExtAPI::get_opArgs</a></div><div class="ttdeci">std::vector< std::string > get_opArgs(const cJSON *value)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00249">ExtAPI.cpp:249</a></div></div>
|
|
138
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_ae20ea24cce02de87d89a2d0b773a2357"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#ae20ea24cce02de87d89a2d0b773a2357">SVF::ExtAPI::has_static</a></div><div class="ttdeci">bool has_static(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00307">ExtAPI.cpp:307</a></div></div>
|
|
136
139
|
<div class="ttc" id="classSVF_1_1ExtAPI_html_a5df65081e82a05223ce781660ee199caa515c2184a7461fc1788a514432a7ec22"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a5df65081e82a05223ce781660ee199caa515c2184a7461fc1788a514432a7ec22">SVF::ExtAPI::EFT_STAT2</a></div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00132">ExtAPI.h:132</a></div></div>
|
|
137
140
|
<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>
|
|
138
141
|
<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>
|