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.717",
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
  {
@@ -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
- /// if the arg size does not match then we do not need to connect this parameter
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
  */
@@ -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
+ }