I think we can make them non-virtual. 2010/2/9 Ted Kremenek <[email protected]>: > 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 >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
