2017-11-13 15 views
16

này được treo lủng lẳng con trỏ | dụ tham khảo:std :: string_view trên chuỗi tạm thời - bắt bởi 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; 
} 

Địa chỉ khử trùng không thể bắt nó, ít nhất là với các tùy chọn mặc định. Có thể bắt các lỗi như vậy với dung dịch vệ sinh không?

UPD.

Báo cáo lỗi này:

+0

couldnt tìm thấy bất cứ điều gì, hoặc, chỉ trả lại bằng cách nhận diện đống địa chỉ, không destructed giá trị trả lại tạm thời. – Laurijssen

Trả lời

3

tôi đoán (bạn chưa cung cấp phiên bản trình biên dịch) là operator << được thực hiện bên ngoài để Asan không thể khử trùng nó và phát hiện lỗi (trừ khi bạn xây dựng lại libstdC++ với Asan). Dưới đây là những gì tôi nhận được với GCC của tôi 6.2 (tôi chút thay đổi repro như tôi không có quyền truy cập vào 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> >&) 
+0

Thay thế 'std :: cout << bar' bằng, ví dụ:' std :: string bar2 = bar; '. – vladon

+2

@vladon Đây là tình huống rất khác. Nó hoạt động đối với tôi (tức là báo cáo 'đống-sử dụng-sau-miễn phí') miễn là chuỗi dài hơn 16 ký tự. Đối với chuỗi ngắn hơn, bạn nhận được SSO tức là dữ liệu được lưu trữ trên ngăn xếp để Asan không còn có thể phát hiện lỗi heap. – yugr

Các vấn đề liên quan