2017-11-13 11 views
16

द्वारा इस झूलते है सूचक | संदर्भ उदाहरण:std :: अस्थायी स्ट्रिंग पर string_view - पकड़ आसन

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

पता प्रक्षालक, यह नहीं पकड़ सकते तो कम से कम डिफ़ॉल्ट विकल्पों के साथ। क्या पता sanitizer के साथ ऐसी त्रुटियों को पकड़ना संभव है?

यूपीडी।

इस बग रिपोर्ट किया गया:

+0

सके या तो कुछ भी मिल जाए, केवल ढेर पते detections, नहीं विलुप्त अस्थायी वापसी मूल्यों से वापसी: यहाँ क्या मैं अपने जीसीसी 6.2 (मैं थोड़ा संशोधित रेप्रो के रूप में मैं c++1z लिए पहुँच नहीं है) के साथ मिलता है। – Laurijssen

उत्तर

3

मेरा अनुमान है (आप संकलक संस्करण प्रदान नहीं की है) कि operator << बाहर से लागू किया जाता है तो आसन यह स्वच्छ नहीं कर सकता है और त्रुटि का पता लगाएं (जब तक आप आसन के साथ libstdC++ का पुनर्निर्माण नहीं करते)।

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

'std :: cout << bar' को बदलें, उदाहरण के लिए,' std :: string bar2 = bar; '। – vladon

+2

@vladon यह बहुत अलग स्थिति है। यह मेरे लिए काम करता है (यानी रिपोर्ट 'ढेर-उपयोग-बाद-मुक्त') जब तक स्ट्रिंग 16 वर्णों से अधिक लंबी हो। छोटी स्ट्रिंग के लिए आपको एसएसओ मिलता है यानी डेटा स्टैक पर रखा जाता है ताकि आसन अब ढेर त्रुटियों का पता लगा सके। – yugr

संबंधित मुद्दे