[PATCH] D83961: [Analyzer] Fix bug report source locations in minimal output.

Balázs Kéri via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Jul 16 09:12:09 PDT 2020


balazske created this revision.
Herald added subscribers: cfe-commits, ASDenysPetrov, martong, Charusso, gamesh411, dkrupp, donat.nagy, Szelethus, mikhail.ramalho, a.sidorin, szepet, baloghadamsoftware, xazax.hun.
Herald added a reviewer: Szelethus.
Herald added a project: clang.

Fix of the following problem:
If the bug report equivalence class contains multiple
reports and no (minimal) analyzer output was requested
it can happen that the wrong location is used for the warning.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D83961

Files:
  clang/lib/Analysis/PathDiagnostic.cpp
  clang/lib/StaticAnalyzer/Core/BugReporter.cpp


Index: clang/lib/StaticAnalyzer/Core/BugReporter.cpp
===================================================================
--- clang/lib/StaticAnalyzer/Core/BugReporter.cpp
+++ 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,14 +3004,7 @@
 
     // If the path is empty, generate a single step path with the location
     // of the issue.
-    if (PD->path.empty()) {
-      PathDiagnosticLocation L = report->getLocation();
-      auto piece = std::make_unique<PathDiagnosticEventPiece>(
-        L, report->getDescription());
-      for (SourceRange Range : report->getRanges())
-        piece->addRange(Range);
-      PD->setEndOfPath(std::move(piece));
-    }
+    assert(!PD->path.empty() && "Path should contain at least the last piece.");
 
     PathPieces &Pieces = PD->getMutablePieces();
     if (getAnalyzerOptions().ShouldDisplayNotesAsEvents) {
Index: clang/lib/Analysis/PathDiagnostic.cpp
===================================================================
--- clang/lib/Analysis/PathDiagnostic.cpp
+++ 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())


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D83961.278512.patch
Type: text/x-patch
Size: 2571 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200716/5cee3265/attachment.bin>


More information about the cfe-commits mailing list