HeadlinesBriefing HeadlinesBriefing.com

Rust कोवेरिएंट असाइनमेंट से लाइफटाइम बाईपास

Hacker News •
×

Hacker News पर एक रिपोर्ट में Rust में एक soundness बग का वर्णन किया गया है, जिसमें कोवेरिएंट फ़ील्ड असाइनमेंट के माध्यम से किसी struct की लाइफटाइम आवश्यकताओं को बायपास किया जा सकता है। रिपोर्ट करने वाले ने एक छोटा प्रोग्राम साझा किया है जो एक रैपर टाइप Q<T> का उपयोग करता है, जिसमें एक Drop इम्प्लीमेंटेशन वाला Option<T> होता है। Drop इम्प्लीमेंटेशन निहित मान को एक स्टैटिक Mutex<Vec<Box<dyn Any + Send>>> में ले जाता है, जो उस उधार लिए गए मान के लिए असंभव होना चाहिए जो 'static के लिए जीवित नहीं है।

उदाहरण में, एक स्थानीय String को एक आंतरिक स्कोप के भीतर रैपर में संदर्भ द्वारा असाइन किया गया है, इसलिए वह उधार उस स्कोप के बंद होने पर समाप्त हो जाना चाहिए। चूंकि रैपर का फ़ील्ड कोवेरिएंट है, कंपाइलर असाइनमेंट को स्वीकार कर लेता है, और फिर संदर्भ को स्थानीय चर के जीवनकाल से आगे संग्रहीत किया जा सकता है। प्रोग्राम कंपाइल हो जाता है और अस्वीकार होने के बजाय असंबंधित मेमोरी सामग्री प्रिंट करता है।

AddressSanitizer के तहत चलाने पर, प्रोग्राम stack-use-after-scope त्रुटि के साथ क्रैश हो जाता है, जो पुष्टि करता है कि लटकता हुआ संदर्भ वास्तव में डीरेफ़रेंस किया जाता है। रिपोर्ट के अनुसार, यह समस्या वर्तमान nightly बिल्ड्स में और कम से कम 1.85.0 तक की स्थिर रिलीज़ में पुन: उत्पन्न की जा सकती है। पोस्ट के साथ sanitizers के साथ और बिना sanitizers के Compiler Explorer उदाहरणों के लिंक भी दिए गए हैं।

यह खोज बताती है कि Drop-आधारित संग्रहण के साथ variance किस तरह परस्पर क्रिया करता है, इसमें एक soundness छेद है। यह ऐसी समस्या है जिसे Rust के maintainers उच्च प्राथमिकता मानते हैं, क्योंकि सुरक्षित कोड को कभी भी undefined behavior उत्पन्न नहीं करना चाहिए।

स्रोत: Hacker News · HeadlinesBriefing द्वारा सारांशित