bugprone-stringview-nullptr¶
检查 std::basic_string_view
的 const 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 检查不会对其进行更改。