HeadlinesBriefing HeadlinesBriefing.com

Rust কোভেরিয়েন্স দিয়ে লাইফটাইম বাইপাস

Hacker News •
×

Hacker News-এর একটি প্রতিবেদনে Rust-এর একটি সাউন্ডনেস বাগের বর্ণনা দেওয়া হয়েছে, যেখানে কোভেরিয়েন্ট ফিল্ড অ্যাসাইনমেন্টের মাধ্যমে একটি স্ট্রাক্টের লাইফটাইম শর্ত এড়িয়ে যাওয়া সম্ভব। প্রতিবেদক একটি ছোট প্রোগ্রাম শেয়ার করেছেন, যেখানে Q<T> নামের একটি র্যাপার টাইপ ব্যবহৃত হয়েছে, যাতে একটি Option<T> রয়েছে এবং একটি Drop ইমপ্লিমেন্টেশন আছে। Drop ইমপ্লিমেন্টেশন অভ্যন্তরীণ মানটিকে একটি স্ট্যাটিক Mutex<Vec<Box<dyn Any + Send>>>-এ সরিয়ে নেয়, যা এমন একটি ধার করা মানের জন্য অসম্ভব হওয়া উচিত যা 'static হিসেবে বেঁচে থাকে না।

উদাহরণে, একটি অভ্যন্তরীণ স্কোপের ভেতরে একটি স্থানীয় String-কে রেফারেন্স হিসেবে র্যাপারে অ্যাসাইন করা হয়েছে, তাই সেই স্কোপ বন্ধ হলে ধারটি শেষ হওয়ার কথা। র্যাপারের ফিল্ডটি কোভেরিয়েন্ট হওয়ায় কম্পাইলার অ্যাসাইনমেন্টটি গ্রহণ করে, এবং তারপর রেফারেন্সটি স্থানীয় ভেরিয়েবলের জীবনকালের বাইরেও সংরক্ষণ করা যায়। প্রোগ্রামটি প্রত্যাখ্যাত না হয়ে কম্পাইল হয় এবং সম্পর্কহীন মেমরির বিষয়বস্তু প্রিন্ট করে।

AddressSanitizer-এর অধীনে চালালে প্রোগ্রামটি stack-use-after-scope ত্রুটিসহ ক্র্যাশ করে, যা নিশ্চিত করে যে ঝুলন্ত রেফারেন্সটি প্রকৃতপক্ষে ডিরেফারেন্স করা হচ্ছে। প্রতিবেদন অনুযায়ী, বর্তমান nightly বিল্ডে এবং অন্তত 1.85.0 পর্যন্ত স্থিতিশীল রিলিজে সমস্যাটি পুনরুৎপাদনযোগ্য। পোস্টের সঙ্গে স্যানিটাইজার সহ ও ছাড়া Compiler Explorer উদাহরণের লিংক রয়েছে।

এই আবিষ্কার দেখায় যে Drop-ভিত্তিক সংরক্ষণের সঙ্গে ভেরিয়েন্স কীভাবে কাজ করে সেখানে একটি সাউন্ডনেস ফাঁক রয়েছে। Rust-এর রক্ষণাবেক্ষণকারীরা এমন সমস্যাকে উচ্চ অগ্রাধিকার দেন, কারণ নিরাপদ কোড কখনোই অনির্ধারিত আচরণ তৈরি করা উচিত নয়।

উৎস: Hacker News · সারাংশ: HeadlinesBriefing