Index: clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp =================================================================== --- clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp +++ clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp @@ -833,13 +833,19 @@ return; // First, find when we processed the statement. + // If we have a 'CXXNewExpr' or a 'CXXConstructExpr' they got purged away + // before their calls happen and we would catch that purge in the second + // 'break' so we have to bypass it. + const bool IsBypass = isa(S) || isa(S); do { - if (auto CEE = Node->getLocationAs()) + if (Optional CEE = Node->getLocationAs()) if (CEE->getCalleeContext()->getCallSite() == S) break; - if (auto SP = Node->getLocationAs()) - if (SP->getStmt() == S) - break; + + if (!IsBypass) + if (Optional SP = Node->getLocationAs()) + if (SP->getStmt() == S) + break; Node = Node->getFirstPred(); } while (Node); Index: clang/test/Analysis/new-ctor-null-throw.cpp =================================================================== --- clang/test/Analysis/new-ctor-null-throw.cpp +++ clang/test/Analysis/new-ctor-null-throw.cpp @@ -1,4 +1,6 @@ -// RUN: %clang_analyze_cc1 -w -analyzer-checker=core,debug.ExprInspection -analyzer-config c++-allocator-inlining=true -std=c++11 -verify %s +// RUN: %clang_analyze_cc1 \ +// RUN: -analyzer-checker=core,debug.ExprInspection \ +// RUN: -std=c++11 -verify %s void clang_analyzer_eval(bool); @@ -9,9 +11,11 @@ // operator new. void *operator new(size_t size) { return nullptr; + // expected-warning@-1 {{'operator new' should not return a null pointer unless it is declared 'throw()' or 'noexcept'}} } void *operator new[](size_t size) { return nullptr; + // expected-warning@-1 {{'operator new[]' should not return a null pointer unless it is declared 'throw()' or 'noexcept'}} } struct S { @@ -22,5 +26,6 @@ void testArrays() { S *s = new S[10]; // no-crash - s[0].x = 2; // expected-warning{{Dereference of null pointer}} + s[0].x = 2; + // no-warning: 'Dereference of null pointer' suppressed by ReturnVisitor. } Index: clang/test/Analysis/new-ctor-null.cpp =================================================================== --- clang/test/Analysis/new-ctor-null.cpp +++ clang/test/Analysis/new-ctor-null.cpp @@ -1,4 +1,6 @@ -// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-config c++-allocator-inlining=true -std=c++11 -verify %s +// RUN: %clang_analyze_cc1 \ +// RUN: -analyzer-checker=core,debug.ExprInspection \ +// RUN: -std=c++11 -verify %s void clang_analyzer_eval(bool); void clang_analyzer_warnIfReached(); @@ -24,7 +26,8 @@ void testArrays() { S *s = new S[10]; // no-crash - s[0].x = 2; // expected-warning{{Dereference of null pointer}} + s[0].x = 2; + // no-warning: 'Dereference of null pointer' suppressed by ReturnVisitor. } int global;