在 Rust 借用检查器中发现 11 岁的不安全性漏洞
在以下代码中:use std :: sync :: Mutex ; static KEPT : Mutex < Vec < Box < dyn std :: any :: Any + Send > > > = Mutex :: new ( Vec :: new ( ) ) ; struct Q < T : ' static + Send > ( Option < T > ) ; impl < T : ' static + Send > Drop for 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 ( "hello world, this is long enough" ) ; let mut q = Q ( None ) ; q . 0 = Some ( & l ) ; } let _z = String :: from ( "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" ) ; let k = KEPT . lock ( ) . unwrap ( ) ; println ! ( "{}" , k [ 0 ] . downcast_ref :: < & ' static String > ( ) . unwrap ( ) ) ; } 我预期会发生这种情况:程序不被接受。相反,发生的情况是:程序编译并打印 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 。使用 asan 时,程序将崩溃并出现 AddressSanitizer: stack-use-after-scope。当前 nightly 上的元问题,以及至少在 1.85.0 的稳定版本上都存在。Godbolt 使用 asan: https://rust.godbolt.org/z/83MvfbKde。Godbolt 不使用 asan: https://rust.godbolt.org/z/GsGdqqMWe
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡