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:
Ted Kremenek 2008-02-27 19:21:33 +00:00
Родитель de808ca855
Коммит b0ab2120e5
1 изменённых файлов: 17 добавлений и 5 удалений

Просмотреть файл

@ -592,13 +592,25 @@ void GRExprEngine::VisitDeclStmt(DeclStmt* DS, GRExprEngine::NodeTy* Pred,
if (VD->getType()->isArrayType())
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();
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),
Ex ? GetRVal(St, Ex) : UninitializedVal());
}
}
Nodify(Dst, DS, Pred, St);