From 6987c7b74146b9658b1925c5981f8b0cd0672b55 Mon Sep 17 00:00:00 2001 From: Zhongxing Xu Date: Sun, 30 Nov 2008 05:49:49 +0000 Subject: [PATCH] Add support for initializing array with string literal. This fixes PR3127 http://llvm.org/bugs/show_bug.cgi?id=3127 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60280 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/GRExprEngine.cpp | 4 ++++ lib/Analysis/RegionStore.cpp | 35 ++++++++++++++++++++++++++++++----- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp index ee6b020240..5d4136de76 100644 --- a/lib/Analysis/GRExprEngine.cpp +++ b/lib/Analysis/GRExprEngine.cpp @@ -405,6 +405,10 @@ void GRExprEngine::Visit(Stmt* S, NodeTy* Pred, NodeSet& Dst) { break; } + + case Stmt::StringLiteralClass: + VisitLValue(cast(S), Pred, Dst); + break; case Stmt::UnaryOperatorClass: VisitUnaryOperator(cast(S), Pred, Dst, false); diff --git a/lib/Analysis/RegionStore.cpp b/lib/Analysis/RegionStore.cpp index 1b62cc5032..92f4a6e714 100644 --- a/lib/Analysis/RegionStore.cpp +++ b/lib/Analysis/RegionStore.cpp @@ -637,17 +637,42 @@ Store RegionStoreManager::InitializeArray(Store store, const TypedRegion* R, ConstantArrayType* CAT = cast(T.getTypePtr()); - llvm::APInt Size = CAT->getSize(); + llvm::APSInt Size(CAT->getSize(), false); + + llvm::APSInt i = getBasicVals().getZeroWithPtrWidth(false); + + // Check if the init expr is a StringLiteral. + if (isa(Init)) { + const MemRegion* InitR = cast(Init).getRegion(); + const StringLiteral* S = cast(InitR)->getStringLiteral(); + const char* str = S->getStrData(); + unsigned len = S->getByteLength(); + unsigned j = 0; + + for (; i < Size; ++i, ++j) { + SVal Idx = NonLoc::MakeVal(getBasicVals(), i); + ElementRegion* ER = MRMgr.getElementRegion(Idx, R); + + // Copy bytes from the string literal into the target array. Trailing + // bytes in the array that are not covered by the string literal are + // initialized to zero. + SVal V = (j < len) + ? NonLoc::MakeVal(getBasicVals(), str[j], sizeof(char)*8, true) + : NonLoc::MakeVal(getBasicVals(), 0, sizeof(char)*8, true); + + store = Bind(store, loc::MemRegionVal(ER), V); + } + + return store; + } - llvm::APInt i = llvm::APInt::getNullValue(Size.getBitWidth()); nonloc::CompoundVal& CV = cast(Init); nonloc::CompoundVal::iterator VI = CV.begin(), VE = CV.end(); - for (; i != Size; ++i) { - nonloc::ConcreteInt Idx(getBasicVals().getValue(llvm::APSInt(i, false))); - + for (; i < Size; ++i) { + SVal Idx = NonLoc::MakeVal(getBasicVals(), i); ElementRegion* ER = MRMgr.getElementRegion(Idx, R); store = Bind(store, loc::MemRegionVal(ER), (VI!=VE) ? *VI : UndefinedVal());