क्लैंग 3.9 को अस्थायी संदर्भों का पता लगाने के लिए अस्थायी संदर्भों का पता लगाएं।अस्थायी
इस कोड को यूबी (सरलीकृत कोड) है:
template <class T>
class my_optional
{
public:
bool has{ false };
T value;
const T& get_or_default(const T& def)
{
return has ? value : def;
}
};
void use(const std::string& s)
{
// ...
}
int main()
{
my_optional<std::string> m;
// ...
const std::string& s = m.get_or_default("default value");
use(s); // s is dangling if default returned
}
हम ऊपर की तरह कोड कुछ की टन है (my_optional
यह वर्णन करने के लिए सिर्फ एक सरल उदाहरण है)।
यूबी के कारण 3.9 के बाद से सभी क्लैंग कंपाइलर इस स्मृति का पुन: उपयोग करना शुरू कर देते हैं, और यह वैध व्यवहार है।
सवाल यह है कि संकलन समय पर या रनटाइम पर सैनिटाइज़र जैसे कुछ खतरनाक संदर्भों का पता लगाने के लिए कैसे? कोई clang sanitizer उन्हें पहचान सकते हैं।
अद्यतन। कृपया उत्तर न दें: "std::optional
का उपयोग करें"। ध्यान से पढ़ें: सवाल इसके बारे में नहीं है।
अपडेट 2। कृपया उत्तर न दें: "आपका कोड डिज़ाइन खराब है"। ध्यान से पढ़ें: प्रश्न कोड डिज़ाइन के बारे में नहीं है।
@ सोप्रप्रोग्रामड्यूड धन्यवाद, मुझे पता है। बिंदु यह है: स्थिर नहीं है, लेकिन 'std :: string (" डिफ़ॉल्ट मान ") 'अंतर्निहित रूप से निर्मित है, यह एक अस्थायी है, और यह उस पंक्ति के बाद मर जाता है। तो अगली पंक्ति पर 's' लटक रहा है। लाइन के अंत में – vladon
सं। स्ट्रिंग * अस्थायी * ऑब्जेक्ट _dies_। इसका संदर्भ लाइन 'उपयोग' पर लटक रहा है। – vladon
@ सोप्रप्रोग्रामड्यूड "फ़ंक्शन कॉल में संदर्भ पैरामीटर के लिए एक अस्थायी बाध्य उस फ़ंक्शन कॉल वाली पूर्ण अभिव्यक्ति के अंत तक मौजूद है: यदि फ़ंक्शन एक संदर्भ देता है, जो पूर्ण अभिव्यक्ति को पार करता है, तो यह एक खतरनाक संदर्भ बन जाता है" http://en.cppreference.com/w/cpp/language/reference_initialization#Lifetime_of_a_temporary – vladon