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
