svf-tools 1.0.717 → 1.0.719

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.719",
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
  */
@@ -282,6 +282,13 @@ void SymbolTableInfo::printFlattenFields(const SVFType* type)
282
282
  outs() << "(Function)}\n\n";
283
283
  }
284
284
 
285
+ else if ( const SVFOtherType* ot= SVFUtil::dyn_cast<SVFOtherType> (type))
286
+ {
287
+ outs() << " {Type: ";
288
+ outs() << ot->toString();
289
+ outs() << "(SVFOtherType)}\n\n";
290
+ }
291
+
285
292
  else
286
293
  {
287
294
  assert(type->isSingleValueType() && "not a single value type, then what else!!");
@@ -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
+ }
@@ -151,6 +151,7 @@ void LLVMModuleSet::build()
151
151
 
152
152
  void LLVMModuleSet::createSVFDataStructure()
153
153
  {
154
+ getSVFType(IntegerType::getInt8Ty(getContext()));
154
155
 
155
156
  for (const Module& mod : modules)
156
157
  {
@@ -953,8 +954,7 @@ SVFType* LLVMModuleSet::getSVFType(const Type* T)
953
954
  /// [getPointerTo(): char ----> i8*]
954
955
  /// [getPointerTo(): int ----> i8*]
955
956
  /// [getPointerTo(): struct ----> i8*]
956
- PointerType* ptrTy =
957
- PointerType::getInt8PtrTy(getContext())->getPointerTo();
957
+ PointerType* ptrTy = PointerType::getInt8PtrTy(getContext());
958
958
  svfType->setPointerTo(SVFUtil::cast<SVFPointerType>(getSVFType(ptrTy)));
959
959
  return svfType;
960
960
  }