From 042ca3de1e8d723cb73ee4d9984509e4489a6bb7 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Fri, 31 May 2013 06:11:17 +0000 Subject: [PATCH] [analyzer; new edges] in splitBranchConditionEdges() do not check that predecessor edge has source in the same lexical scope as the target branch. Fixes . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@182987 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/StaticAnalyzer/Core/BugReporter.cpp | 48 ++-- test/Analysis/edges-new.mm | 364 +++++++++++++++++++++++- 2 files changed, 378 insertions(+), 34 deletions(-) diff --git a/lib/StaticAnalyzer/Core/BugReporter.cpp b/lib/StaticAnalyzer/Core/BugReporter.cpp index 21a2af4efe..c74c08a216 100644 --- a/lib/StaticAnalyzer/Core/BugReporter.cpp +++ b/lib/StaticAnalyzer/Core/BugReporter.cpp @@ -2287,6 +2287,13 @@ static void splitBranchConditionEdges(PathPieces &pieces, Branch = OFS; break; } + if (const BinaryOperator *BO = dyn_cast(Parent)) { + if (BO->isLogicalOp()) { + if (BO->getLHS()->IgnoreParens() == S) + Branch = BO; + break; + } + } S = Parent; } @@ -2303,34 +2310,31 @@ static void splitBranchConditionEdges(PathPieces &pieces, // Now look at the previous edge. We want to know if this was in the same // "level" as the for statement. - const Stmt *SrcParent = getStmtParent(Src, PM); const Stmt *BranchParent = getStmtParent(Branch, PM); - if (SrcParent && SrcParent == BranchParent) { - PathDiagnosticLocation L(Branch, SM, LC); - bool needsEdge = true; - - if (Prev != E) { - if (PathDiagnosticControlFlowPiece *P = - dyn_cast(*Prev)) { - const Stmt *PrevSrc = getLocStmt(P->getStartLocation()); - if (PrevSrc) { - const Stmt *PrevSrcParent = getStmtParent(PrevSrc, PM); - if (PrevSrcParent == BranchParent) { - P->setEndLocation(L); - needsEdge = false; - } + PathDiagnosticLocation L(Branch, SM, LC); + bool needsEdge = true; + + if (Prev != E) { + if (PathDiagnosticControlFlowPiece *P = + dyn_cast(*Prev)) { + const Stmt *PrevSrc = getLocStmt(P->getStartLocation()); + if (PrevSrc) { + const Stmt *PrevSrcParent = getStmtParent(PrevSrc, PM); + if (PrevSrcParent == BranchParent) { + P->setEndLocation(L); + needsEdge = false; } } } + } - if (needsEdge) { - PathDiagnosticControlFlowPiece *P = - new PathDiagnosticControlFlowPiece(PieceI->getStartLocation(), L); - pieces.insert(I, P); - } - - PieceI->setStartLocation(L); + if (needsEdge) { + PathDiagnosticControlFlowPiece *P = + new PathDiagnosticControlFlowPiece(PieceI->getStartLocation(), L); + pieces.insert(I, P); } + + PieceI->setStartLocation(L); } } diff --git a/test/Analysis/edges-new.mm b/test/Analysis/edges-new.mm index cdb49dac9d..2c987898b1 100644 --- a/test/Analysis/edges-new.mm +++ b/test/Analysis/edges-new.mm @@ -1641,6 +1641,40 @@ void variousLoops(id input) { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line91 +// CHECK-NEXT: col3 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line91 +// CHECK-NEXT: col4 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: kindcontrol +// CHECK-NEXT: edges +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: start +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line91 +// CHECK-NEXT: col3 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line91 +// CHECK-NEXT: col4 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: end +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line91 // CHECK-NEXT: col7 // CHECK-NEXT: file0 // CHECK-NEXT: @@ -2935,6 +2969,40 @@ void variousLoops(id input) { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line144 +// CHECK-NEXT: col4 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line144 +// CHECK-NEXT: col5 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: kindcontrol +// CHECK-NEXT: edges +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: start +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line144 +// CHECK-NEXT: col4 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line144 +// CHECK-NEXT: col5 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: end +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line144 // CHECK-NEXT: col8 // CHECK-NEXT: file0 // CHECK-NEXT: @@ -3129,6 +3197,40 @@ void variousLoops(id input) { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line144 +// CHECK-NEXT: col4 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line144 +// CHECK-NEXT: col5 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: kindcontrol +// CHECK-NEXT: edges +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: start +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line144 +// CHECK-NEXT: col4 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line144 +// CHECK-NEXT: col5 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: end +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line144 // CHECK-NEXT: col8 // CHECK-NEXT: file0 // CHECK-NEXT: @@ -4038,6 +4140,40 @@ void variousLoops(id input) { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line176 +// CHECK-NEXT: col5 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line176 +// CHECK-NEXT: col6 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: kindcontrol +// CHECK-NEXT: edges +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: start +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line176 +// CHECK-NEXT: col5 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line176 +// CHECK-NEXT: col6 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: end +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line176 // CHECK-NEXT: col9 // CHECK-NEXT: file0 // CHECK-NEXT: @@ -4266,12 +4402,12 @@ void variousLoops(id input) { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line176 -// CHECK-NEXT: col9 +// CHECK-NEXT: col5 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line176 -// CHECK-NEXT: col9 +// CHECK-NEXT: col6 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: @@ -4287,12 +4423,46 @@ void variousLoops(id input) { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line176 -// CHECK-NEXT: col9 +// CHECK-NEXT: col5 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line176 -// CHECK-NEXT: col9 +// CHECK-NEXT: col6 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: end +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line179 +// CHECK-NEXT: col5 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line179 +// CHECK-NEXT: col6 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: kindcontrol +// CHECK-NEXT: edges +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: start +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line179 +// CHECK-NEXT: col5 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line179 +// CHECK-NEXT: col6 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: @@ -6888,12 +7058,12 @@ void variousLoops(id input) { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line238 -// CHECK-NEXT: col3 +// CHECK-NEXT: col7 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line238 -// CHECK-NEXT: col4 +// CHECK-NEXT: col7 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: @@ -6909,12 +7079,12 @@ void variousLoops(id input) { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line238 -// CHECK-NEXT: col3 +// CHECK-NEXT: col7 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line238 -// CHECK-NEXT: col4 +// CHECK-NEXT: col7 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: @@ -7133,12 +7303,12 @@ void variousLoops(id input) { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line245 -// CHECK-NEXT: col3 +// CHECK-NEXT: col7 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line245 -// CHECK-NEXT: col4 +// CHECK-NEXT: col7 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: @@ -7154,12 +7324,12 @@ void variousLoops(id input) { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line245 -// CHECK-NEXT: col3 +// CHECK-NEXT: col7 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line245 -// CHECK-NEXT: col4 +// CHECK-NEXT: col7 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: @@ -7720,6 +7890,40 @@ void variousLoops(id input) { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line262 +// CHECK-NEXT: col3 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line262 +// CHECK-NEXT: col4 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: kindcontrol +// CHECK-NEXT: edges +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: start +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line262 +// CHECK-NEXT: col3 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line262 +// CHECK-NEXT: col4 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: end +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line262 // CHECK-NEXT: col7 // CHECK-NEXT: file0 // CHECK-NEXT: @@ -9711,6 +9915,40 @@ void variousLoops(id input) { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line419 +// CHECK-NEXT: col3 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line419 +// CHECK-NEXT: col5 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: kindcontrol +// CHECK-NEXT: edges +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: start +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line419 +// CHECK-NEXT: col3 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line419 +// CHECK-NEXT: col5 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: end +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line419 // CHECK-NEXT: col19 // CHECK-NEXT: file0 // CHECK-NEXT: @@ -9774,6 +10012,40 @@ void variousLoops(id input) { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line423 +// CHECK-NEXT: col3 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line423 +// CHECK-NEXT: col5 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: kindcontrol +// CHECK-NEXT: edges +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: start +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line423 +// CHECK-NEXT: col3 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line423 +// CHECK-NEXT: col5 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: end +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line423 // CHECK-NEXT: col8 // CHECK-NEXT: file0 // CHECK-NEXT: @@ -10492,6 +10764,40 @@ void variousLoops(id input) { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line449 +// CHECK-NEXT: col3 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line449 +// CHECK-NEXT: col5 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: kindcontrol +// CHECK-NEXT: edges +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: start +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line449 +// CHECK-NEXT: col3 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line449 +// CHECK-NEXT: col5 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: end +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line449 // CHECK-NEXT: col10 // CHECK-NEXT: file0 // CHECK-NEXT: @@ -10555,6 +10861,40 @@ void variousLoops(id input) { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line453 +// CHECK-NEXT: col3 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line453 +// CHECK-NEXT: col5 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: kindcontrol +// CHECK-NEXT: edges +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: start +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line453 +// CHECK-NEXT: col3 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line453 +// CHECK-NEXT: col5 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: end +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line453 // CHECK-NEXT: col10 // CHECK-NEXT: file0 // CHECK-NEXT: -- 2.50.1