diff --git a/clang/lib/Analysis/PathDiagnostic.cpp b/clang/lib/Analysis/PathDiagnostic.cpp --- a/clang/lib/Analysis/PathDiagnostic.cpp +++ b/clang/lib/Analysis/PathDiagnostic.cpp @@ -349,6 +349,24 @@ FullSourceLoc YL = Y.getLocation().asLocation(); if (XL != YL) return compareCrossTUSourceLocs(XL, YL); + PathDiagnosticRange XR = X.getLocation().asRange(); + PathDiagnosticRange YR = Y.getLocation().asRange(); + if (XR.isValid() && !YR.isValid()) + return true; + if (!XR.isValid() && YR.isValid()) + return false; + if (XR.isValid() && YR.isValid()) { + if (XR.isPoint && !YR.isPoint) + return true; + if (!XR.isPoint && YR.isPoint) + return false; + if (!XR.isPoint && !YR.isPoint) { + FullSourceLoc XRE{XR.getEnd(), XL.getManager()}; + FullSourceLoc YRE{YR.getEnd(), YL.getManager()}; + if (XRE != YRE) + return compareCrossTUSourceLocs(XRE, YRE); + } + } if (X.getBugType() != Y.getBugType()) return X.getBugType() < Y.getBugType(); if (X.getCategory() != Y.getCategory()) diff --git a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp --- a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp +++ b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp @@ -1997,9 +1997,6 @@ return nullptr; } - if (!PDC->shouldGenerateDiagnostics()) - return generateEmptyDiagnosticForReport(R, getSourceManager()); - // Construct the final (warning) event for the bug report. auto EndNotes = VisitorsDiagnostics->find(ErrorNode); PathDiagnosticPieceRef LastPiece; @@ -2012,6 +2009,9 @@ } Construct.PD->setEndOfPath(LastPiece); + if (!PDC->shouldGenerateDiagnostics()) + return std::move(Construct.PD); + PathDiagnosticLocation PrevLoc = Construct.PD->getLocation(); // From the error node to the root, ascend the bug path and construct the bug // report. @@ -3004,10 +3004,11 @@ // If the path is empty, generate a single step path with the location // of the issue. + // This can happen if report is BasicBugReport. if (PD->path.empty()) { PathDiagnosticLocation L = report->getLocation(); auto piece = std::make_unique( - L, report->getDescription()); + L, report->getDescription()); for (SourceRange Range : report->getRanges()) piece->addRange(Range); PD->setEndOfPath(std::move(piece)); diff --git a/clang/test/Analysis/CGColorSpace.c b/clang/test/Analysis/CGColorSpace.c --- a/clang/test/Analysis/CGColorSpace.c +++ b/clang/test/Analysis/CGColorSpace.c @@ -6,9 +6,9 @@ extern void CGColorSpaceRelease(CGColorSpaceRef space); void f() { - CGColorSpaceRef X = CGColorSpaceCreateDeviceRGB(); // expected-warning{{leak}} + CGColorSpaceRef X = CGColorSpaceCreateDeviceRGB(); CGColorSpaceRetain(X); -} +} // expected-warning{{leak}} void fb() { CGColorSpaceRef X = CGColorSpaceCreateDeviceRGB(); diff --git a/clang/test/Analysis/Inputs/expected-plists/malloc-plist.c.plist b/clang/test/Analysis/Inputs/expected-plists/malloc-plist.c.plist --- a/clang/test/Analysis/Inputs/expected-plists/malloc-plist.c.plist +++ b/clang/test/Analysis/Inputs/expected-plists/malloc-plist.c.plist @@ -3764,12 +3764,12 @@ line138 - col9 + col7 file0 line138 - col9 + col7 file0 @@ -3781,7 +3781,7 @@ location line138 - col9 + col7 file0 depth1 @@ -3803,7 +3803,7 @@ location line138 - col9 + col7 file0 ExecutedLines diff --git a/clang/test/Analysis/NSString.m b/clang/test/Analysis/NSString.m --- a/clang/test/Analysis/NSString.m +++ b/clang/test/Analysis/NSString.m @@ -125,13 +125,13 @@ NSString* f7(NSString* s1, NSString* s2, NSString* s3) { - NSString* s4 = (NSString*) - CFStringCreateWithFormat(kCFAllocatorDefault, 0, // expected-warning{{leak}} - (CFStringRef) __builtin___CFStringMakeConstantString("%@ %@ (%@)"), - s1, s2, s3); + NSString *s4 = (NSString *) + CFStringCreateWithFormat(kCFAllocatorDefault, 0, + (CFStringRef)__builtin___CFStringMakeConstantString("%@ %@ (%@)"), + s1, s2, s3); CFRetain(s4); - return s4; + return s4; // expected-warning{{leak}} } NSMutableArray* f8() { @@ -202,15 +202,15 @@ } - (void)m1 { - NSString *s = [[NSString alloc] init]; // expected-warning{{leak}} - [s retain]; - [s autorelease]; -} + NSString *s = [[NSString alloc] init]; + [s retain]; + [s autorelease]; +} // expected-warning{{leak}} - (void)m2 { - NSString *s = [[[NSString alloc] init] autorelease]; // expected-warning{{leak}} - [s retain]; -} + NSString *s = [[[NSString alloc] init] autorelease]; + [s retain]; +} // expected-warning{{leak}} - (void)m3 { NSString *s = [[[NSString alloc] init] autorelease]; @@ -219,9 +219,9 @@ } - (void)m4 { - NSString *s = [[NSString alloc] init]; // expected-warning{{leak}} - [s retain]; -} + NSString *s = [[NSString alloc] init]; + [s retain]; +} // expected-warning{{leak}} - (void)m5 { NSString *s = [[NSString alloc] init]; @@ -360,9 +360,9 @@ } void test_objc_atomicCompareAndSwap_parameter_no_direct_release(NSString **old) { - NSString *s = [[NSString alloc] init]; // expected-warning{{leak}} + NSString *s = [[NSString alloc] init]; if (!objc_atomicCompareAndSwapPtr(0, s, old)) - return; + return; // expected-warning{{leak}} else [*old release]; } @@ -382,8 +382,8 @@ @end void test_isTrackedObjectType(void) { - NSString *str = [TestIsTracked newString]; // expected-warning{{Potential leak}} -} + NSString *str = [TestIsTracked newString]; +} // expected-warning{{Potential leak}} // Test isTrackedCFObjectType(). @interface TestIsCFTracked @@ -402,9 +402,9 @@ // Test @synchronized void test_synchronized(id x) { @synchronized(x) { - NSString *string = [[NSString stringWithFormat:@"%ld", (long) 100] retain]; // expected-warning {{leak}} + NSString *string = [[NSString stringWithFormat:@"%ld", (long)100] retain]; } -} +} // expected-warning {{leak}} @end void testOSCompareAndSwapXXBarrier_parameter(NSString **old) { diff --git a/clang/test/Analysis/malloc-plist.c b/clang/test/Analysis/malloc-plist.c --- a/clang/test/Analysis/malloc-plist.c +++ b/clang/test/Analysis/malloc-plist.c @@ -135,8 +135,8 @@ static void function_with_leak3(int y) { char *x = (char*)malloc(12); if (y) - y++; -}//expected-warning{{Potential leak}} + y++; //expected-warning{{Potential leak}} +} void use_function_with_leak3(int y) { function_with_leak3(y); }