[cfe-commits] r95535 - in /cfe/trunk: include/clang/Checker/PathSensitive/Store.h lib/Checker/BasicStore.cpp lib/Checker/FlatStore.cpp lib/Checker/RegionStore.cpp lib/Checker/Store.cpp

Zhongxing Xu xuzhongxing at gmail.com
Mon Feb 8 16:46:46 PST 2010


I think we can make them non-virtual.

2010/2/9 Ted Kremenek <kremenek at apple.com>:
> Now that the MemRegion model has converged, this makes a lot of sense.  Should we make these methods non-virtual?
>
> On Feb 7, 2010, at 11:58 PM, Zhongxing Xu wrote:
>
>> Author: zhongxingxu
>> Date: Mon Feb  8 01:58:06 2010
>> New Revision: 95535
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=95535&view=rev
>> Log:
>> Unify the implementation of getLValueIvar and getLValueField of store managers.
>>
>> Modified:
>>    cfe/trunk/include/clang/Checker/PathSensitive/Store.h
>>    cfe/trunk/lib/Checker/BasicStore.cpp
>>    cfe/trunk/lib/Checker/FlatStore.cpp
>>    cfe/trunk/lib/Checker/RegionStore.cpp
>>    cfe/trunk/lib/Checker/Store.cpp
>>
>> Modified: cfe/trunk/include/clang/Checker/PathSensitive/Store.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Checker/PathSensitive/Store.h?rev=95535&r1=95534&r2=95535&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Checker/PathSensitive/Store.h (original)
>> +++ cfe/trunk/include/clang/Checker/PathSensitive/Store.h Mon Feb  8 01:58:06 2010
>> @@ -102,9 +102,13 @@
>>     return loc::MemRegionVal(MRMgr.getCompoundLiteralRegion(CL, LC));
>>   }
>>
>> -  virtual SVal getLValueIvar(const ObjCIvarDecl* decl, SVal base) = 0;
>> +  virtual SVal getLValueIvar(const ObjCIvarDecl* decl, SVal base) {
>> +    return getLValueFieldOrIvar(decl, base);
>> +  }
>>
>> -  virtual SVal getLValueField(const FieldDecl* D, SVal Base) = 0;
>> +  virtual SVal getLValueField(const FieldDecl* D, SVal Base) {
>> +    return getLValueFieldOrIvar(D, Base);
>> +  }
>>
>>   virtual SVal getLValueElement(QualType elementType, SVal offset, SVal Base)=0;
>>
>> @@ -195,6 +199,9 @@
>>   ///  as another region.
>>   SVal CastRetrievedVal(SVal val, const TypedRegion *R, QualType castTy,
>>                         bool performTestOnly = true);
>> +
>> +private:
>> +  SVal getLValueFieldOrIvar(const Decl* D, SVal Base);
>> };
>>
>> // FIXME: Do we still need this?
>>
>> Modified: cfe/trunk/lib/Checker/BasicStore.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Checker/BasicStore.cpp?rev=95535&r1=95534&r2=95535&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Checker/BasicStore.cpp (original)
>> +++ cfe/trunk/lib/Checker/BasicStore.cpp Mon Feb  8 01:58:06 2010
>> @@ -70,8 +70,6 @@
>>     return store;
>>   }
>>
>> -  SVal getLValueIvar(const ObjCIvarDecl* D, SVal Base);
>> -  SVal getLValueField(const FieldDecl *D, SVal Base);
>>   SVal getLValueElement(QualType elementType, SVal Offset, SVal Base);
>>
>>   /// ArrayToPointer - Used by GRExprEngine::VistCast to handle implicit
>> @@ -113,52 +111,6 @@
>>   return new BasicStoreManager(StMgr);
>> }
>>
>> -SVal BasicStoreManager::getLValueIvar(const ObjCIvarDecl* D, SVal Base) {
>> -
>> -  if (Base.isUnknownOrUndef())
>> -    return Base;
>> -
>> -  Loc BaseL = cast<Loc>(Base);
>> -
>> -  if (isa<loc::MemRegionVal>(BaseL)) {
>> -    const MemRegion *BaseR = cast<loc::MemRegionVal>(BaseL).getRegion();
>> -    return ValMgr.makeLoc(MRMgr.getObjCIvarRegion(D, BaseR));
>> -  }
>> -
>> -  return UnknownVal();
>> -}
>> -
>> -SVal BasicStoreManager::getLValueField(const FieldDecl* D, SVal Base) {
>> -
>> -  if (Base.isUnknownOrUndef())
>> -    return Base;
>> -
>> -  Loc BaseL = cast<Loc>(Base);
>> -  const MemRegion* BaseR = 0;
>> -
>> -  switch(BaseL.getSubKind()) {
>> -    case loc::GotoLabelKind:
>> -      return UndefinedVal();
>> -
>> -    case loc::MemRegionKind:
>> -      BaseR = cast<loc::MemRegionVal>(BaseL).getRegion();
>> -      break;
>> -
>> -    case loc::ConcreteIntKind:
>> -      // While these seem funny, this can happen through casts.
>> -      // FIXME: What we should return is the field offset.  For example,
>> -      //  add the field offset to the integer value.  That way funny things
>> -      //  like this work properly:  &(((struct foo *) 0xa)->f)
>> -      return Base;
>> -
>> -    default:
>> -      assert ("Unhandled Base.");
>> -      return Base;
>> -  }
>> -
>> -  return ValMgr.makeLoc(MRMgr.getFieldRegion(D, BaseR));
>> -}
>> -
>> SVal BasicStoreManager::getLValueElement(QualType elementType,
>>                                          SVal Offset, SVal Base) {
>>
>>
>> Modified: cfe/trunk/lib/Checker/FlatStore.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Checker/FlatStore.cpp?rev=95535&r1=95534&r2=95535&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Checker/FlatStore.cpp (original)
>> +++ cfe/trunk/lib/Checker/FlatStore.cpp Mon Feb  8 01:58:06 2010
>> @@ -42,13 +42,6 @@
>>     return 0;
>>   }
>>
>> -  SVal getLValueVar(const VarDecl *VD, const LocationContext *LC) {
>> -    return loc::MemRegionVal(MRMgr.getVarRegion(VD, LC));
>> -  }
>> -
>> -  SVal getLValueString(const StringLiteral* sl);
>> -  SVal getLValueIvar(const ObjCIvarDecl* decl, SVal base);
>> -  SVal getLValueField(const FieldDecl* D, SVal Base);
>>   SVal getLValueElement(QualType elementType, SVal offset, SVal Base);
>>   SVal ArrayToPointer(Loc Array);
>>   Store RemoveDeadBindings(Store store, Stmt* Loc, SymbolReaper& SymReaper,
>> @@ -133,18 +126,6 @@
>>   return store;
>> }
>>
>> -SVal FlatStoreManager::getLValueString(const StringLiteral* sl) {
>> -  return UnknownVal();
>> -}
>> -
>> -SVal FlatStoreManager::getLValueIvar(const ObjCIvarDecl* decl, SVal base) {
>> -  return UnknownVal();
>> -}
>> -
>> -SVal FlatStoreManager::getLValueField(const FieldDecl* D, SVal Base) {
>> -  return UnknownVal();
>> -}
>> -
>> SVal FlatStoreManager::getLValueElement(QualType elementType, SVal offset,
>>                                         SVal Base) {
>>   return UnknownVal();
>>
>> Modified: cfe/trunk/lib/Checker/RegionStore.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Checker/RegionStore.cpp?rev=95535&r1=95534&r2=95535&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Checker/RegionStore.cpp (original)
>> +++ cfe/trunk/lib/Checker/RegionStore.cpp Mon Feb  8 01:58:06 2010
>> @@ -232,12 +232,6 @@
>>   ///  the value is not specified.
>>   Store setImplicitDefaultValue(Store store, const MemRegion *R, QualType T);
>>
>> -  SVal getLValueIvar(const ObjCIvarDecl* D, SVal Base);
>> -
>> -  SVal getLValueField(const FieldDecl* D, SVal Base);
>> -
>> -  SVal getLValueFieldOrIvar(const Decl* D, SVal Base);
>> -
>>   SVal getLValueElement(QualType elementType, SVal Offset, SVal Base);
>>
>>
>> @@ -658,55 +652,6 @@
>>                              StateMgr.getValueManager());
>> }
>>
>> -
>> -//===----------------------------------------------------------------------===//
>> -// getLValueXXX methods.
>> -//===----------------------------------------------------------------------===//
>> -
>> -SVal RegionStoreManager::getLValueIvar(const ObjCIvarDecl* D, SVal Base) {
>> -  return getLValueFieldOrIvar(D, Base);
>> -}
>> -
>> -SVal RegionStoreManager::getLValueField(const FieldDecl* D, SVal Base) {
>> -  return getLValueFieldOrIvar(D, Base);
>> -}
>> -
>> -SVal RegionStoreManager::getLValueFieldOrIvar(const Decl* D, SVal Base) {
>> -  if (Base.isUnknownOrUndef())
>> -    return Base;
>> -
>> -  Loc BaseL = cast<Loc>(Base);
>> -  const MemRegion* BaseR = 0;
>> -
>> -  switch (BaseL.getSubKind()) {
>> -  case loc::MemRegionKind:
>> -    BaseR = cast<loc::MemRegionVal>(BaseL).getRegion();
>> -    break;
>> -
>> -  case loc::GotoLabelKind:
>> -    // These are anormal cases. Flag an undefined value.
>> -    return UndefinedVal();
>> -
>> -  case loc::ConcreteIntKind:
>> -    // While these seem funny, this can happen through casts.
>> -    // FIXME: What we should return is the field offset.  For example,
>> -    //  add the field offset to the integer value.  That way funny things
>> -    //  like this work properly:  &(((struct foo *) 0xa)->f)
>> -    return Base;
>> -
>> -  default:
>> -    assert(0 && "Unhandled Base.");
>> -    return Base;
>> -  }
>> -
>> -  // NOTE: We must have this check first because ObjCIvarDecl is a subclass
>> -  // of FieldDecl.
>> -  if (const ObjCIvarDecl *ID = dyn_cast<ObjCIvarDecl>(D))
>> -    return loc::MemRegionVal(MRMgr.getObjCIvarRegion(ID, BaseR));
>> -
>> -  return loc::MemRegionVal(MRMgr.getFieldRegion(cast<FieldDecl>(D), BaseR));
>> -}
>> -
>> SVal RegionStoreManager::getLValueElement(QualType elementType, SVal Offset,
>>                                           SVal Base) {
>>
>>
>> Modified: cfe/trunk/lib/Checker/Store.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Checker/Store.cpp?rev=95535&r1=95534&r2=95535&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Checker/Store.cpp (original)
>> +++ cfe/trunk/lib/Checker/Store.cpp Mon Feb  8 01:58:06 2010
>> @@ -234,3 +234,39 @@
>>
>>   return store;
>> }
>> +
>> +SVal StoreManager::getLValueFieldOrIvar(const Decl* D, SVal Base) {
>> +  if (Base.isUnknownOrUndef())
>> +    return Base;
>> +
>> +  Loc BaseL = cast<Loc>(Base);
>> +  const MemRegion* BaseR = 0;
>> +
>> +  switch (BaseL.getSubKind()) {
>> +  case loc::MemRegionKind:
>> +    BaseR = cast<loc::MemRegionVal>(BaseL).getRegion();
>> +    break;
>> +
>> +  case loc::GotoLabelKind:
>> +    // These are anormal cases. Flag an undefined value.
>> +    return UndefinedVal();
>> +
>> +  case loc::ConcreteIntKind:
>> +    // While these seem funny, this can happen through casts.
>> +    // FIXME: What we should return is the field offset.  For example,
>> +    //  add the field offset to the integer value.  That way funny things
>> +    //  like this work properly:  &(((struct foo *) 0xa)->f)
>> +    return Base;
>> +
>> +  default:
>> +    assert(0 && "Unhandled Base.");
>> +    return Base;
>> +  }
>> +
>> +  // NOTE: We must have this check first because ObjCIvarDecl is a subclass
>> +  // of FieldDecl.
>> +  if (const ObjCIvarDecl *ID = dyn_cast<ObjCIvarDecl>(D))
>> +    return loc::MemRegionVal(MRMgr.getObjCIvarRegion(ID, BaseR));
>> +
>> +  return loc::MemRegionVal(MRMgr.getFieldRegion(cast<FieldDecl>(D), BaseR));
>> +}
>>
>>
>> _______________________________________________
>> 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