我目前正在编写一些不安全的代码,需要在一定程度上手动管理生存期,并将这些生存期expose 给外部用户.我一直在编写测试,虽然编写测试来验证编译代码的正确性非常容易(至少在可能出现未定义行为的情况下是这样),但我一直希望确保某些类型的不健全代码不能编译.
假设我有下面这个假想的例子:
pub struct MyBox<T> {
ptr: *mut T,
}
impl<T> MyBox<T> {
fn new(t: T) -> Self {
MyBox {
ptr: Box::into_raw(Box::new(t)),
}
}
fn get(&self) -> &T {
unsafe { &*self.ptr }
}
}
impl<T> Drop for MyBox<T> {
fn drop(&mut self) {
unsafe { Box::from_raw(self.ptr) }
}
}
fn test<'a>() -> &'a i32 {
MyBox::new(7).get()
}
我如何才能确保test
函数继续无法从Rust的测试框架编译?
显然,只是将错误的代码放到一个单独的文件中,并使用实际的测试函数作为美化的构建脚本,这是可行的,但这会变得非常繁琐和尴尬,特别是当我想测试的不只是一两个糟糕的示例时.如果有帮助,我不关心错误的细节,只关心错误是否存在.