зеркало из https://github.com/microsoft/clang-1.git
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
This commit is contained in:
Родитель
994ffef435
Коммит
6987c7b741
|
@ -405,6 +405,10 @@ void GRExprEngine::Visit(Stmt* S, NodeTy* Pred, NodeSet& Dst) {
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case Stmt::StringLiteralClass:
|
||||||
|
VisitLValue(cast<StringLiteral>(S), Pred, Dst);
|
||||||
|
break;
|
||||||
|
|
||||||
case Stmt::UnaryOperatorClass:
|
case Stmt::UnaryOperatorClass:
|
||||||
VisitUnaryOperator(cast<UnaryOperator>(S), Pred, Dst, false);
|
VisitUnaryOperator(cast<UnaryOperator>(S), Pred, Dst, false);
|
||||||
|
|
|
@ -637,17 +637,42 @@ Store RegionStoreManager::InitializeArray(Store store, const TypedRegion* R,
|
||||||
|
|
||||||
ConstantArrayType* CAT = cast<ConstantArrayType>(T.getTypePtr());
|
ConstantArrayType* CAT = cast<ConstantArrayType>(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<loc::MemRegionVal>(Init)) {
|
||||||
|
const MemRegion* InitR = cast<loc::MemRegionVal>(Init).getRegion();
|
||||||
|
const StringLiteral* S = cast<StringRegion>(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<nonloc::CompoundVal>(Init);
|
nonloc::CompoundVal& CV = cast<nonloc::CompoundVal>(Init);
|
||||||
|
|
||||||
nonloc::CompoundVal::iterator VI = CV.begin(), VE = CV.end();
|
nonloc::CompoundVal::iterator VI = CV.begin(), VE = CV.end();
|
||||||
|
|
||||||
for (; i != Size; ++i) {
|
for (; i < Size; ++i) {
|
||||||
nonloc::ConcreteInt Idx(getBasicVals().getValue(llvm::APSInt(i, false)));
|
SVal Idx = NonLoc::MakeVal(getBasicVals(), i);
|
||||||
|
|
||||||
ElementRegion* ER = MRMgr.getElementRegion(Idx, R);
|
ElementRegion* ER = MRMgr.getElementRegion(Idx, R);
|
||||||
|
|
||||||
store = Bind(store, loc::MemRegionVal(ER), (VI!=VE) ? *VI : UndefinedVal());
|
store = Bind(store, loc::MemRegionVal(ER), (VI!=VE) ? *VI : UndefinedVal());
|
||||||
|
|
Загрузка…
Ссылка в новой задаче