[clang-tools-extra] [clang-tidy] Create bugprone-public-enable-shared-from-this check (PR #102299)
Julian Schmidt via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 12 03:29:31 PDT 2024
================
@@ -0,0 +1,34 @@
+.. title:: clang-tidy - bugprone-incorrect-enable-shared-from-this
+
+bugprone-incorrect-enable-shared-from-this
+=======================================
+
+Checks if class/struct publicly derives from ``std::enable_shared_from_this``,
+because otherwise when ``shared_from_this`` is called it will throw
+``std::bad_weak_ptr``.
+
+Consider the following code:
+
+.. code-block:: c++
+ #include <memory>
+
+ class BadExample : std::enable_shared_from_this<BadExample> {
+ // warning: inheritance from std::enable_shared_from_this
+ // should be public inheritance,
+ // otherwise the internal weak_ptr won't be initialized
+ // [bugprone-incorrect-enable-shared-from-this]
----------------
5chmidti wrote:
The diagnostics of a check are normally not copy-pasted to the documentation. Maybe:
> privately inheriting from `std::enable_shared_from_this` results in an uninitialized `weak_ptr` when calling `shared_from_this`
Or add smaller comments:
```
#include <memory>
// private inheritance
class BadExample : std::enable_shared_from_this<BadExample> {
public:
// `shared_from_this` returns uninitialized `weak_ptr`
BadExample* foo() { return shared_from_this().get(); }
void bar() { return; }
};
void using_not_public() {
auto bad_example = std::make_shared<BadExample>();
auto* b_ex = bad_example->foo();
b_ex->bar();
}
```
https://github.com/llvm/llvm-project/pull/102299
More information about the cfe-commits
mailing list