[clang-tools-extra] [clang-tidy] Add new check bugprone-capture-this-by-field (PR #130297)

Denis Mikhailov via cfe-commits cfe-commits at lists.llvm.org
Sat Mar 15 14:27:26 PDT 2025


================
@@ -0,0 +1,36 @@
+.. title:: clang-tidy - bugprone-capturing-this-in-member-variable
+
+bugprone-capturing-this-in-member-variable
+==========================================
+
+Finds lambda captures that capture the ``this`` pointer and store it as class
+members without handle the copy and move constructors and the assignments.
+
+Capture this in a lambda and store it as a class member is dangerous because the
+lambda can outlive the object it captures. Especially when the object is copied
+or moved, the captured ``this`` pointer will be implicitly propagated to the
+new object. Most of the time, people will believe that the captured ``this``
+pointer points to the new object, which will lead to bugs.
+
+.. code-block:: c++
+
+  struct C {
+    C() : Captured([this]() -> C const * { return this; }) {}
+    std::function<C const *()> Captured;
+  };
+
+  void foo() {
+    C v1{};
+    C v2 = v1; // v2.Captured capture v1's 'this' pointer
+    assert(v2.Captured() == v1.Captured()); // v2.Captured capture v1's 'this' pointer
+    assert(v2.Captured() == &v2); // assertion failed.
+  }
+
+Possible fixes include refactoring the function object into a class member
----------------
denzor200 wrote:

And the rest of the users who really want the class to be copyable will refactor the code in the way you suggested.

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


More information about the cfe-commits mailing list