For uninitialized values analysis, added special treatment for declarations

of array types.  For things like:

  char x[10];
  
we should treat "x" as being initialized, because the variable "x" really
refers to the memory block of the array. Clearly x[1] is uninitialized, but
expressions like "(char*) x" really do refer to an initialized value. This
simple dataflow analysis does not reason about the contents of arrays.

This fixes: PR 1859 (http://llvm.org/bugs/show_bug.cgi?id=1859)

llvm-svn: 44984
This commit is contained in:
Ted Kremenek 2007-12-13 05:14:22 +00:00
parent 2fe0dd09b3
commit 3a742d280c
1 changed files with 16 additions and 1 deletions

View File

@ -124,7 +124,22 @@ bool TransferFuncs::VisitDeclStmt(DeclStmt* S) {
if (BlockVarDecl* VD = dyn_cast<BlockVarDecl>(D)) {
if (Stmt* I = VD->getInit())
V(VD,AD) = AD.FullUninitTaint ? V(cast<Expr>(I),AD) : Initialized;
else V(VD,AD) = Uninitialized;
else {
// Special case for declarations of array types. For things like:
//
// char x[10];
//
// we should treat "x" as being initialized, because the variable
// "x" really refers to the memory block. Clearly x[1] is
// uninitialized, but expressions like "(char *) x" really do refer to
// an initialized value. This simple dataflow analysis does not reason
// about the contents of arrays, although it could be potentially
// extended to do so if the array were of constant size.
if (VD->getType()->isArrayType())
V(VD,AD) = Initialized;
else
V(VD,AD) = Uninitialized;
}
}
return Uninitialized; // Value is never consumed.