зеркало из https://github.com/microsoft/clang-1.git
Small tweaks to the transfer function for DeclStmt: do not mark external global
variables as uninitialized, and only "initialize" static function variables. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47683 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
de808ca855
Коммит
b0ab2120e5
|
@ -592,13 +592,25 @@ void GRExprEngine::VisitDeclStmt(DeclStmt* DS, GRExprEngine::NodeTy* Pred,
|
||||||
if (VD->getType()->isArrayType())
|
if (VD->getType()->isArrayType())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// FIXME: static variables have an initializer, but the second
|
|
||||||
// time a function is called those values may not be current.
|
|
||||||
const Expr* Ex = VD->getInit();
|
const Expr* Ex = VD->getInit();
|
||||||
|
|
||||||
|
if (!VD->hasGlobalStorage() || VD->getStorageClass() == VarDecl::Static) {
|
||||||
|
|
||||||
|
// In this context, Static => Local variable.
|
||||||
|
|
||||||
|
assert (!VD->getStorageClass() == VarDecl::Static ||
|
||||||
|
!isa<FileVarDecl>(VD));
|
||||||
|
|
||||||
|
// If there is no initializer, set the value of the
|
||||||
|
// variable to "Uninitialized".
|
||||||
|
//
|
||||||
|
// FIXME: static variables may have an initializer, but the second
|
||||||
|
// time a function is called those values may not be current.
|
||||||
|
|
||||||
St = SetRVal(St, lval::DeclVal(VD),
|
St = SetRVal(St, lval::DeclVal(VD),
|
||||||
Ex ? GetRVal(St, Ex) : UninitializedVal());
|
Ex ? GetRVal(St, Ex) : UninitializedVal());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Nodify(Dst, DS, Pred, St);
|
Nodify(Dst, DS, Pred, St);
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче