From: Ted Kremenek Date: Fri, 7 Sep 2012 22:24:24 +0000 (+0000) Subject: Attempt to make the PathDiagnostic emission order more deterministic by X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b4b4523cc52bebc5ed47cc501959ab31286a1065;p=clang Attempt to make the PathDiagnostic emission order more deterministic by looking at PathPieces. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@163427 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Core/PathDiagnostic.cpp b/lib/StaticAnalyzer/Core/PathDiagnostic.cpp index d010a668d9..15a6635062 100644 --- a/lib/StaticAnalyzer/Core/PathDiagnostic.cpp +++ b/lib/StaticAnalyzer/Core/PathDiagnostic.cpp @@ -208,6 +208,41 @@ void PathDiagnosticConsumer::HandlePathDiagnostic(PathDiagnostic *D) { namespace { + +static llvm::Optional comparePiece(PathDiagnosticPiece &X, + PathDiagnosticPiece &Y) { + PathDiagnosticPiece::Kind XK = X.getKind(), YK = Y.getKind(); + if (XK != YK) { + return XK < YK; + } + FullSourceLoc XL = X.getLocation().asLocation(); + FullSourceLoc YL = Y.getLocation().asLocation(); + if (XL < YL) + return true; + if (YL < XL) + return false; + const std::string &XS = X.getString(); + const std::string &YS = Y.getString(); + if (XS != YS) + return XS < YS; + return llvm::Optional(); +} + +static bool comparePathPieces(const PathPieces &X, const PathPieces &Y) { + if (X.size() < Y.size()) + return true; + if (X.size() > Y.size()) + return false; + // Compare individual parts of the path. + assert(X.size() == Y.size()); + for (unsigned i = 0, n = X.size(); i < n; ++i) { + llvm::Optional B = comparePiece(*X[i], *Y[i]); + if (B.hasValue()) + return B.getValue(); + } + return false; +} + struct CompareDiagnostics { // Compare if 'X' is "<" than 'Y'. bool operator()(const PathDiagnostic *X, const PathDiagnostic *Y) const { @@ -216,7 +251,7 @@ struct CompareDiagnostics { const FullSourceLoc &YLoc = Y->getLocation().asLocation(); if (XLoc < YLoc) return true; - if (XLoc != YLoc) + if (YLoc < XLoc) return false; // Next, compare by bug type. @@ -235,8 +270,8 @@ struct CompareDiagnostics { if (XDesc != YDesc) return false; - // FIXME: Further refine by comparing PathDiagnosticPieces? - return false; + // Fall back to comparing path pieces. + return comparePathPieces(X->path, Y->path); } }; } diff --git a/test/Analysis/retain-release.m b/test/Analysis/retain-release.m index 9638d64817..ee7112443e 100644 --- a/test/Analysis/retain-release.m +++ b/test/Analysis/retain-release.m @@ -1924,7 +1924,6 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) { } // CHECK: -// CHECK: // CHECK: diagnostics // CHECK-NEXT: // CHECK-NEXT: @@ -12752,10 +12751,44 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) { // CHECK-NEXT: path // CHECK-NEXT: // CHECK-NEXT: +// CHECK-NEXT: kindcontrol +// CHECK-NEXT: edges +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: start +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line838 +// CHECK-NEXT: col3 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line838 +// CHECK-NEXT: col3 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: end +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line839 +// CHECK-NEXT: col3 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: line839 +// CHECK-NEXT: col3 +// CHECK-NEXT: file0 +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: +// CHECK-NEXT: // CHECK-NEXT: kindevent // CHECK-NEXT: location // CHECK-NEXT: -// CHECK-NEXT: line838 +// CHECK-NEXT: line839 // CHECK-NEXT: col3 // CHECK-NEXT: file0 // CHECK-NEXT: @@ -12763,12 +12796,12 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line838 +// CHECK-NEXT: line839 // CHECK-NEXT: col3 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line838 +// CHECK-NEXT: line839 // CHECK-NEXT: col18 // CHECK-NEXT: file0 // CHECK-NEXT: @@ -12776,15 +12809,15 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) { // CHECK-NEXT: // CHECK-NEXT: depth0 // CHECK-NEXT: extended_message -// CHECK-NEXT: Calling 'NoCopyString' +// CHECK-NEXT: Calling 'noCopyString' // CHECK-NEXT: message -// CHECK-NEXT: Calling 'NoCopyString' +// CHECK-NEXT: Calling 'noCopyString' // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: kindevent // CHECK-NEXT: location // CHECK-NEXT: -// CHECK-NEXT: line833 +// CHECK-NEXT: line834 // CHECK-NEXT: col1 // CHECK-NEXT: file0 // CHECK-NEXT: @@ -12802,12 +12835,12 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) { // CHECK-NEXT: start // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line833 +// CHECK-NEXT: line834 // CHECK-NEXT: col1 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line833 +// CHECK-NEXT: line834 // CHECK-NEXT: col1 // CHECK-NEXT: file0 // CHECK-NEXT: @@ -12815,12 +12848,12 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) { // CHECK-NEXT: end // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line833 +// CHECK-NEXT: line834 // CHECK-NEXT: col30 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line833 +// CHECK-NEXT: line834 // CHECK-NEXT: col35 // CHECK-NEXT: file0 // CHECK-NEXT: @@ -12836,12 +12869,12 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) { // CHECK-NEXT: start // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line833 +// CHECK-NEXT: line834 // CHECK-NEXT: col30 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line833 +// CHECK-NEXT: line834 // CHECK-NEXT: col35 // CHECK-NEXT: file0 // CHECK-NEXT: @@ -12849,12 +12882,12 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) { // CHECK-NEXT: end // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line833 +// CHECK-NEXT: line834 // CHECK-NEXT: col37 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line833 +// CHECK-NEXT: line834 // CHECK-NEXT: col37 // CHECK-NEXT: file0 // CHECK-NEXT: @@ -12866,7 +12899,7 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) { // CHECK-NEXT: kindevent // CHECK-NEXT: location // CHECK-NEXT: -// CHECK-NEXT: line833 +// CHECK-NEXT: line834 // CHECK-NEXT: col37 // CHECK-NEXT: file0 // CHECK-NEXT: @@ -12874,12 +12907,12 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line833 +// CHECK-NEXT: line834 // CHECK-NEXT: col37 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line833 +// CHECK-NEXT: line834 // CHECK-NEXT: col59 // CHECK-NEXT: file0 // CHECK-NEXT: @@ -12895,7 +12928,7 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) { // CHECK-NEXT: kindevent // CHECK-NEXT: location // CHECK-NEXT: -// CHECK-NEXT: line838 +// CHECK-NEXT: line839 // CHECK-NEXT: col3 // CHECK-NEXT: file0 // CHECK-NEXT: @@ -12903,12 +12936,12 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line838 +// CHECK-NEXT: line839 // CHECK-NEXT: col3 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: -// CHECK-NEXT: line838 +// CHECK-NEXT: line839 // CHECK-NEXT: col18 // CHECK-NEXT: file0 // CHECK-NEXT: @@ -12916,43 +12949,9 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) { // CHECK-NEXT: // CHECK-NEXT: depth1 // CHECK-NEXT: extended_message -// CHECK-NEXT: Returning from 'NoCopyString' +// CHECK-NEXT: Returning from 'noCopyString' // CHECK-NEXT: message -// CHECK-NEXT: Returning from 'NoCopyString' -// CHECK-NEXT: -// CHECK-NEXT: -// CHECK-NEXT: kindcontrol -// CHECK-NEXT: edges -// CHECK-NEXT: -// CHECK-NEXT: -// CHECK-NEXT: start -// CHECK-NEXT: -// CHECK-NEXT: -// CHECK-NEXT: line838 -// CHECK-NEXT: col3 -// CHECK-NEXT: file0 -// CHECK-NEXT: -// CHECK-NEXT: -// CHECK-NEXT: line838 -// CHECK-NEXT: col3 -// CHECK-NEXT: file0 -// CHECK-NEXT: -// CHECK-NEXT: -// CHECK-NEXT: end -// CHECK-NEXT: -// CHECK-NEXT: -// CHECK-NEXT: line839 -// CHECK-NEXT: col3 -// CHECK-NEXT: file0 -// CHECK-NEXT: -// CHECK-NEXT: -// CHECK-NEXT: line839 -// CHECK-NEXT: col3 -// CHECK-NEXT: file0 -// CHECK-NEXT: -// CHECK-NEXT: -// CHECK-NEXT: -// CHECK-NEXT: +// CHECK-NEXT: Returning from 'noCopyString' // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: kindcontrol @@ -23804,3 +23803,4 @@ void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: +// CHECK-NEXT: \ No newline at end of file