【发布时间】:2023-02-05 07:11:15
【问题描述】:
给出下面的代码 sn-p:
use std::{io::BufWriter, pin::Pin};
pub struct SelfReferential {
pub writer: BufWriter<&'static mut [u8]>, // borrowed from buffer
pub buffer: Pin<Box<[u8]>>,
}
#[cfg(test)]
mod tests {
use std::io::Write;
use super::*;
fn init() -> SelfReferential {
let mut buffer = Pin::new(vec![0; 12].into_boxed_slice());
let writer = unsafe { buffer.as_mut().get_unchecked_mut() };
let writer = unsafe { (writer as *mut [u8]).as_mut().unwrap() };
let writer = BufWriter::new(writer);
SelfReferential { writer, buffer }
}
#[test]
fn move_works() {
let mut sr = init();
sr.writer.write(b"hello ").unwrap();
sr.writer.flush().unwrap();
let mut slice = &mut sr.buffer[6..];
slice.write(b"world!").unwrap();
assert_eq!(&sr.buffer[..], b"hello world!".as_ref());
let mut sr_moved = sr;
sr_moved.writer.write(b"W").unwrap();
sr_moved.writer.flush().unwrap();
assert_eq!(&sr_moved.buffer[..], b"hello World!".as_ref());
}
}
第一个问题:将'static生命周期分配给BufWriter中的可变切片引用是否可以?从技术上讲,它绑定到结构实例本身的生命周期,据我所知,没有安全的方法可以使它无效。
第二个问题:除了这种类型的不安全实例化这一事实,在测试示例中,在底层缓冲区中创建了两个可变引用,是否还有与这种“单一”(由于缺乏更好的词)类型相关的任何其他潜在危险?
【问题讨论】:
标签: rust undefined-behavior unsafe