[cfe-commits] r73946 - in /cfe/trunk: include/clang/Analysis/PathSensitive/ValueManager.h lib/Analysis/RegionStore.cpp lib/Analysis/SVals.cpp

Ted Kremenek kremenek at apple.com
Tue Jun 23 11:30:27 PDT 2009


Hi Zhongxing,

Is this approach going to scale?  For even moderate sized arrays this  
seems like it is going to result in a bunch of excess storage.  For  
large arrays this might not scale at all.  Was there some particular  
motivation behind this change?

Ted

On Jun 22, 2009, at 10:23 PM, Zhongxing Xu wrote:

> Author: zhongxingxu
> Date: Tue Jun 23 00:23:38 2009
> New Revision: 73946
>
> URL: http://llvm.org/viewvc/llvm-project?rev=73946&view=rev
> Log:
> Instead of setting the default value of the array region, bind the  
> rest of the
> array elements to 0 explicitly. Create 0 values with the element type.
>
> Modified:
>    cfe/trunk/include/clang/Analysis/PathSensitive/ValueManager.h
>    cfe/trunk/lib/Analysis/RegionStore.cpp
>    cfe/trunk/lib/Analysis/SVals.cpp
>
> Modified: cfe/trunk/include/clang/Analysis/PathSensitive/ 
> ValueManager.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/ValueManager.h?rev=73946&r1=73945&r2=73946&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/include/clang/Analysis/PathSensitive/ValueManager.h  
> (original)
> +++ cfe/trunk/include/clang/Analysis/PathSensitive/ValueManager.h  
> Tue Jun 23 00:23:38 2009
> @@ -89,6 +89,8 @@
>   SVal getFunctionPointer(const FunctionDecl* FD);
>
>   NonLoc makeNonLoc(SymbolRef sym);
> +
> +  NonLoc makeNonLoc(const llvm::APSInt& V);
>
>   NonLoc makeNonLoc(const SymExpr *lhs, BinaryOperator::Opcode op,
>                     const llvm::APSInt& rhs, QualType T);
>
> Modified: cfe/trunk/lib/Analysis/RegionStore.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/RegionStore.cpp?rev=73946&r1=73945&r2=73946&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Analysis/RegionStore.cpp (original)
> +++ cfe/trunk/lib/Analysis/RegionStore.cpp Tue Jun 23 00:23:38 2009
> @@ -1079,17 +1079,11 @@
>                                              SVal Init) {
>
>   QualType T = R->getValueType(getContext());
> -  assert(T->isArrayType());
> -
> -  // When we are binding the whole array, it always has default  
> value 0.
> -  state = state->set<RegionDefaultValue>(R, NonLoc::MakeIntVal 
> (getBasicVals(),
> -                                                               0,  
> false));
> -
>   ConstantArrayType* CAT = cast<ConstantArrayType>(T.getTypePtr());
> +  QualType ElementTy = CAT->getElementType();
>
>   llvm::APSInt Size(CAT->getSize(), false);
> -  llvm::APSInt i = getBasicVals().getValue(0, Size.getBitWidth(),
> -                                           Size.isUnsigned());
> +  llvm::APSInt i(llvm::APInt::getNullValue(Size.getBitWidth()),  
> false);
>
>   // Check if the init expr is a StringLiteral.
>   if (isa<loc::MemRegionVal>(Init)) {
> @@ -1106,10 +1100,8 @@
>       if (j >= len)
>         break;
>
> -      SVal Idx = NonLoc::MakeVal(getBasicVals(), i);
> -      ElementRegion* ER =
> -        MRMgr.getElementRegion(cast<ArrayType>(T)->getElementType(),
> -                               Idx, R, getContext());
> +      SVal Idx = ValMgr.makeNonLoc(i);
> +      ElementRegion* ER = MRMgr.getElementRegion(ElementTy,  
> Idx,R,getContext());
>
>       SVal V = NonLoc::MakeVal(getBasicVals(), str[j], sizeof(char) 
> *8, true);
>       state = Bind(state, loc::MemRegionVal(ER), V);
> @@ -1122,14 +1114,12 @@
>   nonloc::CompoundVal::iterator VI = CV.begin(), VE = CV.end();
>
>   for (; i < Size; ++i, ++VI) {
> -    // The init list might be shorter than the array decl.
> +    // The init list might be shorter than the array length.
>     if (VI == VE)
>       break;
>
> -    SVal Idx = NonLoc::MakeVal(getBasicVals(), i);
> -    ElementRegion* ER =
> -      MRMgr.getElementRegion(cast<ArrayType>(T)->getElementType(),
> -                             Idx, R, getContext());
> +    SVal Idx = ValMgr.makeNonLoc(i);
> +    ElementRegion* ER = MRMgr.getElementRegion(ElementTy, Idx, R,  
> getContext());
>
>     if (CAT->getElementType()->isStructureType())
>       state = BindStruct(state, ER, *VI);
> @@ -1137,6 +1127,18 @@
>       state = Bind(state, Loc::MakeVal(ER), *VI);
>   }
>
> +  // If the init list is shorter than the array length, bind the  
> rest elements
> +  // to 0.
> +  if (ElementTy->isIntegerType()) {
> +    while (i < Size) {
> +      SVal Idx = ValMgr.makeNonLoc(i);
> +      ElementRegion* ER = MRMgr.getElementRegion(ElementTy,  
> Idx,R,getContext());
> +      SVal V = ValMgr.makeZeroVal(ElementTy);
> +      state = Bind(state, Loc::MakeVal(ER), V);
> +      ++i;
> +    }
> +  }
> +
>   return state;
> }
>
>
> Modified: cfe/trunk/lib/Analysis/SVals.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/SVals.cpp?rev=73946&r1=73945&r2=73946&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Analysis/SVals.cpp (original)
> +++ cfe/trunk/lib/Analysis/SVals.cpp Tue Jun 23 00:23:38 2009
> @@ -264,6 +264,10 @@
>   return nonloc::SymbolVal(sym);
> }
>
> +NonLoc ValueManager::makeNonLoc(const APSInt& V) {
> +  return nonloc::ConcreteInt(BasicVals.getValue(V));
> +}
> +
> NonLoc ValueManager::makeNonLoc(const SymExpr *lhs,  
> BinaryOperator::Opcode op,
>                                 const APSInt& v, QualType T) {
>   // The Environment ensures we always get a persistent APSInt in
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list