diff options
author | Jordy Rose <jediknil@belkadan.com> | 2011-06-08 22:47:39 +0000 |
---|---|---|
committer | Jordy Rose <jediknil@belkadan.com> | 2011-06-08 22:47:39 +0000 |
commit | ab8a66884950c2186af70e9242f8df5753257ae5 (patch) | |
tree | 399937824f013150c3071b3b17eb0fd4fb508a84 | |
parent | 3d2efafb36e761210ee7c18cabc7700d450bc31a (diff) | |
download | bcm5719-llvm-ab8a66884950c2186af70e9242f8df5753257ae5.tar.gz bcm5719-llvm-ab8a66884950c2186af70e9242f8df5753257ae5.zip |
[analyzer] Look through __extension__ expressions in a GRState's Environment. Fixes PR8962.
llvm-svn: 132762
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/Environment.cpp | 12 | ||||
-rw-r--r-- | clang/test/Analysis/misc-ps.c | 14 |
2 files changed, 20 insertions, 6 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/Environment.cpp b/clang/lib/StaticAnalyzer/Core/Environment.cpp index a00f9dc10b6..e9f5016b36c 100644 --- a/clang/lib/StaticAnalyzer/Core/Environment.cpp +++ b/clang/lib/StaticAnalyzer/Core/Environment.cpp @@ -39,6 +39,9 @@ SVal Environment::getSVal(const Stmt *E, SValBuilder& svalBuilder, } for (;;) { + if (const Expr *Ex = dyn_cast<Expr>(E)) + E = Ex->IgnoreParens(); + switch (E->getStmtClass()) { case Stmt::AddrLabelExprClass: return svalBuilder.makeLoc(cast<AddrLabelExpr>(E)); @@ -48,13 +51,10 @@ SVal Environment::getSVal(const Stmt *E, SValBuilder& svalBuilder, continue; } case Stmt::ParenExprClass: - // ParenExprs are no-ops. - E = cast<ParenExpr>(E)->getSubExpr(); - continue; case Stmt::GenericSelectionExprClass: - // GenericSelectionExprs are no-ops. - E = cast<GenericSelectionExpr>(E)->getResultExpr(); - continue; + llvm_unreachable("ParenExprs and GenericSelectionExprs should " + "have been handled by IgnoreParens()"); + return UnknownVal(); case Stmt::CharacterLiteralClass: { const CharacterLiteral* C = cast<CharacterLiteral>(E); return svalBuilder.makeIntVal(C->getValue(), C->getType()); diff --git a/clang/test/Analysis/misc-ps.c b/clang/test/Analysis/misc-ps.c index 2d4fdd4637d..0729ce2f775 100644 --- a/clang/test/Analysis/misc-ps.c +++ b/clang/test/Analysis/misc-ps.c @@ -36,3 +36,17 @@ int rdar93730392() { return j; } + +int PR8962 (int *t) { + // This should look through the __extension__ no-op. + if (__extension__ (t)) return 0; + return *t; // expected-warning {{null pointer}} +} + +int PR8962_b (int *t) { + // This should still ignore the nested casts + // which aren't handled by a single IgnoreParens() + if (((int)((int)t))) return 0; + return *t; // expected-warning {{null pointer}} +} + |