2017-11-13 2 views
16

Dieser baumelt Zeiger | Referenzbeispiel:std :: string_view auf temporären String - Fang von 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; 
} 

Adresse Sanitizer es nicht fangen kann, zumindest mit den Standardoptionen. Ist es möglich, solche Fehler mit Adressdesinfizierer zu fangen?

UPD.

diesen Fehler des Berichts:

+0

könnte nicht alles entweder feststellen, senden nur durch Stapeladresse Erkennungen, nicht zerstört temporäre Rückgabewerte. – Laurijssen

Antwort

3

Meine Vermutung (Sie haben keine Compiler-Version zur Verfügung gestellt) ist, dass operator << extern realisiert wird, so Asan es nicht sanieren kann und Fehler erkennen (es sei denn, Sie erstellen libstdC++ mit Asan neu). Hier ist, was ich mit meinem GCC bekommen 6.2 (I leicht modifizierte repro, wie ich keinen Zugriff auf c++1z haben):

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

Ersetzen Sie 'std :: cout << bar' durch zB' std :: string bar2 = bar; '. – vladon

+2

@vladon Dies ist eine sehr unterschiedliche Situation. Es funktioniert für mich (d. H. Meldet 'heap-use-after-free'), solange die Zeichenfolge länger als 16 Zeichen ist. Für eine kürzere Zeichenfolge erhalten Sie SSO, d. H. Daten werden auf dem Stapel gehalten, so dass Asan keine Heap-Fehler mehr erkennen kann. – yugr

Verwandte Themen