readability-ambiguous-smartptr-reset-call¶
Finds potentially erroneous calls to reset method on smart pointers when
the pointee type also has a reset method. Having a reset method in
both classes makes it easy to accidentally make the pointer null when
intending to reset the underlying object.
struct Resettable {
void reset() { /* Own reset logic */ }
};
auto ptr = std::make_unique<Resettable>();
ptr->reset(); // Calls underlying reset method
ptr.reset(); // Makes the pointer null
Both calls are valid C++ code, but the second one might not be what the
developer intended, as it destroys the pointed-to object rather than resetting
its state. It’s easy to make such a typo because the difference between
. and -> is really small.
The recommended approach is to make the intent explicit by using either member access or direct assignment:
std::unique_ptr<Resettable> ptr = std::make_unique<Resettable>();
(*ptr).reset(); // Clearly calls underlying reset method
ptr = nullptr; // Clearly makes the pointer null
The default smart pointers and classes that are considered are
std::unique_ptr, std::shared_ptr, boost::shared_ptr. To specify
other smart pointers or other classes use the SmartPointers option.
Note
The check may emit invalid fix-its and misleading warning messages when
specifying custom smart pointers or other classes in the
SmartPointers option. For example, boost::scoped_ptr does not
have an operator= which makes fix-its invalid.
Note
Automatic fix-its are enabled only if clang-tidy is invoked with the –fix-notes option.
Options¶
- SmartPointers¶
Semicolon-separated list of fully qualified class names of custom smart pointers. Default value is ::std::unique_ptr;::std::shared_ptr; ::boost::shared_ptr.