اشکالات ناسالم 11 ساله در Rust rorow checker پیدا شد
آدرس مقاله: https://github.com/rust-lang/rust/issues/164250 آدرس نظرات: https://news.ycombinator.com/item?id=50069499 امتیاز: 288 # نظرات: 153
در کد زیر:
`` زنگ زدگی استفاده از std::sync::Mutex; static KEPT: Mutex<Vec<Box<dyn std::any::Any + Send>>> = Mutex::new(Vec::new()); struct Q<T: 'static + Send>(گزینه<T>); impl<T: 'static + Send> Drop برای Q<T> { fn drop(&mut self) { if let Some(t) = self.0.take() { KEPT.lock().unwrap().push(Box::new(t)); } } } fn main() { { let l = String::from("سلام دنیا، این به اندازه کافی طولانی است"); اجازه دهید mut q = Q(هیچکدام); q.0 = Some(&l); } اجازه دهید _z = رشته::from("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); اجازه دهید k = KEPT.lock().unwrap(); println!("{}", k[0].downcast_ref::<&'static String>().unwrap()); } ```
انتظار داشتم این اتفاق بیفتد: برنامه پذیرفته نمی شود
در عوض، این اتفاق افتاد: برنامه «XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX» را کامپایل و چاپ میکند. با asan، برنامه با «AddressSanitizer: stack-use-after-scope» خراب می شود.
### متا
شماره در شبانه جاری است و حداقل تا 1.85.0 پایین است
Godbolt با آسان: https://rust.godbolt.org/z/83MvfbKde Godbolt بدون آسان: https://rust.godbolt.org/z/GsGdqqMWe
متن اصلی (انگلیسی)
11 year old unsoundness bugs found in Rust borrow checker
Article URL: https://github.com/rust-lang/rust/issues/164250 Comments URL: https://news.ycombinator.com/item?id=50069499 Points: 288 # Comments: 153