Sebuah laporan di Hacker News menjelaskan bug soundness di Rust, yakni syarat masa hidup (lifetime) sebuah struct dapat dilewati melalui penugasan field kovarian. Pelapor membagikan program kecil yang menggunakan tipe pembungkus, Q<T>, yang menyimpan Option<T> dengan implementasi Drop. Implementasi Drop memindahkan nilai yang dikandung ke dalam Mutex<Vec<Box<dyn Any + Send>>> statis, yang seharusnya mustahil untuk nilai yang dipinjam dan tidak hidup selama 'static.
Dalam contoh tersebut, sebuah String lokal ditugaskan secara referensi ke dalam pembungkus di dalam scope bagian dalam, sehingga peminjaman seharusnya berakhir ketika scope itu ditutup. Karena field pembungkus bersifat kovarian, compiler menerima penugasan tersebut, dan referensi kemudian dapat disimpan melampaui masa hidup variabel lokal. Program tersebut terkompilasi dan mencetak isi memori yang tidak relevan, alih-alih ditolak.
Ketika dijalankan di bawah AddressSanitizer, program mengalami crash dengan galat stack-use-after-scope, yang memastikan bahwa referensi menggantung benar-benar didereferensi. Menurut laporan tersebut, masalah ini dapat direproduksi pada build nightly terkini dan pada rilis stabil hingga setidaknya 1.85.0. Unggahan itu disertai tautan ke contoh Compiler Explorer dengan dan tanpa sanitizer.
Temuan ini menunjukkan adanya celah soundness dalam cara variance berinteraksi dengan penyimpanan berbasis Drop. Masalah semacam ini biasanya diprioritaskan tinggi oleh para maintainer Rust, karena kode aman seharusnya tidak pernah menghasilkan perilaku tidak terdefinisi.
Sumber: Hacker News · Diringkas oleh HeadlinesBriefing