diff options
| author | Ted Kremenek <kremenek@apple.com> | 2013-02-22 01:39:26 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2013-02-22 01:39:26 +0000 |
| commit | a3bb2b604422789a452d4b269061ad23e96729f7 (patch) | |
| tree | b02e067405fb5a886389d3403fc8f4cddaf2fc1f | |
| parent | 77569ffd0617b583e40c3e685a8b3f193ede7514 (diff) | |
| download | bcm5719-llvm-a3bb2b604422789a452d4b269061ad23e96729f7.tar.gz bcm5719-llvm-a3bb2b604422789a452d4b269061ad23e96729f7.zip | |
Fix regression in modeling assignments of an address of a variable to itself. Fixes <rdar://problem/13226577>.
llvm-svn: 175852
| -rw-r--r-- | clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp | 4 | ||||
| -rw-r--r-- | clang/test/Analysis/stack-addr-ps.cpp | 6 |
2 files changed, 7 insertions, 3 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp index b656bbd83be..b392c43dd33 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp @@ -471,9 +471,7 @@ void ExprEngine::VisitDeclStmt(const DeclStmt *DS, ExplodedNode *Pred, SVal InitVal = state->getSVal(InitEx, LC); - if (InitVal == state->getLValue(VD, LC) || - (VD->getType()->isArrayType() && - isa<CXXConstructExpr>(InitEx->IgnoreImplicit()))) { + if (isa<CXXConstructExpr>(InitEx->IgnoreImplicit())) { // We constructed the object directly in the variable. // No need to bind anything. B.generateNode(DS, UpdatedN, state); diff --git a/clang/test/Analysis/stack-addr-ps.cpp b/clang/test/Analysis/stack-addr-ps.cpp index a27bef793c4..9dd63f83c67 100644 --- a/clang/test/Analysis/stack-addr-ps.cpp +++ b/clang/test/Analysis/stack-addr-ps.cpp @@ -90,3 +90,9 @@ int* f5() { int& i = i; // expected-warning {{Assigned value is garbage or undefined}} expected-note {{binding reference variable 'i' here}} expected-warning{{reference 'i' is not yet bound to a value when used within its own initialization}} return &i; // expected-warning {{address of stack memory associated with local variable 'i' returned}} } + +void *radar13226577() { + void *p = &p; + return p; // expected-warning {{stack memory associated with local variable 'p' returned to caller}} +} + |

