svf-tools 1.0.717 → 1.0.718
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "svf-tools",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.718",
|
|
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": {
|
|
@@ -388,8 +388,6 @@ public:
|
|
|
388
388
|
|
|
389
389
|
/// Resolve indirect call edges
|
|
390
390
|
virtual void resolveIndCalls(const CallICFGNode* cs, const PointsTo& target, CallEdgeMap& newEdges);
|
|
391
|
-
/// Match arguments for callsite at caller and callee
|
|
392
|
-
bool matchArgs(const CallICFGNode* cs, const SVFFunction* callee);
|
|
393
391
|
|
|
394
392
|
/// CallGraph SCC related methods
|
|
395
393
|
//@{
|
|
@@ -200,6 +200,11 @@ inline CallSite getSVFCallSite(const SVFInstruction* inst)
|
|
|
200
200
|
return cs;
|
|
201
201
|
}
|
|
202
202
|
|
|
203
|
+
/// Match arguments for callsite at caller and callee
|
|
204
|
+
/// if the arg size does not match then we do not need to connect this parameter
|
|
205
|
+
/// unless the callee is a variadic function (the first parameter of variadic function is its paramter number)
|
|
206
|
+
bool matchArgs(const SVFInstruction* cs, const SVFFunction* callee);
|
|
207
|
+
|
|
203
208
|
/// Return LLVM callsite given a value
|
|
204
209
|
inline CallSite getSVFCallSite(const SVFValue* value)
|
|
205
210
|
{
|
package/svf/lib/Graphs/VFG.cpp
CHANGED
|
@@ -976,7 +976,8 @@ void VFG::connectCallerAndCallee(const CallICFGNode* callBlockNode, const SVFFun
|
|
|
976
976
|
CallSiteID csId = getCallSiteID(callBlockNode, callee);
|
|
977
977
|
RetICFGNode* retBlockNode = icfg->getRetICFGNode(callBlockNode->getCallSite());
|
|
978
978
|
// connect actual and formal param
|
|
979
|
-
if (pag->hasCallSiteArgsMap(callBlockNode) && pag->hasFunArgsList(callee)
|
|
979
|
+
if (pag->hasCallSiteArgsMap(callBlockNode) && pag->hasFunArgsList(callee) &&
|
|
980
|
+
matchArgs(callBlockNode->getCallSite(), callee))
|
|
980
981
|
{
|
|
981
982
|
const SVFIR::SVFVarList& csArgList = pag->getCallSiteArgsList(callBlockNode);
|
|
982
983
|
const SVFIR::SVFVarList& funArgList = pag->getFunArgsList(callee);
|
|
@@ -990,6 +991,7 @@ void VFG::connectCallerAndCallee(const CallICFGNode* callBlockNode, const SVFFun
|
|
|
990
991
|
connectAParamAndFParam(cs_arg, fun_arg, callBlockNode, csId, edges);
|
|
991
992
|
}
|
|
992
993
|
assert(funArgIt == funArgEit && "function has more arguments than call site");
|
|
994
|
+
|
|
993
995
|
if (callee->isVarArg())
|
|
994
996
|
{
|
|
995
997
|
NodeID varFunArg = pag->getVarargNode(callee);
|
|
@@ -408,9 +408,7 @@ void PointerAnalysis::resolveIndCalls(const CallICFGNode* cs, const PointsTo& ta
|
|
|
408
408
|
const SVFFunction* calleefun = SVFUtil::cast<SVFFunction>(obj->getValue());
|
|
409
409
|
const SVFFunction* callee = calleefun->getDefFunForMultipleModule();
|
|
410
410
|
|
|
411
|
-
|
|
412
|
-
/// unless the callee is a variadic function (the first parameter of variadic function is its paramter number)
|
|
413
|
-
if(matchArgs(cs, callee) == false)
|
|
411
|
+
if(SVFUtil::matchArgs(cs->getCallSite(), callee) == false)
|
|
414
412
|
continue;
|
|
415
413
|
|
|
416
414
|
if(0 == getIndCallMap()[cs].count(callee))
|
|
@@ -429,17 +427,6 @@ void PointerAnalysis::resolveIndCalls(const CallICFGNode* cs, const PointsTo& ta
|
|
|
429
427
|
}
|
|
430
428
|
}
|
|
431
429
|
|
|
432
|
-
/*!
|
|
433
|
-
* Match arguments for callsite at caller and callee
|
|
434
|
-
*/
|
|
435
|
-
bool PointerAnalysis::matchArgs(const CallICFGNode* cs, const SVFFunction* callee)
|
|
436
|
-
{
|
|
437
|
-
if(callee->isVarArg() || ThreadAPI::getThreadAPI()->isTDFork(cs->getCallSite()))
|
|
438
|
-
return true;
|
|
439
|
-
else
|
|
440
|
-
return SVFUtil::getSVFCallSite(cs->getCallSite()).arg_size() == callee->arg_size();
|
|
441
|
-
}
|
|
442
|
-
|
|
443
430
|
/*
|
|
444
431
|
* Get virtual functions "vfns" based on CHA
|
|
445
432
|
*/
|
package/svf/lib/Util/SVFUtil.cpp
CHANGED
|
@@ -311,3 +311,16 @@ void SVFUtil::stopAnalysisLimitTimer(bool limitTimerSet)
|
|
|
311
311
|
{
|
|
312
312
|
if (limitTimerSet) alarm(0);
|
|
313
313
|
}
|
|
314
|
+
|
|
315
|
+
/// Match arguments for callsite at caller and callee
|
|
316
|
+
/// if the arg size does not match then we do not need to connect this parameter
|
|
317
|
+
/// unless the callee is a variadic function (the first parameter of variadic function is its paramter number)
|
|
318
|
+
/// e.g., void variadicFoo(int num, ...); variadicFoo(5, 1,2,3,4,5)
|
|
319
|
+
/// for variadic function, callsite arg size must be greater than or equal to callee arg size
|
|
320
|
+
bool SVFUtil::matchArgs(const SVFInstruction* cs, const SVFFunction* callee)
|
|
321
|
+
{
|
|
322
|
+
if (callee->isVarArg() || ThreadAPI::getThreadAPI()->isTDFork(cs))
|
|
323
|
+
return getSVFCallSite(cs).arg_size() >= callee->arg_size();
|
|
324
|
+
else
|
|
325
|
+
return getSVFCallSite(cs).arg_size() == callee->arg_size();
|
|
326
|
+
}
|