diff options
| author | Ted Kremenek <kremenek@apple.com> | 2008-07-15 18:06:32 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2008-07-15 18:06:32 +0000 |
| commit | 81bfc074c9d14cc4c9b1e45035a386f81c0217d5 (patch) | |
| tree | 263f18fa42d0cc6acf8ece65326c994f4620ac92 | |
| parent | 24768e3dc4c1f86e3015180325bf257917c207c3 (diff) | |
| download | bcm5719-llvm-81bfc074c9d14cc4c9b1e45035a386f81c0217d5.tar.gz bcm5719-llvm-81bfc074c9d14cc4c9b1e45035a386f81c0217d5.zip | |
Distinguish between dead stores and dead initializations.
llvm-svn: 53628
| -rw-r--r-- | clang/lib/Analysis/DeadStores.cpp | 28 | ||||
| -rw-r--r-- | clang/test/Analysis/conditional-op-missing-lhs.c | 2 |
2 files changed, 20 insertions, 10 deletions
diff --git a/clang/lib/Analysis/DeadStores.cpp b/clang/lib/Analysis/DeadStores.cpp index 0bbd8786098..b9d9382f6ce 100644 --- a/clang/lib/Analysis/DeadStores.cpp +++ b/clang/lib/Analysis/DeadStores.cpp @@ -37,16 +37,26 @@ public: virtual ~DeadStoreObs() {} - void Report(VarDecl* V, bool inEnclosing, SourceLocation L, SourceRange R) { + void Report(VarDecl* V, bool inEnclosing, SourceLocation L, SourceRange R, + bool isInitialization = false) { - std::string name(V->getName()); - std::string msg = inEnclosing - ? "Although the value stored to '" + name + - "' is used in the enclosing expression, the value is never actually" - " read from '" + name + "'" - : "Value stored to '" + name + "' is never read"; + std::string name(V->getName()); - BR.EmitBasicReport("dead store", msg.c_str(), L, R); + if (isInitialization) { + std::string msg = "Value stored to '" + name + + "' during its initialization is never read"; + + BR.EmitBasicReport("dead initialization", msg.c_str(), L, R); + } + else { + std::string msg = inEnclosing + ? "Although the value stored to '" + name + + "' is used in the enclosing expression, the value is never actually" + " read from '" + name + "'" + : "Value stored to '" + name + "' is never read"; + + BR.EmitBasicReport("dead store", msg.c_str(), L, R); + } } void CheckVarDecl(VarDecl* VD, Expr* Ex, Expr* Val, @@ -124,7 +134,7 @@ public: // a warning. This is because such initialization can be // due to defensive programming. if (!E->isConstantExpr(Ctx,NULL)) - Report(V, false, V->getLocation(), E->getSourceRange()); + Report(V, false, V->getLocation(), E->getSourceRange(), true); } } } diff --git a/clang/test/Analysis/conditional-op-missing-lhs.c b/clang/test/Analysis/conditional-op-missing-lhs.c index 6296291cdfb..9fbb9f19875 100644 --- a/clang/test/Analysis/conditional-op-missing-lhs.c +++ b/clang/test/Analysis/conditional-op-missing-lhs.c @@ -4,7 +4,7 @@ void f1() { int i; - int j = i ? : 1; // expected-warning{{use of uninitialized variable}} //expected-warning{{Value stored to 'j' is never read}} + int j = i ? : 1; // expected-warning{{use of uninitialized variable}} //expected-warning{{Value stored to 'j' during its initialization is never read}} } void *f2(int *i) |

