std::string_view 在临时字符串上 - 由 ASan 捕获



这是悬空指针|参考示例:

#include <string>
#include <string_view>
#include <iostream>
std::string foo() {
    return "test";
}
int main() {
    std::string_view bar = foo(); // bar is pointed to destructed string
    std::cout << bar << std::endl;
}

地址清理器无法捕获它,至少在默认选项下是这样。是否可以使用地址清理器捕获此类错误?

上。

报告了此错误:

  • https://bugs.llvm.org/show_bug.cgi?id=35285
  • https://github.com/google/sanitizers/issues/879

我的猜测(您没有提供编译器版本(是operator <<是在外部实现的,因此Asan无法对其进行清理并检测错误(除非您使用Asan重建libstdc++(。这是我从GCC 6.2中获得的(我稍微修改了重现,因为我无法访问c++1z(:

  call    operator delete(void*)
.L17:
  movq    %rbx, %rsi
  movl    std::cout, %edi
  call    std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
  call    std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)

最新更新