aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/UninitializedValues.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2011-10-07 00:42:48 +0000
committerTed Kremenek <kremenek@apple.com>2011-10-07 00:42:48 +0000
commitc5f740ecdbc21d5ba08f97b89cc05c9d4f230fda (patch)
tree99528294d74c91e082a2d073b4a9901b8f511a7c /lib/Analysis/UninitializedValues.cpp
parenta59956b473b76af6a9d999ab1780ef74cfed4667 (diff)
Fix infinite loop in -Wuninitialized reported in PR 11069.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@141345 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/UninitializedValues.cpp')
-rw-r--r--lib/Analysis/UninitializedValues.cpp45
1 files changed, 26 insertions, 19 deletions
diff --git a/lib/Analysis/UninitializedValues.cpp b/lib/Analysis/UninitializedValues.cpp
index b2e664153b..8d48fffe9f 100644
--- a/lib/Analysis/UninitializedValues.cpp
+++ b/lib/Analysis/UninitializedValues.cpp
@@ -212,13 +212,6 @@ BVPair &CFGBlockValues::getValueVectors(const clang::CFGBlock *block,
return vals[idx];
}
-void CFGBlockValues::mergeIntoScratch(ValueVector const &source,
- bool isFirst) {
- if (isFirst)
- scratch = source;
- else
- scratch |= source;
-}
#if 0
static void printVector(const CFGBlock *block, ValueVector &bv,
unsigned num) {
@@ -229,8 +222,24 @@ static void printVector(const CFGBlock *block, ValueVector &bv,
}
llvm::errs() << " : " << num << '\n';
}
+
+static void printVector(const char *name, ValueVector const &bv) {
+ llvm::errs() << name << " : ";
+ for (unsigned i = 0; i < bv.size(); ++i) {
+ llvm::errs() << ' ' << bv[i];
+ }
+ llvm::errs() << "\n";
+}
#endif
+void CFGBlockValues::mergeIntoScratch(ValueVector const &source,
+ bool isFirst) {
+ if (isFirst)
+ scratch = source;
+ else
+ scratch |= source;
+}
+
bool CFGBlockValues::updateValueVectorWithScratch(const CFGBlock *block) {
ValueVector &dst = getValueVector(block, 0);
bool changed = (dst != scratch);
@@ -529,14 +538,9 @@ void TransferFunctions::VisitUnaryOperator(clang::UnaryOperator *uo) {
void TransferFunctions::VisitCastExpr(clang::CastExpr *ce) {
if (ce->getCastKind() == CK_LValueToRValue) {
const FindVarResult &res = findBlockVarDecl(ce->getSubExpr());
- if (const VarDecl *vd = res.getDecl()) {
+ if (res.getDecl()) {
assert(res.getDeclRefExpr() == lastDR);
- if (isUninitialized(vals[vd])) {
- // Record this load of an uninitialized value. Normally this
- // results in a warning, but we delay reporting the issue
- // in case it is wrapped in a void cast, etc.
- lastLoad = ce;
- }
+ lastLoad = ce;
}
}
else if (ce->getCastKind() == CK_NoOp ||
@@ -573,16 +577,19 @@ void TransferFunctions::ProcessUses(Stmt *s) {
if (lastLoad == s)
return;
- // If we reach here, we have seen a load of an uninitialized value
- // and it hasn't been casted to void or otherwise handled. In this
- // situation, report the incident.
const DeclRefExpr *DR =
cast<DeclRefExpr>(stripCasts(ac.getASTContext(),
lastLoad->getSubExpr()));
const VarDecl *VD = cast<VarDecl>(DR->getDecl());
- reportUninit(DR, VD, isAlwaysUninit(vals[VD]));
+
+ // If we reach here, we may have seen a load of an uninitialized value
+ // and it hasn't been casted to void or otherwise handled. In this
+ // situation, report the incident.
+ if (isUninitialized(vals[VD]))
+ reportUninit(DR, VD, isAlwaysUninit(vals[VD]));
+
lastLoad = 0;
-
+
if (DR == lastDR) {
lastDR = 0;
return;