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.