临时字符串上的std :: string_view - 由ASan

时间:2017-11-13 09:34:24

标签: c++ c++17 address-sanitizer sanitizer

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

#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;
}

地址清理程序无法捕获它,至少使用默认选项。 是否可以通过地址消毒剂来捕获此类错误?

UPD。

报告了这个错误:

1 个答案:

答案 0 :(得分:3)

我的猜测(你没有提供编译器版本)是operator <<是在外部实现的,所以Asan无法清理它并检测错误(除非你用Asan重建libstdc ++)。以下是我使用GCC 6.2获得的内容(由于我无法访问c++1z,因此我略微修改了repro):

  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> >&)