[clang] [analyzer] Trigger checkLifetimeEnd callback from CFGLifetimeEnds element (PR #201123)

Balázs Benics via cfe-commits cfe-commits at lists.llvm.org
Thu Jun 4 08:33:46 PDT 2026


================
@@ -0,0 +1,106 @@
+//===- unittests/StaticAnalyzer/CheckLifetimeEndTest.cpp ------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "CheckerRegistration.h"
+#include "Reusables.h"
+#include "clang/Frontend/CompilerInstance.h"
+#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
+#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
+#include "clang/StaticAnalyzer/Core/Checker.h"
+#include "clang/StaticAnalyzer/Core/PathSensitive/CallDescription.h"
+#include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h"
+#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
+#include "clang/StaticAnalyzer/Frontend/AnalysisConsumer.h"
+#include "clang/StaticAnalyzer/Frontend/CheckerRegistry.h"
+#include "llvm/Config/llvm-config.h"
+#include "gtest/gtest.h"
+
+namespace {
+using namespace clang;
+using namespace ento;
+
+class LifetimeEndReporter : public Checker<check::LifetimeEnd> {
+  const BugType LifetimeEndNode{this, "LifetimeEndReporter"};
+
+  bool report(CheckerContext &C, Twine Description) const {
+    ExplodedNode *Node = C.generateNonFatalErrorNode(C.getState());
+    if (!Node)
+      return false;
+
+    auto Report = std::make_unique<PathSensitiveBugReport>(
+        LifetimeEndNode, Description.str(), Node);
+    C.emitReport(std::move(Report));
+    return true;
+  }
+
+public:
+  void checkLifetimeEnd(const VarDecl *D, CheckerContext &C) const {
+    auto II = D->getIdentifier();
+    ASSERT_TRUE(II != nullptr);
----------------
steakhal wrote:

FYI if the identifier comes from a trigraph, it can't be represented by an identifier.
This is why I suggested to use the `D->getDeclName().getAsString()` because that will work all the time - albeit a bit more expensive because we need to allocate. But this is just test. It doesn't really matter. We don't usually write trigraps in declaration names and we also don't care about extra allocations in unittests.

https://github.com/llvm/llvm-project/pull/201123


More information about the cfe-commits mailing list