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() 的结果传递给的方法、函数或类。允许从分析中排除这些调用。接受以分号分隔的名称列表或匹配这些实体的正则表达式。默认值为:空字符串。