https://github.com/benedekaibas updated 
https://github.com/llvm/llvm-project/pull/235091

>From 22496c24a700422dc0f722058e86e40334b27d0a Mon Sep 17 00:00:00 2001
From: benedekaibas <[email protected]>
Date: Fri, 23 Oct 2026 22:02:05 +0200
Subject: [PATCH 1/2] [analyzer] Fix checker message order in theprogram state
 dump

---
 .../StaticAnalyzer/Core/CheckerManager.cpp    | 26 ++++++++----
 clang/test/Analysis/checker-order-in-dump.cpp | 41 +++++++++++++++++++
 2 files changed, 59 insertions(+), 8 deletions(-)
 create mode 100644 clang/test/Analysis/checker-order-in-dump.cpp

diff --git a/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp 
b/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp
index 6da79452d7ab01..324220e94c5f0e 100644
--- a/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp
+++ b/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp
@@ -858,11 +858,21 @@ void 
CheckerManager::runCheckersForPrintStateJson(raw_ostream &Out,
   ++Space;
   bool HasMessage = false;
 
-  // Store the last CheckerTag.
-  const void *LastCT = nullptr;
+  std::vector<CheckerBackend *> CheckerBackends;
   for (const auto &CT : CheckerTags) {
+    CheckerBackend *CB = CT.second.get();
+    CheckerBackends.push_back(CB);
+  }
+  llvm::sort(CheckerBackends,
+             [](const CheckerBackend *First, const CheckerBackend *Last) {
+               return First->getDebugTag() < Last->getDebugTag();
+             });
+
+  // Store the last CheckerBackend.
+  const void *LastCB = nullptr;
+  for (const auto &CB : CheckerBackends) {
     // See whether the current checker has a message.
-    CT.second->printState(TempOut, State, /*NL=*/NewLine.c_str(), /*Sep=*/"");
+    CB->printState(TempOut, State, /*NL=*/NewLine.c_str(), /*Sep=*/"");
 
     if (TempBuf.empty())
       continue;
@@ -872,24 +882,24 @@ void 
CheckerManager::runCheckersForPrintStateJson(raw_ostream &Out,
       HasMessage = true;
     }
 
-    LastCT = &CT;
+    LastCB = &CB;
     TempBuf.clear();
   }
 
-  for (const auto &CT : CheckerTags) {
+  for (const auto &CB : CheckerBackends) {
     // See whether the current checker has a message.
-    CT.second->printState(TempOut, State, /*NL=*/NewLine.c_str(), /*Sep=*/"");
+    CB->printState(TempOut, State, /*NL=*/NewLine.c_str(), /*Sep=*/"");
 
     if (TempBuf.empty())
       continue;
 
-    Indent(Out, Space, IsDot) << "{ \"checker\": \"" << 
CT.second->getDebugTag()
+    Indent(Out, Space, IsDot) << "{ \"checker\": \"" << CB->getDebugTag()
                               << "\", \"messages\": [" << NL;
     Indent(Out, InnerSpace, IsDot)
         << '\"' << TempBuf.str().trim() << '\"' << NL;
     Indent(Out, Space, IsDot) << "]}";
 
-    if (&CT != LastCT)
+    if (&CB != LastCB)
       Out << ',';
     Out << NL;
 
diff --git a/clang/test/Analysis/checker-order-in-dump.cpp 
b/clang/test/Analysis/checker-order-in-dump.cpp
new file mode 100644
index 00000000000000..325acabd545b0d
--- /dev/null
+++ b/clang/test/Analysis/checker-order-in-dump.cpp
@@ -0,0 +1,41 @@
+// RUN: %clang_analyze_cc1 -analyzer-checker=core,cplusplus.Move \
+// RUN:   -analyzer-checker=core.LifetimeModeling,debug.ExprInspection \
+// RUN:   -analyzer-config cfg-lifetime=true \
+// RUN:   -verify %s 2>&1 | FileCheck %s
+
+#include "Inputs/system-header-simulator-cxx.h"
+
+void clang_analyzer_printState();
+
+class A {
+public:
+  A() = default;
+  A(const A&);
+  A(A &&);
+  int foo() const;
+};
+
+void testCheckersOrderInCFGDump() {
+  {
+    A a;
+    A *p = &a;
+    A b = std::move(a);
+
+    clang_analyzer_printState();
+    (void)p;
+// CHECK:      "checker_messages": [
+// CHECK-NEXT:   { "checker": "core.LifetimeModeling", "messages": [
+// CHECK-NEXT:     "LifetimeBound bindings:",
+// CHECK-NEXT:     " Origin &a contains Loan a",
+// CHECK-NEXT:     ""
+// CHECK-NEXT:   ]},
+// CHECK-NEXT:   { "checker": "cplusplus.Move", "messages": [
+// CHECK-NEXT:     "Moved-from objects :",
+// CHECK-NEXT:     "a: moved",
+// CHECK-NEXT:     ""
+// CHECK-NEXT:   ]}
+// CHECK-NEXT: ]
+
+    a.foo(); // expected-warning {{Method called on moved-from object 'a'}}
+  }
+}

>From 9aaa1ea6df35ad9c253c95315d91ac8d3b9178d7 Mon Sep 17 00:00:00 2001
From: benedekaibas <[email protected]>
Date: Sat, 24 Oct 2026 15:50:25 +0200
Subject: [PATCH 2/2] Fix checker name in RUN and CHECK-NEXT lines.

---
 clang/test/Analysis/checker-order-in-dump.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/clang/test/Analysis/checker-order-in-dump.cpp 
b/clang/test/Analysis/checker-order-in-dump.cpp
index 325acabd545b0d..54f038eb3c401b 100644
--- a/clang/test/Analysis/checker-order-in-dump.cpp
+++ b/clang/test/Analysis/checker-order-in-dump.cpp
@@ -1,5 +1,5 @@
 // RUN: %clang_analyze_cc1 -analyzer-checker=core,cplusplus.Move \
-// RUN:   -analyzer-checker=core.LifetimeModeling,debug.ExprInspection \
+// RUN:   -analyzer-checker=alpha.core.LifetimeModeling,debug.ExprInspection \
 // RUN:   -analyzer-config cfg-lifetime=true \
 // RUN:   -verify %s 2>&1 | FileCheck %s
 
@@ -24,7 +24,7 @@ void testCheckersOrderInCFGDump() {
     clang_analyzer_printState();
     (void)p;
 // CHECK:      "checker_messages": [
-// CHECK-NEXT:   { "checker": "core.LifetimeModeling", "messages": [
+// CHECK-NEXT:   { "checker": "alpha.core.LifetimeModeling", "messages": [
 // CHECK-NEXT:     "LifetimeBound bindings:",
 // CHECK-NEXT:     " Origin &a contains Loan a",
 // CHECK-NEXT:     ""

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to