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.