From: Anna Zaks Date: Thu, 16 Feb 2012 03:41:01 +0000 (+0000) Subject: [analyzer] Diagnostics: Ensure that the default end of diagnostic path X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5a0917d1367115d5fddfe7551f8634759217b54b;p=clang [analyzer] Diagnostics: Ensure that the default end of diagnostic path piece can always be generated. The default end of diagnostic path piece was failing to generate on a BlockEdge that was outgoing from a basic block without a terminator, resulting in a very simple diagnostic being rendered (ex: no path highlighting or custom visitors). Reuse another function, which is essentially doing the same thing and correct it not to fail when a block has no terminator. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150659 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp index ad3ac97a29..4b290626c0 100644 --- a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp +++ b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp @@ -85,26 +85,8 @@ PathDiagnosticPiece* BugReporterVisitor::getDefaultEndPath(BugReporterContext &BRC, const ExplodedNode *EndPathNode, BugReport &BR) { - const ProgramPoint &PP = EndPathNode->getLocation(); - PathDiagnosticLocation L; - - if (const BlockEntrance *BE = dyn_cast(&PP)) { - const CFGBlock *block = BE->getBlock(); - if (block->getBlockID() == 0) { - L = PathDiagnosticLocation::createDeclEnd(PP.getLocationContext(), - BRC.getSourceManager()); - } - } - - if (!L.isValid()) { - const Stmt *S = BR.getStmt(); - - if (!S) - return NULL; - - L = PathDiagnosticLocation(S, BRC.getSourceManager(), - PP.getLocationContext()); - } + PathDiagnosticLocation L = + PathDiagnosticLocation::createEndOfPath(EndPathNode,BRC.getSourceManager()); BugReport::ranges_iterator Beg, End; llvm::tie(Beg, End) = BR.getRanges(); diff --git a/lib/StaticAnalyzer/Core/PathDiagnostic.cpp b/lib/StaticAnalyzer/Core/PathDiagnostic.cpp index 5ded6bcd56..bc03a2bc30 100644 --- a/lib/StaticAnalyzer/Core/PathDiagnostic.cpp +++ b/lib/StaticAnalyzer/Core/PathDiagnostic.cpp @@ -305,8 +305,9 @@ PathDiagnosticLocation return PathDiagnosticLocation(PS->getStmt(), SM, LC); else if (const BlockEdge *BE = dyn_cast(&P)) { const Stmt *Term = BE->getSrc()->getTerminator(); - assert(Term); - return PathDiagnosticLocation(Term, SM, LC); + if (Term) { + return PathDiagnosticLocation(Term, SM, LC); + } } NI = NI->succ_empty() ? 0 : *(NI->succ_begin()); } diff --git a/test/Analysis/malloc-plist.c b/test/Analysis/malloc-plist.c new file mode 100644 index 0000000000..8727bc26c6 --- /dev/null +++ b/test/Analysis/malloc-plist.c @@ -0,0 +1,422 @@ +// RUN: %clang_cc1 -analyze -analyzer-checker=experimental.unix.Malloc -analyzer-output=plist -o - %s | FileCheck %s + +typedef __typeof(sizeof(int)) size_t; +void *malloc(size_t); + +void diagnosticTest(int in) { + if (in > 5) { + int *p = malloc(12); + (*p)++; + } + in++; // expected-warning {{leak}} +} + +void myArrayAllocation() { + int **A; + A = malloc(2*sizeof(int*)); + A[0] = 0;// expected-warning {{leak}} +} + +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: files +// CHECK: +// CHECK: +// CHECK: diagnostics +// CHECK: +// CHECK: +// CHECK: path +// CHECK: +// CHECK: +// CHECK: kindcontrol +// CHECK: edges +// CHECK: +// CHECK: +// CHECK: start +// CHECK: +// CHECK: +// CHECK: line7 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line7 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: end +// CHECK: +// CHECK: +// CHECK: line7 +// CHECK: col9 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line7 +// CHECK: col9 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: kindevent +// CHECK: location +// CHECK: +// CHECK: line7 +// CHECK: col9 +// CHECK: file0 +// CHECK: +// CHECK: ranges +// CHECK: +// CHECK: +// CHECK: +// CHECK: line7 +// CHECK: col9 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line7 +// CHECK: col14 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: +// CHECK: extended_message +// CHECK: Assuming 'in' is > 5 +// CHECK: message +// CHECK: Assuming 'in' is > 5 +// CHECK: +// CHECK: +// CHECK: kindcontrol +// CHECK: edges +// CHECK: +// CHECK: +// CHECK: start +// CHECK: +// CHECK: +// CHECK: line7 +// CHECK: col9 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line7 +// CHECK: col9 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: end +// CHECK: +// CHECK: +// CHECK: line8 +// CHECK: col9 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line8 +// CHECK: col9 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: kindcontrol +// CHECK: edges +// CHECK: +// CHECK: +// CHECK: start +// CHECK: +// CHECK: +// CHECK: line8 +// CHECK: col9 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line8 +// CHECK: col9 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: end +// CHECK: +// CHECK: +// CHECK: line8 +// CHECK: col18 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line8 +// CHECK: col27 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: kindevent +// CHECK: location +// CHECK: +// CHECK: line8 +// CHECK: col18 +// CHECK: file0 +// CHECK: +// CHECK: ranges +// CHECK: +// CHECK: +// CHECK: +// CHECK: line8 +// CHECK: col18 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line8 +// CHECK: col27 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: +// CHECK: extended_message +// CHECK: Memory is allocated here +// CHECK: message +// CHECK: Memory is allocated here +// CHECK: +// CHECK: +// CHECK: kindcontrol +// CHECK: edges +// CHECK: +// CHECK: +// CHECK: start +// CHECK: +// CHECK: +// CHECK: line8 +// CHECK: col18 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line8 +// CHECK: col27 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: end +// CHECK: +// CHECK: +// CHECK: line11 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line11 +// CHECK: col6 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: kindevent +// CHECK: location +// CHECK: +// CHECK: line11 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: ranges +// CHECK: +// CHECK: +// CHECK: +// CHECK: line11 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line11 +// CHECK: col6 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: +// CHECK: extended_message +// CHECK: Allocated memory never released. Potential memory leak +// CHECK: message +// CHECK: Allocated memory never released. Potential memory leak +// CHECK: +// CHECK: +// CHECK: descriptionAllocated memory never released. Potential memory leak +// CHECK: categoryLogic error +// CHECK: typeMemory leak +// CHECK: location +// CHECK: +// CHECK: line11 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: +// CHECK: path +// CHECK: +// CHECK: +// CHECK: kindcontrol +// CHECK: edges +// CHECK: +// CHECK: +// CHECK: start +// CHECK: +// CHECK: +// CHECK: line15 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line15 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: end +// CHECK: +// CHECK: +// CHECK: line16 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line16 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: kindcontrol +// CHECK: edges +// CHECK: +// CHECK: +// CHECK: start +// CHECK: +// CHECK: +// CHECK: line16 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line16 +// CHECK: col5 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: end +// CHECK: +// CHECK: +// CHECK: line16 +// CHECK: col9 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line16 +// CHECK: col30 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: kindevent +// CHECK: location +// CHECK: +// CHECK: line16 +// CHECK: col9 +// CHECK: file0 +// CHECK: +// CHECK: ranges +// CHECK: +// CHECK: +// CHECK: +// CHECK: line16 +// CHECK: col9 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line16 +// CHECK: col30 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: +// CHECK: extended_message +// CHECK: Memory is allocated here +// CHECK: message +// CHECK: Memory is allocated here +// CHECK: +// CHECK: +// CHECK: kindcontrol +// CHECK: edges +// CHECK: +// CHECK: +// CHECK: start +// CHECK: +// CHECK: +// CHECK: line16 +// CHECK: col9 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line16 +// CHECK: col30 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: end +// CHECK: +// CHECK: +// CHECK: line18 +// CHECK: col1 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: line18 +// CHECK: col1 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: kindevent +// CHECK: location +// CHECK: +// CHECK: line18 +// CHECK: col1 +// CHECK: file0 +// CHECK: +// CHECK: extended_message +// CHECK: Allocated memory never released. Potential memory leak +// CHECK: message +// CHECK: Allocated memory never released. Potential memory leak +// CHECK: +// CHECK: +// CHECK: descriptionAllocated memory never released. Potential memory leak +// CHECK: categoryLogic error +// CHECK: typeMemory leak +// CHECK: location +// CHECK: +// CHECK: line18 +// CHECK: col1 +// CHECK: file0 +// CHECK: +// CHECK: +// CHECK: +// CHECK: +// CHECK: