bugprone-suspicious-stringview-data-usage¶
识别 std::string_view::data()
的可疑用法,这些用法可能由于字符串末尾不完整或不正确而导致读取越界数据。
当 data()
的结果传递给构造函数或函数,而没有同时传递相应的 size()
或 length()
成员函数的结果时,会发出警告。这种用法可能会导致意外的行为,特别是在假设 data()
指向的数据以空字符结尾的情况下。
由于 std::string_view
中缺少 c_str()
方法,开发人员通常会使用 data()
作为替代,尤其是在与需要空字符结尾字符串的 C API 交互时。但是,由于 data()
不保证以空字符结尾,因此如果 API 依赖于正确的空字符结尾才能正确解释字符串,这可能会导致意外的行为。
在当今的编程环境中,当隐式将 std::string_view
转换为 std::string
时,可能会出现这种情况。由于 std::string
中用于字符串视图类对象的构造函数是 explicit
,尝试将 std::string_view
传递给期望 std::string
的函数会导致编译错误。作为一种解决方法,开发人员可能会尝试使用 .data()
方法来解决编译错误,但这会引入潜在的风险。
例如
void printString(const std::string& str) {
std::cout << "String: " << str << std::endl;
}
void something(std::string_view sv) {
printString(sv.data());
}
在这个例子中,直接将 sv
传递给 printString
函数会导致编译错误,因为 std::string
构造函数是显式的。因此,开发人员可能会选择使用 sv.data()
来解决编译错误,尽管这样做会引入前面讨论的潜在风险。
- StringViewTypes¶
此选项允许用户指定自定义字符串视图类类型以供分析。它接受以分号分隔的类型名称列表或匹配这些类型的正则表达式。默认值为:::std::basic_string_view;::llvm::StringRef。
- AllowedCallees¶
指定将
.data()
的结果传递给的方法、函数或类。允许从分析中排除这些调用。接受以分号分隔的名称列表或匹配这些实体的正则表达式。默认值为:空字符串。