svf-tools 1.0.767 → 1.0.768
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.
|
@@ -218,130 +218,146 @@ $(function() {
|
|
|
218
218
|
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  }</div>
|
|
219
219
|
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a688bd5e1bf36b3e75bfcea9388871dc4">isMemcpyExtFun</a>(svfCallee))</div>
|
|
220
220
|
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  {</div>
|
|
221
|
-
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <span class="
|
|
222
|
-
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span> 
|
|
223
|
-
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="keywordflow">
|
|
224
|
-
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  addComplexConsForExt(cs->getArgOperand(
|
|
225
|
-
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  <span class="keywordflow">if</span>(
|
|
226
|
-
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  addComplexConsForExt(cs->getArgOperand(
|
|
227
|
-
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  <span class="keywordflow">
|
|
228
|
-
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  addComplexConsForExt(cs->getArgOperand(0), cs->getArgOperand(1),
|
|
229
|
-
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  <span class="keywordflow">
|
|
230
|
-
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span> 
|
|
231
|
-
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span> 
|
|
232
|
-
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span> 
|
|
233
|
-
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span> 
|
|
234
|
-
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span> 
|
|
235
|
-
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span> 
|
|
236
|
-
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span> 
|
|
237
|
-
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <span class="
|
|
238
|
-
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span> 
|
|
239
|
-
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <span class="
|
|
240
|
-
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <
|
|
241
|
-
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span> 
|
|
242
|
-
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span> 
|
|
243
|
-
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span> 
|
|
244
|
-
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <a class="code" href="
|
|
245
|
-
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span> 
|
|
246
|
-
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span> 
|
|
247
|
-
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span> 
|
|
248
|
-
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span> 
|
|
249
|
-
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span> 
|
|
250
|
-
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span> 
|
|
251
|
-
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span> 
|
|
252
|
-
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span> 
|
|
253
|
-
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span> 
|
|
254
|
-
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span> 
|
|
255
|
-
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span> 
|
|
256
|
-
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span> 
|
|
257
|
-
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span> 
|
|
258
|
-
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span> 
|
|
259
|
-
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span> 
|
|
260
|
-
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span> 
|
|
261
|
-
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span> 
|
|
262
|
-
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span> 
|
|
263
|
-
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span> 
|
|
264
|
-
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span> 
|
|
265
|
-
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span> 
|
|
266
|
-
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span> 
|
|
267
|
-
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span> 
|
|
268
|
-
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  </div>
|
|
269
|
-
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span> 
|
|
270
|
-
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span> 
|
|
271
|
-
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span> 
|
|
272
|
-
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span> 
|
|
273
|
-
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span> 
|
|
274
|
-
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span> 
|
|
275
|
-
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span> 
|
|
276
|
-
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span> 
|
|
277
|
-
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span> 
|
|
278
|
-
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  </div>
|
|
279
|
-
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span> 
|
|
280
|
-
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span> 
|
|
281
|
-
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span> 
|
|
282
|
-
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span> 
|
|
221
|
+
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <span class="comment">// Side-effects similar to void *memcpy(void *dest, const void * src, size_t n)</span></div>
|
|
222
|
+
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  <span class="comment">// which copies n characters from memory area 'src' to memory area 'dest'.</span></div>
|
|
223
|
+
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="keywordflow">if</span>(svfCallee-><a class="code" href="classSVF_1_1SVFValue.html#a2401b022638769f59f86ab424a189b6e">getName</a>().find(<span class="stringliteral">"iconv"</span>) != std::string::npos)</div>
|
|
224
|
+
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  addComplexConsForExt(cs->getArgOperand(3), cs->getArgOperand(1), <span class="keyword">nullptr</span>);</div>
|
|
225
|
+
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(svfCallee-><a class="code" href="classSVF_1_1SVFValue.html#a2401b022638769f59f86ab424a189b6e">getName</a>().find(<span class="stringliteral">"bcopy"</span>) != std::string::npos)</div>
|
|
226
|
+
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  addComplexConsForExt(cs->getArgOperand(1), cs->getArgOperand(0), cs->getArgOperand(2));</div>
|
|
227
|
+
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  <span class="keywordflow">if</span>(svfCall-><a class="code" href="classSVF_1_1SVFCallInst.html#a496d0e963f0f6a4f9c08183fa91792b0">arg_size</a>() == 3)</div>
|
|
228
|
+
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  addComplexConsForExt(cs->getArgOperand(0), cs->getArgOperand(1), cs->getArgOperand(2));</div>
|
|
229
|
+
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  <span class="keywordflow">else</span></div>
|
|
230
|
+
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  addComplexConsForExt(cs->getArgOperand(0), cs->getArgOperand(1), <span class="keyword">nullptr</span>);</div>
|
|
231
|
+
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  <span class="keywordflow">if</span>(SVFUtil::isa<PointerType>(cs->getType()))</div>
|
|
232
|
+
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  addCopyEdge(getValueNode(cs->getArgOperand(0)), getValueNode(cs));</div>
|
|
233
|
+
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  }</div>
|
|
234
|
+
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a54098ea73555caa682287f8e3c9e8fcb">isMemsetExtFun</a>(svfCallee))</div>
|
|
235
|
+
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  {</div>
|
|
236
|
+
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <span class="comment">// Side-effects similar to memset(void *str, int c, size_t n)</span></div>
|
|
237
|
+
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <span class="comment">// which copies the character c (an unsigned char) to the first n characters of the string pointed to, by the argument str</span></div>
|
|
238
|
+
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  std::vector<AccessPath> dstFields;</div>
|
|
239
|
+
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *dtype = getBaseTypeAndFlattenedFields(cs->getArgOperand(0), dstFields, cs->getArgOperand(2));</div>
|
|
240
|
+
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> sz = dstFields.size();</div>
|
|
241
|
+
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  <span class="comment">//For each field (i), add store edge *(arg0 + i) = arg1</span></div>
|
|
242
|
+
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = 0; <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < sz; <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>++)</div>
|
|
243
|
+
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  {</div>
|
|
244
|
+
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html">LLVMModuleSet</a>* llvmmodule = LLVMModuleSet::getLLVMModuleSet();</div>
|
|
245
|
+
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* dElementType = pag->getSymbolInfo()->getFlatternedElemType(llvmmodule-><a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(dtype), dstFields[<a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].getConstantFieldIdx());</div>
|
|
246
|
+
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dField = getGepValVar(cs->getArgOperand(0), dstFields[<a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>], dElementType);</div>
|
|
247
|
+
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  addStoreEdge(getValueNode(cs->getArgOperand(1)),dField);</div>
|
|
248
|
+
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  }</div>
|
|
249
|
+
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keywordflow">if</span>(SVFUtil::isa<PointerType>(cs->getType()))</div>
|
|
250
|
+
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  addCopyEdge(getValueNode(cs->getArgOperand(0)), getValueNode(cs));</div>
|
|
251
|
+
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  }</div>
|
|
252
|
+
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(svfCallee-><a class="code" href="classSVF_1_1SVFValue.html#a2401b022638769f59f86ab424a189b6e">getName</a>().compare(<span class="stringliteral">"dlsym"</span>) == 0)</div>
|
|
253
|
+
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  {</div>
|
|
254
|
+
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  <span class="comment">/*</span></div>
|
|
255
|
+
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span> <span class="comment"> Side-effects of void* dlsym( void* handle, const char* funName),</span></div>
|
|
256
|
+
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span> <span class="comment"> Locate the function with the name "funName," then add a "copy" edge between the callsite and that function.</span></div>
|
|
257
|
+
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span> <span class="comment"> dlsym() example:</span></div>
|
|
258
|
+
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span> <span class="comment"> int main() {</span></div>
|
|
259
|
+
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span> <span class="comment"> // Open the shared library</span></div>
|
|
260
|
+
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span> <span class="comment"> void* handle = dlopen("./my_shared_library.so", RTLD_LAZY);</span></div>
|
|
261
|
+
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span> <span class="comment"> // Find the function address</span></div>
|
|
262
|
+
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span> <span class="comment"> void (*myFunctionPtr)() = (void (*)())dlsym(handle, "myFunction");</span></div>
|
|
263
|
+
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span> <span class="comment"> // Call the function</span></div>
|
|
264
|
+
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span> <span class="comment"> myFunctionPtr();</span></div>
|
|
265
|
+
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span> <span class="comment"> }</span></div>
|
|
266
|
+
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span> <span class="comment"> */</span></div>
|
|
267
|
+
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* src = cs->getArgOperand(1);</div>
|
|
268
|
+
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ac4e93e1fec646ff222940a663843921b">GetElementPtrInst</a>* gep = SVFUtil::dyn_cast<GetElementPtrInst>(src))</div>
|
|
269
|
+
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  src = <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a07bd47ccfd02c5a2a6db26b537b2184f">stripConstantCasts</a>(gep->getPointerOperand());</div>
|
|
270
|
+
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  </div>
|
|
271
|
+
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  <span class="keyword">auto</span> getHookFn = [](<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* src)-><span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>*</div>
|
|
272
|
+
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  {</div>
|
|
273
|
+
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <span class="keywordflow">if</span> (!SVFUtil::isa<GlobalVariable>(src))</div>
|
|
274
|
+
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
275
|
+
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  </div>
|
|
276
|
+
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <span class="keyword">auto</span> *glob = SVFUtil::cast<GlobalVariable>(src);</div>
|
|
277
|
+
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  <span class="keywordflow">if</span> (!glob->hasInitializer() || !SVFUtil::isa<ConstantDataArray>(glob->getInitializer()))</div>
|
|
278
|
+
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
279
|
+
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  </div>
|
|
280
|
+
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  <span class="keyword">auto</span> *constarray = SVFUtil::cast<ConstantDataArray>(glob->getInitializer());</div>
|
|
281
|
+
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  <span class="keywordflow">return</span> <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a76b0d0ac69c170838cfc8ee26f4518a0">LLVMUtil::getProgFunction</a>(constarray->getAsCString().str());</div>
|
|
282
|
+
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  };</div>
|
|
283
283
|
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  </div>
|
|
284
|
-
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  <span class="
|
|
285
|
-
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span> 
|
|
286
|
-
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  </div>
|
|
287
|
-
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span> 
|
|
288
|
-
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span> 
|
|
289
|
-
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span> 
|
|
290
|
-
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span> 
|
|
291
|
-
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span> 
|
|
292
|
-
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span> 
|
|
293
|
-
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span> 
|
|
294
|
-
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span> 
|
|
295
|
-
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span> 
|
|
296
|
-
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span> 
|
|
297
|
-
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span> 
|
|
298
|
-
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span> 
|
|
299
|
-
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span> 
|
|
300
|
-
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span> 
|
|
301
|
-
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span> 
|
|
302
|
-
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span> 
|
|
303
|
-
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span> 
|
|
304
|
-
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="
|
|
305
|
-
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span> 
|
|
306
|
-
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span> 
|
|
307
|
-
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <span class="
|
|
308
|
-
<div class="line"><a name="
|
|
309
|
-
<div class="line"><a name="
|
|
310
|
-
<div class="line"><a name="
|
|
311
|
-
<div class="line"><a name="
|
|
312
|
-
<div class="line"><a name="
|
|
313
|
-
<div class="line"><a name="
|
|
314
|
-
<div class="line"><a name="
|
|
315
|
-
<div class="line"><a name="
|
|
316
|
-
<div class="line"><a name="
|
|
317
|
-
<div class="line"><a name="
|
|
318
|
-
<div class="line"><a name="
|
|
319
|
-
<div class="line"><a name="
|
|
320
|
-
<div class="line"><a name="
|
|
321
|
-
<div class="line"><a name="
|
|
322
|
-
<div class="line"><a name="
|
|
323
|
-
<div class="line"><a name="
|
|
324
|
-
<div class="line"><a name="
|
|
325
|
-
<div class="line"><a name="
|
|
326
|
-
<div class="line"><a name="
|
|
327
|
-
<div class="line"><a name="
|
|
328
|
-
<div class="line"><a name="
|
|
329
|
-
<div class="line"><a name="
|
|
330
|
-
<div class="line"><a name="
|
|
331
|
-
<div class="line"><a name="
|
|
332
|
-
<div class="line"><a name="
|
|
333
|
-
<div class="line"><a name="
|
|
334
|
-
<div class="line"><a name="
|
|
335
|
-
<div class="line"><a name="
|
|
336
|
-
<div class="line"><a name="
|
|
337
|
-
<div class="line"><a name="
|
|
338
|
-
<div class="line"><a name="
|
|
339
|
-
<div class="line"><a name="
|
|
340
|
-
<div class="line"><a name="
|
|
341
|
-
<div class="line"><a name="
|
|
342
|
-
<div class="line"><a name="
|
|
343
|
-
<div class="line"><a name="
|
|
344
|
-
<div class="line"><a name="
|
|
284
|
+
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *fn = getHookFn(src))</div>
|
|
285
|
+
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  {</div>
|
|
286
|
+
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcNode = getValueNode(fn);</div>
|
|
287
|
+
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  addCopyEdge(srcNode, getValueNode(cs));</div>
|
|
288
|
+
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  }</div>
|
|
289
|
+
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  }</div>
|
|
290
|
+
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(svfCallee-><a class="code" href="classSVF_1_1SVFValue.html#a2401b022638769f59f86ab424a189b6e">getName</a>().find(<span class="stringliteral">"_ZSt29_Rb_tree_insert_and_rebalancebPSt18_Rb_tree_node_baseS0_RS_"</span>) != std::string::npos)</div>
|
|
291
|
+
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  {</div>
|
|
292
|
+
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  <span class="comment">// The purpose of this function is to insert a new node into the red-black tree and then rebalance the tree to ensure that the red-black tree properties are maintained.</span></div>
|
|
293
|
+
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  assert(svfCall-><a class="code" href="classSVF_1_1SVFCallInst.html#a496d0e963f0f6a4f9c08183fa91792b0">arg_size</a>() == 4 && <span class="stringliteral">"_Rb_tree_insert_and_rebalance should have 4 arguments.\n"</span>);</div>
|
|
294
|
+
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  </div>
|
|
295
|
+
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  <span class="comment">// We have vArg3 points to the entry of _Rb_tree_node_base { color; parent; left; right; }.</span></div>
|
|
296
|
+
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <span class="comment">// Now we calculate the offset from base to vArg3</span></div>
|
|
297
|
+
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnArg3 = pag->getValueNode(svfCall-><a class="code" href="classSVF_1_1SVFCallInst.html#a3cbb4b4089c8b27d01da15f2d2f22e14">getArgOperand</a>(3));</div>
|
|
298
|
+
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  <a class="code" href="namespaceSVF.html#a5c4820681ef340339ddded756eb82ae1">APOffset</a> <a class="code" href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a> = getAccessPathFromBaseNode(vnArg3).getConstantFieldIdx();</div>
|
|
299
|
+
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  </div>
|
|
300
|
+
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  <span class="comment">// We get all flattened fields of base</span></div>
|
|
301
|
+
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  vector<AccessPath> fields = pag->getTypeLocSetsMap(vnArg3).second;</div>
|
|
302
|
+
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  </div>
|
|
303
|
+
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <span class="comment">// We summarize the side effects: arg3->parent = arg1, arg3->left = arg1, arg3->right = arg1</span></div>
|
|
304
|
+
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="comment">// Note that arg0 is aligned with "offset".</span></div>
|
|
305
|
+
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a5c4820681ef340339ddded756eb82ae1">APOffset</a> i = <a class="code" href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a> + 1; i <= <a class="code" href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a> + 3; ++i)</div>
|
|
306
|
+
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  {</div>
|
|
307
|
+
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <span class="keywordflow">if</span>((<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a>)i >= fields.size())</div>
|
|
308
|
+
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordflow">break</span>;</div>
|
|
309
|
+
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* elementType = pag->getSymbolInfo()->getFlatternedElemType(pag->getTypeLocSetsMap(vnArg3).first,</div>
|
|
310
|
+
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  fields[i].getConstantFieldIdx());</div>
|
|
311
|
+
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnD = getGepValVar(cs->getArgOperand(3), fields[i], elementType);</div>
|
|
312
|
+
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnS = pag->getValueNode(svfCall-><a class="code" href="classSVF_1_1SVFCallInst.html#a3cbb4b4089c8b27d01da15f2d2f22e14">getArgOperand</a>(1));</div>
|
|
313
|
+
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  <span class="keywordflow">if</span>(vnD && vnS)</div>
|
|
314
|
+
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  addStoreEdge(vnS,vnD);</div>
|
|
315
|
+
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  }</div>
|
|
316
|
+
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  }</div>
|
|
317
|
+
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  </div>
|
|
318
|
+
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a5c2abeb363081381c3dc939ab511e3f0">isThreadForkCall</a>(svfInst))</div>
|
|
319
|
+
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  {</div>
|
|
320
|
+
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* forkedFun = SVFUtil::dyn_cast<SVFFunction>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a2790c5289dad1d6e80f7597a2ea458ab">getForkedFun</a>(svfInst)))</div>
|
|
321
|
+
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  {</div>
|
|
322
|
+
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  forkedFun = forkedFun->getDefFunForMultipleModule();</div>
|
|
323
|
+
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a>* actualParm = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8c64663b564eb7c399013389920ab500">getActualParmAtForkSite</a>(svfInst);</div>
|
|
324
|
+
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  assert((forkedFun->arg_size() <= 2) && <span class="stringliteral">"Size of formal parameter of start routine should be one"</span>);</div>
|
|
325
|
+
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keywordflow">if</span> (forkedFun->arg_size() <= 2 && forkedFun->arg_size() >= 1)</div>
|
|
326
|
+
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  {</div>
|
|
327
|
+
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFArgument.html">SVFArgument</a>* formalParm = forkedFun->getArg(0);</div>
|
|
328
|
+
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  <span class="keywordflow">if</span> (actualParm-><a class="code" href="classSVF_1_1SVFValue.html#a11f2d9b6e969ede6fca2c204cc15b821">getType</a>()-><a class="code" href="classSVF_1_1SVFType.html#a870b63af2bf9fe43cdf1df3d56b20f6c">isPointerTy</a>() && formalParm-><a class="code" href="classSVF_1_1SVFValue.html#a11f2d9b6e969ede6fca2c204cc15b821">getType</a>()-><a class="code" href="classSVF_1_1SVFType.html#a870b63af2bf9fe43cdf1df3d56b20f6c">isPointerTy</a>())</div>
|
|
329
|
+
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  {</div>
|
|
330
|
+
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a> *icfgNode = pag->getICFG()->getCallICFGNode(svfInst);</div>
|
|
331
|
+
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <a class="code" href="classSVF_1_1FunEntryICFGNode.html">FunEntryICFGNode</a> *entry = pag->getICFG()->getFunEntryICFGNode(forkedFun);</div>
|
|
332
|
+
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  addThreadForkEdge(pag->getValueNode(actualParm), pag->getValueNode(formalParm), icfgNode, entry);</div>
|
|
333
|
+
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  }</div>
|
|
334
|
+
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  }</div>
|
|
335
|
+
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  }</div>
|
|
336
|
+
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <span class="keywordflow">else</span></div>
|
|
337
|
+
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  {</div>
|
|
338
|
+
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  }</div>
|
|
339
|
+
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  }</div>
|
|
340
|
+
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  </div>
|
|
341
|
+
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a28fbb7cc51eb7e25d88f43e3eb1f30fb">isHareParForCall</a>(svfInst))</div>
|
|
342
|
+
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  {</div>
|
|
343
|
+
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* taskFunc = SVFUtil::dyn_cast<SVFFunction>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a5cee46f58bdab3f9b1c698e97290152f">getTaskFuncAtHareParForSite</a>(svfInst)))</div>
|
|
344
|
+
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  {</div>
|
|
345
|
+
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  assert((taskFunc->arg_size() == 3) && <span class="stringliteral">"Size of formal parameter of hare_parallel_for's task routine should be 3"</span>);</div>
|
|
346
|
+
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a>* actualParm = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a2f74db48793a0db76c000ffecf9e1bd2">getTaskDataAtHareParForSite</a>(svfInst);</div>
|
|
347
|
+
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFArgument.html">SVFArgument</a>* formalParm = taskFunc->getArg(0);</div>
|
|
348
|
+
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  <span class="keywordflow">if</span> (actualParm-><a class="code" href="classSVF_1_1SVFValue.html#a11f2d9b6e969ede6fca2c204cc15b821">getType</a>()-><a class="code" href="classSVF_1_1SVFType.html#a870b63af2bf9fe43cdf1df3d56b20f6c">isPointerTy</a>() && formalParm-><a class="code" href="classSVF_1_1SVFValue.html#a11f2d9b6e969ede6fca2c204cc15b821">getType</a>()-><a class="code" href="classSVF_1_1SVFType.html#a870b63af2bf9fe43cdf1df3d56b20f6c">isPointerTy</a>())</div>
|
|
349
|
+
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  {</div>
|
|
350
|
+
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a> *icfgNode = pag->getICFG()->getCallICFGNode(svfInst);</div>
|
|
351
|
+
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  <a class="code" href="classSVF_1_1FunEntryICFGNode.html">FunEntryICFGNode</a> *entry = pag->getICFG()->getFunEntryICFGNode(taskFunc);</div>
|
|
352
|
+
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  addThreadForkEdge(pag->getValueNode(actualParm), pag->getValueNode(formalParm), icfgNode, entry);</div>
|
|
353
|
+
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  }</div>
|
|
354
|
+
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  }</div>
|
|
355
|
+
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  <span class="keywordflow">else</span></div>
|
|
356
|
+
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  {</div>
|
|
357
|
+
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  }</div>
|
|
358
|
+
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  }</div>
|
|
359
|
+
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  </div>
|
|
360
|
+
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span> }</div>
|
|
345
361
|
</div><!-- fragment --></div><!-- contents -->
|
|
346
362
|
<div class="ttc" id="anamespaceSVF_html_a5c4820681ef340339ddded756eb82ae1"><div class="ttname"><a href="namespaceSVF.html#a5c4820681ef340339ddded756eb82ae1">SVF::APOffset</a></div><div class="ttdeci">s64_t APOffset</div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00061">SVFType.h:61</a></div></div>
|
|
347
363
|
<div class="ttc" id="aclassSVF_1_1SVFCallInst_html_a3cbb4b4089c8b27d01da15f2d2f22e14"><div class="ttname"><a href="classSVF_1_1SVFCallInst.html#a3cbb4b4089c8b27d01da15f2d2f22e14">SVF::SVFCallInst::getArgOperand</a></div><div class="ttdeci">const SVFValue * getArgOperand(u32_t i) const</div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00708">SVFValue.h:708</a></div></div>
|
|
@@ -2519,130 +2519,146 @@ Private Attributes</h2></td></tr>
|
|
|
2519
2519
|
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  }</div>
|
|
2520
2520
|
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a688bd5e1bf36b3e75bfcea9388871dc4">isMemcpyExtFun</a>(svfCallee))</div>
|
|
2521
2521
|
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  {</div>
|
|
2522
|
-
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <span class="
|
|
2523
|
-
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span> 
|
|
2524
|
-
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="keywordflow">
|
|
2525
|
-
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad0e9f1dd1cba235a699c2b710a888d06">addComplexConsForExt</a>(cs->getArgOperand(
|
|
2526
|
-
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  <span class="keywordflow">if</span>(
|
|
2527
|
-
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad0e9f1dd1cba235a699c2b710a888d06">addComplexConsForExt</a>(cs->getArgOperand(
|
|
2528
|
-
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  <span class="keywordflow">
|
|
2529
|
-
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad0e9f1dd1cba235a699c2b710a888d06">addComplexConsForExt</a>(cs->getArgOperand(0), cs->getArgOperand(1),
|
|
2530
|
-
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  <span class="keywordflow">
|
|
2531
|
-
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#
|
|
2532
|
-
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span> 
|
|
2533
|
-
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span> 
|
|
2534
|
-
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span> 
|
|
2535
|
-
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span> 
|
|
2536
|
-
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span> 
|
|
2537
|
-
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span> 
|
|
2538
|
-
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <span class="
|
|
2539
|
-
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span> 
|
|
2540
|
-
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <span class="
|
|
2541
|
-
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <
|
|
2542
|
-
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span> 
|
|
2543
|
-
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span> 
|
|
2544
|
-
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span> 
|
|
2545
|
-
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <a class="code" href="
|
|
2546
|
-
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#
|
|
2547
|
-
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span> 
|
|
2548
|
-
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span> 
|
|
2549
|
-
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span> 
|
|
2550
|
-
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span> 
|
|
2551
|
-
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span> 
|
|
2552
|
-
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span> 
|
|
2553
|
-
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span> 
|
|
2554
|
-
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span> 
|
|
2555
|
-
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span> 
|
|
2556
|
-
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span> 
|
|
2557
|
-
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span> 
|
|
2558
|
-
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span> 
|
|
2559
|
-
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span> 
|
|
2560
|
-
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span> 
|
|
2561
|
-
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span> 
|
|
2562
|
-
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span> 
|
|
2563
|
-
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span> 
|
|
2564
|
-
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span> 
|
|
2565
|
-
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span> 
|
|
2566
|
-
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span> 
|
|
2567
|
-
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span> 
|
|
2568
|
-
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span> 
|
|
2569
|
-
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  </div>
|
|
2570
|
-
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span> 
|
|
2571
|
-
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span> 
|
|
2572
|
-
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span> 
|
|
2573
|
-
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span> 
|
|
2574
|
-
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span> 
|
|
2575
|
-
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span> 
|
|
2576
|
-
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span> 
|
|
2577
|
-
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span> 
|
|
2578
|
-
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span> 
|
|
2579
|
-
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  </div>
|
|
2580
|
-
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span> 
|
|
2581
|
-
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span> 
|
|
2582
|
-
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span> 
|
|
2583
|
-
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span> 
|
|
2522
|
+
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <span class="comment">// Side-effects similar to void *memcpy(void *dest, const void * src, size_t n)</span></div>
|
|
2523
|
+
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  <span class="comment">// which copies n characters from memory area 'src' to memory area 'dest'.</span></div>
|
|
2524
|
+
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="keywordflow">if</span>(svfCallee-><a class="code" href="classSVF_1_1SVFValue.html#a2401b022638769f59f86ab424a189b6e">getName</a>().find(<span class="stringliteral">"iconv"</span>) != std::string::npos)</div>
|
|
2525
|
+
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad0e9f1dd1cba235a699c2b710a888d06">addComplexConsForExt</a>(cs->getArgOperand(3), cs->getArgOperand(1), <span class="keyword">nullptr</span>);</div>
|
|
2526
|
+
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(svfCallee-><a class="code" href="classSVF_1_1SVFValue.html#a2401b022638769f59f86ab424a189b6e">getName</a>().find(<span class="stringliteral">"bcopy"</span>) != std::string::npos)</div>
|
|
2527
|
+
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad0e9f1dd1cba235a699c2b710a888d06">addComplexConsForExt</a>(cs->getArgOperand(1), cs->getArgOperand(0), cs->getArgOperand(2));</div>
|
|
2528
|
+
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  <span class="keywordflow">if</span>(svfCall-><a class="code" href="classSVF_1_1SVFCallInst.html#a496d0e963f0f6a4f9c08183fa91792b0">arg_size</a>() == 3)</div>
|
|
2529
|
+
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad0e9f1dd1cba235a699c2b710a888d06">addComplexConsForExt</a>(cs->getArgOperand(0), cs->getArgOperand(1), cs->getArgOperand(2));</div>
|
|
2530
|
+
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  <span class="keywordflow">else</span></div>
|
|
2531
|
+
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad0e9f1dd1cba235a699c2b710a888d06">addComplexConsForExt</a>(cs->getArgOperand(0), cs->getArgOperand(1), <span class="keyword">nullptr</span>);</div>
|
|
2532
|
+
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  <span class="keywordflow">if</span>(SVFUtil::isa<PointerType>(cs->getType()))</div>
|
|
2533
|
+
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a140defeb309d895394822f8780deda16">addCopyEdge</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(cs->getArgOperand(0)), <a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(cs));</div>
|
|
2534
|
+
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  }</div>
|
|
2535
|
+
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a54098ea73555caa682287f8e3c9e8fcb">isMemsetExtFun</a>(svfCallee))</div>
|
|
2536
|
+
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  {</div>
|
|
2537
|
+
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <span class="comment">// Side-effects similar to memset(void *str, int c, size_t n)</span></div>
|
|
2538
|
+
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <span class="comment">// which copies the character c (an unsigned char) to the first n characters of the string pointed to, by the argument str</span></div>
|
|
2539
|
+
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  std::vector<AccessPath> dstFields;</div>
|
|
2540
|
+
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *dtype = <a class="code" href="classSVF_1_1SVFIRBuilder.html#aa7e7b3dba00201972783f93c35cadad9">getBaseTypeAndFlattenedFields</a>(cs->getArgOperand(0), dstFields, cs->getArgOperand(2));</div>
|
|
2541
|
+
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> sz = dstFields.size();</div>
|
|
2542
|
+
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  <span class="comment">//For each field (i), add store edge *(arg0 + i) = arg1</span></div>
|
|
2543
|
+
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = 0; <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < sz; <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>++)</div>
|
|
2544
|
+
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  {</div>
|
|
2545
|
+
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html">LLVMModuleSet</a>* llvmmodule = <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>();</div>
|
|
2546
|
+
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* dElementType = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#a9f7c24325d897b598d6b989fdc4aae1e">getSymbolInfo</a>()-><a class="code" href="classSVF_1_1SymbolTableInfo.html#a806ae865d29c4b05b69c499284758c6f">getFlatternedElemType</a>(llvmmodule-><a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(dtype), dstFields[<a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].getConstantFieldIdx());</div>
|
|
2547
|
+
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dField = <a class="code" href="classSVF_1_1SVFIRBuilder.html#ae4516ec05eabece1bc8e0cad1ec8cf1c">getGepValVar</a>(cs->getArgOperand(0), dstFields[<a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>], dElementType);</div>
|
|
2548
|
+
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a30f043eeca79259d84b97e265110f018">addStoreEdge</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(cs->getArgOperand(1)),dField);</div>
|
|
2549
|
+
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  }</div>
|
|
2550
|
+
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keywordflow">if</span>(SVFUtil::isa<PointerType>(cs->getType()))</div>
|
|
2551
|
+
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a140defeb309d895394822f8780deda16">addCopyEdge</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(cs->getArgOperand(0)), <a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(cs));</div>
|
|
2552
|
+
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  }</div>
|
|
2553
|
+
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(svfCallee-><a class="code" href="classSVF_1_1SVFValue.html#a2401b022638769f59f86ab424a189b6e">getName</a>().compare(<span class="stringliteral">"dlsym"</span>) == 0)</div>
|
|
2554
|
+
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  {</div>
|
|
2555
|
+
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  <span class="comment">/*</span></div>
|
|
2556
|
+
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span> <span class="comment"> Side-effects of void* dlsym( void* handle, const char* funName),</span></div>
|
|
2557
|
+
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span> <span class="comment"> Locate the function with the name "funName," then add a "copy" edge between the callsite and that function.</span></div>
|
|
2558
|
+
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span> <span class="comment"> dlsym() example:</span></div>
|
|
2559
|
+
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span> <span class="comment"> int main() {</span></div>
|
|
2560
|
+
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span> <span class="comment"> // Open the shared library</span></div>
|
|
2561
|
+
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span> <span class="comment"> void* handle = dlopen("./my_shared_library.so", RTLD_LAZY);</span></div>
|
|
2562
|
+
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span> <span class="comment"> // Find the function address</span></div>
|
|
2563
|
+
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span> <span class="comment"> void (*myFunctionPtr)() = (void (*)())dlsym(handle, "myFunction");</span></div>
|
|
2564
|
+
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span> <span class="comment"> // Call the function</span></div>
|
|
2565
|
+
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span> <span class="comment"> myFunctionPtr();</span></div>
|
|
2566
|
+
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span> <span class="comment"> }</span></div>
|
|
2567
|
+
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span> <span class="comment"> */</span></div>
|
|
2568
|
+
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* src = cs->getArgOperand(1);</div>
|
|
2569
|
+
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ac4e93e1fec646ff222940a663843921b">GetElementPtrInst</a>* gep = SVFUtil::dyn_cast<GetElementPtrInst>(src))</div>
|
|
2570
|
+
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  src = <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a07bd47ccfd02c5a2a6db26b537b2184f">stripConstantCasts</a>(gep->getPointerOperand());</div>
|
|
2571
|
+
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  </div>
|
|
2572
|
+
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  <span class="keyword">auto</span> getHookFn = [](<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* src)-><span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>*</div>
|
|
2573
|
+
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  {</div>
|
|
2574
|
+
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <span class="keywordflow">if</span> (!SVFUtil::isa<GlobalVariable>(src))</div>
|
|
2575
|
+
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
2576
|
+
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  </div>
|
|
2577
|
+
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <span class="keyword">auto</span> *glob = SVFUtil::cast<GlobalVariable>(src);</div>
|
|
2578
|
+
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  <span class="keywordflow">if</span> (!glob->hasInitializer() || !SVFUtil::isa<ConstantDataArray>(glob->getInitializer()))</div>
|
|
2579
|
+
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
2580
|
+
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  </div>
|
|
2581
|
+
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  <span class="keyword">auto</span> *constarray = SVFUtil::cast<ConstantDataArray>(glob->getInitializer());</div>
|
|
2582
|
+
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  <span class="keywordflow">return</span> <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a76b0d0ac69c170838cfc8ee26f4518a0">LLVMUtil::getProgFunction</a>(constarray->getAsCString().str());</div>
|
|
2583
|
+
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  };</div>
|
|
2584
2584
|
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  </div>
|
|
2585
|
-
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  <span class="
|
|
2586
|
-
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span> 
|
|
2587
|
-
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  </div>
|
|
2588
|
-
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span> 
|
|
2589
|
-
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span> 
|
|
2590
|
-
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span> 
|
|
2591
|
-
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span> 
|
|
2592
|
-
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span> 
|
|
2593
|
-
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span> 
|
|
2594
|
-
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span> 
|
|
2595
|
-
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span> 
|
|
2596
|
-
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span> 
|
|
2597
|
-
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span> 
|
|
2598
|
-
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span> 
|
|
2599
|
-
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span> 
|
|
2600
|
-
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span> 
|
|
2601
|
-
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span> 
|
|
2602
|
-
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  </div>
|
|
2603
|
-
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span> 
|
|
2604
|
-
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span> 
|
|
2605
|
-
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="
|
|
2606
|
-
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span> 
|
|
2607
|
-
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span> 
|
|
2608
|
-
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <span class="
|
|
2609
|
-
<div class="line"><a name="
|
|
2610
|
-
<div class="line"><a name="
|
|
2611
|
-
<div class="line"><a name="
|
|
2612
|
-
<div class="line"><a name="
|
|
2613
|
-
<div class="line"><a name="
|
|
2614
|
-
<div class="line"><a name="
|
|
2615
|
-
<div class="line"><a name="
|
|
2616
|
-
<div class="line"><a name="
|
|
2617
|
-
<div class="line"><a name="
|
|
2618
|
-
<div class="line"><a name="
|
|
2619
|
-
<div class="line"><a name="
|
|
2620
|
-
<div class="line"><a name="
|
|
2621
|
-
<div class="line"><a name="
|
|
2622
|
-
<div class="line"><a name="
|
|
2623
|
-
<div class="line"><a name="
|
|
2624
|
-
<div class="line"><a name="
|
|
2625
|
-
<div class="line"><a name="
|
|
2626
|
-
<div class="line"><a name="
|
|
2627
|
-
<div class="line"><a name="
|
|
2628
|
-
<div class="line"><a name="
|
|
2629
|
-
<div class="line"><a name="
|
|
2630
|
-
<div class="line"><a name="
|
|
2631
|
-
<div class="line"><a name="
|
|
2632
|
-
<div class="line"><a name="
|
|
2633
|
-
<div class="line"><a name="
|
|
2634
|
-
<div class="line"><a name="
|
|
2635
|
-
<div class="line"><a name="
|
|
2636
|
-
<div class="line"><a name="
|
|
2637
|
-
<div class="line"><a name="
|
|
2638
|
-
<div class="line"><a name="
|
|
2639
|
-
<div class="line"><a name="
|
|
2640
|
-
<div class="line"><a name="
|
|
2641
|
-
<div class="line"><a name="
|
|
2642
|
-
<div class="line"><a name="
|
|
2643
|
-
<div class="line"><a name="
|
|
2644
|
-
<div class="line"><a name="
|
|
2645
|
-
<div class="line"><a name="
|
|
2585
|
+
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *fn = getHookFn(src))</div>
|
|
2586
|
+
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  {</div>
|
|
2587
|
+
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcNode = <a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(fn);</div>
|
|
2588
|
+
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a140defeb309d895394822f8780deda16">addCopyEdge</a>(srcNode, <a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(cs));</div>
|
|
2589
|
+
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  }</div>
|
|
2590
|
+
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  }</div>
|
|
2591
|
+
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(svfCallee-><a class="code" href="classSVF_1_1SVFValue.html#a2401b022638769f59f86ab424a189b6e">getName</a>().find(<span class="stringliteral">"_ZSt29_Rb_tree_insert_and_rebalancebPSt18_Rb_tree_node_baseS0_RS_"</span>) != std::string::npos)</div>
|
|
2592
|
+
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  {</div>
|
|
2593
|
+
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  <span class="comment">// The purpose of this function is to insert a new node into the red-black tree and then rebalance the tree to ensure that the red-black tree properties are maintained.</span></div>
|
|
2594
|
+
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  assert(svfCall-><a class="code" href="classSVF_1_1SVFCallInst.html#a496d0e963f0f6a4f9c08183fa91792b0">arg_size</a>() == 4 && <span class="stringliteral">"_Rb_tree_insert_and_rebalance should have 4 arguments.\n"</span>);</div>
|
|
2595
|
+
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  </div>
|
|
2596
|
+
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  <span class="comment">// We have vArg3 points to the entry of _Rb_tree_node_base { color; parent; left; right; }.</span></div>
|
|
2597
|
+
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <span class="comment">// Now we calculate the offset from base to vArg3</span></div>
|
|
2598
|
+
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnArg3 = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#a43514023a4f4d0c32f536f51443b0efc">getValueNode</a>(svfCall-><a class="code" href="classSVF_1_1SVFCallInst.html#a3cbb4b4089c8b27d01da15f2d2f22e14">getArgOperand</a>(3));</div>
|
|
2599
|
+
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  <a class="code" href="namespaceSVF.html#a5c4820681ef340339ddded756eb82ae1">APOffset</a> <a class="code" href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a> = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a7c401d6929e583be734c0c4e9957d0d7">getAccessPathFromBaseNode</a>(vnArg3).<a class="code" href="classSVF_1_1AccessPath.html#a68e49bb797a84ea035ea338549f2e054">getConstantFieldIdx</a>();</div>
|
|
2600
|
+
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  </div>
|
|
2601
|
+
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  <span class="comment">// We get all flattened fields of base</span></div>
|
|
2602
|
+
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  vector<AccessPath> fields = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#adb6db6407bdc9a39e5bf8cd941f0ad15">getTypeLocSetsMap</a>(vnArg3).second;</div>
|
|
2603
|
+
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  </div>
|
|
2604
|
+
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <span class="comment">// We summarize the side effects: arg3->parent = arg1, arg3->left = arg1, arg3->right = arg1</span></div>
|
|
2605
|
+
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="comment">// Note that arg0 is aligned with "offset".</span></div>
|
|
2606
|
+
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a5c4820681ef340339ddded756eb82ae1">APOffset</a> i = <a class="code" href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a> + 1; i <= <a class="code" href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a> + 3; ++i)</div>
|
|
2607
|
+
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  {</div>
|
|
2608
|
+
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <span class="keywordflow">if</span>((<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a>)i >= fields.size())</div>
|
|
2609
|
+
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordflow">break</span>;</div>
|
|
2610
|
+
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* elementType = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#a9f7c24325d897b598d6b989fdc4aae1e">getSymbolInfo</a>()-><a class="code" href="classSVF_1_1SymbolTableInfo.html#a806ae865d29c4b05b69c499284758c6f">getFlatternedElemType</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#adb6db6407bdc9a39e5bf8cd941f0ad15">getTypeLocSetsMap</a>(vnArg3).first,</div>
|
|
2611
|
+
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  fields[i].getConstantFieldIdx());</div>
|
|
2612
|
+
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnD = <a class="code" href="classSVF_1_1SVFIRBuilder.html#ae4516ec05eabece1bc8e0cad1ec8cf1c">getGepValVar</a>(cs->getArgOperand(3), fields[i], elementType);</div>
|
|
2613
|
+
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnS = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#a43514023a4f4d0c32f536f51443b0efc">getValueNode</a>(svfCall-><a class="code" href="classSVF_1_1SVFCallInst.html#a3cbb4b4089c8b27d01da15f2d2f22e14">getArgOperand</a>(1));</div>
|
|
2614
|
+
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  <span class="keywordflow">if</span>(vnD && vnS)</div>
|
|
2615
|
+
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a30f043eeca79259d84b97e265110f018">addStoreEdge</a>(vnS,vnD);</div>
|
|
2616
|
+
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  }</div>
|
|
2617
|
+
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  }</div>
|
|
2618
|
+
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  </div>
|
|
2619
|
+
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a5c2abeb363081381c3dc939ab511e3f0">isThreadForkCall</a>(svfInst))</div>
|
|
2620
|
+
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  {</div>
|
|
2621
|
+
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* forkedFun = SVFUtil::dyn_cast<SVFFunction>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a2790c5289dad1d6e80f7597a2ea458ab">getForkedFun</a>(svfInst)))</div>
|
|
2622
|
+
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  {</div>
|
|
2623
|
+
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  forkedFun = forkedFun->getDefFunForMultipleModule();</div>
|
|
2624
|
+
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a>* actualParm = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8c64663b564eb7c399013389920ab500">getActualParmAtForkSite</a>(svfInst);</div>
|
|
2625
|
+
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  assert((forkedFun->arg_size() <= 2) && <span class="stringliteral">"Size of formal parameter of start routine should be one"</span>);</div>
|
|
2626
|
+
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keywordflow">if</span> (forkedFun->arg_size() <= 2 && forkedFun->arg_size() >= 1)</div>
|
|
2627
|
+
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  {</div>
|
|
2628
|
+
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFArgument.html">SVFArgument</a>* formalParm = forkedFun->getArg(0);</div>
|
|
2629
|
+
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  <span class="keywordflow">if</span> (actualParm-><a class="code" href="classSVF_1_1SVFValue.html#a11f2d9b6e969ede6fca2c204cc15b821">getType</a>()-><a class="code" href="classSVF_1_1SVFType.html#a870b63af2bf9fe43cdf1df3d56b20f6c">isPointerTy</a>() && formalParm-><a class="code" href="classSVF_1_1SVFValue.html#a11f2d9b6e969ede6fca2c204cc15b821">getType</a>()-><a class="code" href="classSVF_1_1SVFType.html#a870b63af2bf9fe43cdf1df3d56b20f6c">isPointerTy</a>())</div>
|
|
2630
|
+
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  {</div>
|
|
2631
|
+
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a> *icfgNode = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#abda052b73e869ed6d7c139ad1528da11">getICFG</a>()-><a class="code" href="classSVF_1_1ICFG.html#aa41516cdd2be5066adf22798a4fe2213">getCallICFGNode</a>(svfInst);</div>
|
|
2632
|
+
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <a class="code" href="classSVF_1_1FunEntryICFGNode.html">FunEntryICFGNode</a> *entry = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#abda052b73e869ed6d7c139ad1528da11">getICFG</a>()-><a class="code" href="classSVF_1_1ICFG.html#a0dca4655c2f6112a5be1f921b8e81076">getFunEntryICFGNode</a>(forkedFun);</div>
|
|
2633
|
+
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a54636413fd3ed7e634ac7428139966a4">addThreadForkEdge</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#a43514023a4f4d0c32f536f51443b0efc">getValueNode</a>(actualParm), <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#a43514023a4f4d0c32f536f51443b0efc">getValueNode</a>(formalParm), icfgNode, entry);</div>
|
|
2634
|
+
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  }</div>
|
|
2635
|
+
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  }</div>
|
|
2636
|
+
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  }</div>
|
|
2637
|
+
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <span class="keywordflow">else</span></div>
|
|
2638
|
+
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  {</div>
|
|
2639
|
+
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  }</div>
|
|
2640
|
+
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  }</div>
|
|
2641
|
+
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  </div>
|
|
2642
|
+
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a28fbb7cc51eb7e25d88f43e3eb1f30fb">isHareParForCall</a>(svfInst))</div>
|
|
2643
|
+
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  {</div>
|
|
2644
|
+
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* taskFunc = SVFUtil::dyn_cast<SVFFunction>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a5cee46f58bdab3f9b1c698e97290152f">getTaskFuncAtHareParForSite</a>(svfInst)))</div>
|
|
2645
|
+
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  {</div>
|
|
2646
|
+
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  assert((taskFunc->arg_size() == 3) && <span class="stringliteral">"Size of formal parameter of hare_parallel_for's task routine should be 3"</span>);</div>
|
|
2647
|
+
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a>* actualParm = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a2f74db48793a0db76c000ffecf9e1bd2">getTaskDataAtHareParForSite</a>(svfInst);</div>
|
|
2648
|
+
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFArgument.html">SVFArgument</a>* formalParm = taskFunc->getArg(0);</div>
|
|
2649
|
+
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  <span class="keywordflow">if</span> (actualParm-><a class="code" href="classSVF_1_1SVFValue.html#a11f2d9b6e969ede6fca2c204cc15b821">getType</a>()-><a class="code" href="classSVF_1_1SVFType.html#a870b63af2bf9fe43cdf1df3d56b20f6c">isPointerTy</a>() && formalParm-><a class="code" href="classSVF_1_1SVFValue.html#a11f2d9b6e969ede6fca2c204cc15b821">getType</a>()-><a class="code" href="classSVF_1_1SVFType.html#a870b63af2bf9fe43cdf1df3d56b20f6c">isPointerTy</a>())</div>
|
|
2650
|
+
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  {</div>
|
|
2651
|
+
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a> *icfgNode = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#abda052b73e869ed6d7c139ad1528da11">getICFG</a>()-><a class="code" href="classSVF_1_1ICFG.html#aa41516cdd2be5066adf22798a4fe2213">getCallICFGNode</a>(svfInst);</div>
|
|
2652
|
+
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  <a class="code" href="classSVF_1_1FunEntryICFGNode.html">FunEntryICFGNode</a> *entry = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#abda052b73e869ed6d7c139ad1528da11">getICFG</a>()-><a class="code" href="classSVF_1_1ICFG.html#a0dca4655c2f6112a5be1f921b8e81076">getFunEntryICFGNode</a>(taskFunc);</div>
|
|
2653
|
+
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a54636413fd3ed7e634ac7428139966a4">addThreadForkEdge</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#a43514023a4f4d0c32f536f51443b0efc">getValueNode</a>(actualParm), <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#a43514023a4f4d0c32f536f51443b0efc">getValueNode</a>(formalParm), icfgNode, entry);</div>
|
|
2654
|
+
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  }</div>
|
|
2655
|
+
<div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  }</div>
|
|
2656
|
+
<div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  <span class="keywordflow">else</span></div>
|
|
2657
|
+
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  {</div>
|
|
2658
|
+
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  }</div>
|
|
2659
|
+
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  }</div>
|
|
2660
|
+
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  </div>
|
|
2661
|
+
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span> }</div>
|
|
2646
2662
|
</div><!-- fragment -->
|
|
2647
2663
|
</div>
|
|
2648
2664
|
</div>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "svf-tools",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.768",
|
|
4
4
|
"description": "* <b>[TypeClone](https://github.com/SVF-tools/SVF/wiki/TypeClone) published in our [ECOOP paper](https://yuleisui.github.io/publications/ecoop20.pdf) is now available in SVF </b> * <b>SVF now uses a single script for its build. Just type [`source ./build.sh`](https://github.com/SVF-tools/SVF/blob/master/build.sh) in your terminal, that's it!</b> * <b>SVF now supports LLVM-10.0.0! </b> * <b>We thank [bsauce](https://github.com/bsauce) for writing a user manual of SVF ([link1](https://www.jianshu.com/p/068a08ec749c) and [link2](https://www.jianshu.com/p/777c30d4240e)) in Chinese </b> * <b>SVF now supports LLVM-9.0.0 (Thank [Byoungyoung Lee](https://github.com/SVF-tools/SVF/issues/142) for his help!). </b> * <b>SVF now supports a set of [field-sensitive pointer analyses](https://yuleisui.github.io/publications/sas2019a.pdf). </b> * <b>[Use SVF as an external lib](https://github.com/SVF-tools/SVF/wiki/Using-SVF-as-a-lib-in-your-own-tool) for your own project (Contributed by [Hongxu Chen](https://github.com/HongxuChen)). </b> * <b>SVF now supports LLVM-7.0.0. </b> * <b>SVF now supports Docker. [Try SVF in Docker](https://github.com/SVF-tools/SVF/wiki/Try-SVF-in-Docker)! </b> * <b>SVF now supports [LLVM-6.0.0](https://github.com/svf-tools/SVF/pull/38) (Contributed by [Jack Anthony](https://github.com/jackanth)). </b> * <b>SVF now supports [LLVM-4.0.0](https://github.com/svf-tools/SVF/pull/23) (Contributed by Jared Carlson. Thank [Jared](https://github.com/jcarlson23) and [Will](https://github.com/dtzWill) for their in-depth [discussions](https://github.com/svf-tools/SVF/pull/18) about updating SVF!) </b> * <b>SVF now supports analysis for C++ programs.</b> <br />",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -156,6 +156,8 @@ void SVFIRBuilder::handleExtCall(const CallBase* cs, const SVFFunction* svfCalle
|
|
|
156
156
|
}
|
|
157
157
|
else if (isMemcpyExtFun(svfCallee))
|
|
158
158
|
{
|
|
159
|
+
// Side-effects similar to void *memcpy(void *dest, const void * src, size_t n)
|
|
160
|
+
// which copies n characters from memory area 'src' to memory area 'dest'.
|
|
159
161
|
if(svfCallee->getName().find("iconv") != std::string::npos)
|
|
160
162
|
addComplexConsForExt(cs->getArgOperand(3), cs->getArgOperand(1), nullptr);
|
|
161
163
|
else if(svfCallee->getName().find("bcopy") != std::string::npos)
|
|
@@ -169,7 +171,7 @@ void SVFIRBuilder::handleExtCall(const CallBase* cs, const SVFFunction* svfCalle
|
|
|
169
171
|
}
|
|
170
172
|
else if(isMemsetExtFun(svfCallee))
|
|
171
173
|
{
|
|
172
|
-
//
|
|
174
|
+
// Side-effects similar to memset(void *str, int c, size_t n)
|
|
173
175
|
// which copies the character c (an unsigned char) to the first n characters of the string pointed to, by the argument str
|
|
174
176
|
std::vector<AccessPath> dstFields;
|
|
175
177
|
const Type *dtype = getBaseTypeAndFlattenedFields(cs->getArgOperand(0), dstFields, cs->getArgOperand(2));
|
|
@@ -187,6 +189,19 @@ void SVFIRBuilder::handleExtCall(const CallBase* cs, const SVFFunction* svfCalle
|
|
|
187
189
|
}
|
|
188
190
|
else if(svfCallee->getName().compare("dlsym") == 0)
|
|
189
191
|
{
|
|
192
|
+
/*
|
|
193
|
+
Side-effects of void* dlsym( void* handle, const char* funName),
|
|
194
|
+
Locate the function with the name "funName," then add a "copy" edge between the callsite and that function.
|
|
195
|
+
dlsym() example:
|
|
196
|
+
int main() {
|
|
197
|
+
// Open the shared library
|
|
198
|
+
void* handle = dlopen("./my_shared_library.so", RTLD_LAZY);
|
|
199
|
+
// Find the function address
|
|
200
|
+
void (*myFunctionPtr)() = (void (*)())dlsym(handle, "myFunction");
|
|
201
|
+
// Call the function
|
|
202
|
+
myFunctionPtr();
|
|
203
|
+
}
|
|
204
|
+
*/
|
|
190
205
|
const Value* src = cs->getArgOperand(1);
|
|
191
206
|
if(const GetElementPtrInst* gep = SVFUtil::dyn_cast<GetElementPtrInst>(src))
|
|
192
207
|
src = stripConstantCasts(gep->getPointerOperand());
|
|
@@ -212,6 +227,7 @@ void SVFIRBuilder::handleExtCall(const CallBase* cs, const SVFFunction* svfCalle
|
|
|
212
227
|
}
|
|
213
228
|
else if(svfCallee->getName().find("_ZSt29_Rb_tree_insert_and_rebalancebPSt18_Rb_tree_node_baseS0_RS_") != std::string::npos)
|
|
214
229
|
{
|
|
230
|
+
// The purpose of this function is to insert a new node into the red-black tree and then rebalance the tree to ensure that the red-black tree properties are maintained.
|
|
215
231
|
assert(svfCall->arg_size() == 4 && "_Rb_tree_insert_and_rebalance should have 4 arguments.\n");
|
|
216
232
|
|
|
217
233
|
// We have vArg3 points to the entry of _Rb_tree_node_base { color; parent; left; right; }.
|