Issue 120863
Summary [clang-tidy] Check request: don't capture `this` by a field of default copyable class
Labels clang-tidy
Assignees
Reporter denzor200
    Assume the user defined class:
```
struct A {
   std::string content;
 std::function<void()> captured;
   
   A() {
    captured = 
 [this]() { // INCORRECT
            perform();
        };
   }

   void perform() { std::cout << content << std::endl; }
};
```

Since it's copy constructor was generated by the compiler, it's behaviour might be unexpected for some user and even can produce a crash with SIGSEGV:
```
A a;
a.content = "Hello world";
a.captured();

A a1 = a;
a1.content = "Test";
a1.captured(); // will print "Hello world" which might be unexpected
```
```
auto a = std::make_unique<A>();
a->content = "Hello world";
a->captured();

auto b = std::make_unique<A>(*a);
a.reset();
b->content = "Ooooups!";
b->captured(); // UB
```

The way to fix it is to provide manually written copy constructor and assignment operator:
```
A(const A& oth)
    : content(oth.content)
    , captured([this](){perform();}) {}
A& operator=(const A& oth) {
    if (this != &oth) {
        content = oth.content;
        captured = [this](){perform();};
    }
}
```
Making you class noncopyable also protect you from the bug:
```
A(const A& oth) = delete;
A& operator=(const A& oth) = delete;
```

But before you fix it you must discover it in the code, so the clang-tidy check in bugprone section would be nice addition.

_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to