.. title:: clang-tidy - bugprone-stringview-nullptr
bugprone-stringview-nullptr
===========================
Checks for various ways that the ``const CharT*`` constructor of
``std::basic_string_view`` can be passed a null argument and replaces them
with the default constructor in most cases. For the comparison operators,
braced initializer list does not compile so instead a call to ``.empty()``
or the empty string literal are used, where appropriate.
This prevents code from invoking behavior which is unconditionally undefined.
The single-argument ``const CharT*`` constructor does not check for the null
case before dereferencing its input. The standard is slated to add an
explicitly-deleted overload to catch some of these cases: wg21.link/p2166
To catch the additional cases of ``NULL`` (which expands to ``__null``) and
``0``, first run the ``modernize-use-nullptr`` check to convert the callers to
``nullptr``.
.. code-block:: c++
std::string_view sv = nullptr;
sv = nullptr;
bool is_empty = sv == nullptr;
bool isnt_empty = sv != nullptr;
accepts_sv(nullptr);
accepts_sv({{}}); // A
accepts_sv({nullptr, 0}); // B
is translated into...
.. code-block:: c++
std::string_view sv = {};
sv = {};
bool is_empty = sv.empty();
bool isnt_empty = !sv.empty();
accepts_sv("");
accepts_sv(""); // A
accepts_sv({nullptr, 0}); // B
.. note::
The source pattern with trailing comment "A" selects the ``(const CharT*)``
constructor overload and then value-initializes the pointer, causing a null
dereference. It happens to not include the ``nullptr`` literal, but it is
still within the scope of this ClangTidy check.
.. note::
The source pattern with trailing comment "B" selects the
``(const CharT*, size_type)`` constructor which is perfectly valid, since the
length argument is ``0``. It is not changed by this ClangTidy check.