aboutsummaryrefslogtreecommitdiff
path: root/Analysis/UninitializedValues.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2007-12-13 05:14:22 +0000
committerTed Kremenek <kremenek@apple.com>2007-12-13 05:14:22 +0000
commit81a56ec2620e40694e63bbac2ee11a21bd6b9240 (patch)
treee9e465452242b39e9ba98f2a612496d97bf032b6 /Analysis/UninitializedValues.cpp
parentf62aea30e2d6e340741b834cac837e19f2e37dba (diff)
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) git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44984 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'Analysis/UninitializedValues.cpp')
-rw-r--r--Analysis/UninitializedValues.cpp17
1 files changed, 16 insertions, 1 deletions
diff --git a/Analysis/UninitializedValues.cpp b/Analysis/UninitializedValues.cpp
index 9651814b02..89ff1c2068 100644
--- a/Analysis/UninitializedValues.cpp
+++ b/Analysis/UninitializedValues.cpp
@@ -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.