bugprone-stringview-nullptr

检查 std::basic_string_viewconst CharT* 构造函数如何传递空参数,并在大多数情况下用默认构造函数替换它们。对于比较运算符,大括号初始化列表无法编译,因此在适当情况下使用对 .empty() 或空字符串字面量的调用。

这可以防止代码调用无条件未定义的行为。单参数 const CharT* 构造函数在取消引用其输入之前不会检查空情况。该标准计划添加一个显式删除的重载来捕获其中一些情况:wg21.link/p2166

为了捕获 NULL(它扩展为 __null)和 0 的附加情况,首先运行 modernize-use-nullptr 检查以将调用者转换为 nullptr

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

被翻译成…

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

注意

带有尾部注释“A”的源代码模式选择 (const CharT*) 构造函数重载,然后对指针进行值初始化,从而导致空指针取消引用。它恰好不包含 nullptr 字面量,但仍然在此 ClangTidy 检查的范围内。

注意

带有尾部注释“B”的源代码模式选择 (const CharT*, size_type) 构造函数,它完全有效,因为长度参数为 0。此 ClangTidy 检查不会对其进行更改。