From: Ted Kremenek Date: Mon, 6 Jul 2009 22:23:45 +0000 (+0000) Subject: StoreManager::NewCastRegion: X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=411af40d038947b6d2a8ad9549c85c1c4c52d15a;p=clang StoreManager::NewCastRegion: - Refactor logic that creates ElementRegions into a help method 'MakeElementRegion'. - Fix crash due to not handling StringRegions. Casts of StringRegions now result in a new ElementRegion layered on the original StringRegion. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74867 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/Store.cpp b/lib/Analysis/Store.cpp index cd123995fa..08db2c565f 100644 --- a/lib/Analysis/Store.cpp +++ b/lib/Analysis/Store.cpp @@ -22,6 +22,19 @@ StoreManager::StoreManager(GRStateManager &stateMgr, bool useNewCastRegion) UseNewCastRegion(useNewCastRegion), MRMgr(ValMgr.getRegionManager()) {} +StoreManager::CastResult +StoreManager::MakeElementRegion(const GRState *state, const MemRegion *region, + QualType pointeeTy, QualType castToTy) { + + // Record the cast type of the region. + state = setCastType(state, region, castToTy); + + // Create a new ElementRegion at offset 0. + SVal idx = ValMgr.makeZeroArrayIndex(); + return CastResult(state, MRMgr.getElementRegion(pointeeTy, idx, region, + ValMgr.getContext())); +} + StoreManager::CastResult StoreManager::NewCastRegion(const GRState *state, const MemRegion* R, QualType CastToTy) { @@ -38,19 +51,23 @@ StoreManager::NewCastRegion(const GRState *state, const MemRegion* R, && CastToTy->getAsPointerType()->getPointeeType()->isVoidType())); return CastResult(state, R); } - + // Check cast to ObjCQualifiedID type. if (ToTy->isObjCQualifiedIdType()) { // FIXME: Record the type information aside. return CastResult(state, R); } - + // Now assume we are casting from pointer to pointer. Other cases should // already be handled. QualType PointeeTy = cast(ToTy.getTypePtr())->getPointeeType(); - + // Process region cast according to the kind of the region being cast. + // Handle casts of string literals. + if (isa(R)) + return MakeElementRegion(state, R, PointeeTy, ToTy); + // FIXME: Need to handle arbitrary downcasts. if (isa(R) || isa(R)) { state = setCastType(state, R, ToTy); @@ -77,13 +94,8 @@ StoreManager::NewCastRegion(const GRState *state, const MemRegion* R, if ((PointeeTySize > 0 && PointeeTySize < ObjTySize) || (ObjTy->isAggregateType() && PointeeTy->isScalarType()) || - ObjTySize == 0 /* R has 'void*' type. */) { - // Record the cast type of the region. - state = setCastType(state, R, ToTy); - - SVal Idx = ValMgr.makeZeroArrayIndex(); - ElementRegion* ER = MRMgr.getElementRegion(PointeeTy, Idx,R, Ctx); - return CastResult(state, ER); + ObjTySize == 0 /* R has 'void*' type. */) { + return MakeElementRegion(state, R, PointeeTy, ToTy); } else { state = setCastType(state, R, ToTy); return CastResult(state, R); diff --git a/test/Analysis/misc-ps.m b/test/Analysis/misc-ps.m index 025d74cccb..d4d2e6272f 100644 --- a/test/Analysis/misc-ps.m +++ b/test/Analysis/misc-ps.m @@ -297,4 +297,13 @@ void rdar_7027684(int x, int y) { (rdar_7027684_aux() ? rdar_7027684_aux_2() : (void) 0); } +// Test that we handle casts of string literals to arbitrary types. +unsigned const char *string_literal_test1() { + return (const unsigned char*) "hello"; +} + +const float *string_literal_test2() { + return (const float*) "hello"; +} +