我试图用一个向量作为缓冲这样的,我想知道是否有一种方法可以采取从载体片没有增长它,所以像这样的工作,代码:
fn example(r: Read) {
let buffer: Vec<u8> = Vec::with_capacity(1024);
let slice: &mut[u8] = &mut buffer;
r.read(slice); // doesnt work since the slice has length zero
}
Run Code Online (Sandbox Code Playgroud)
如果只占用一部分容量,那么您将拥有一片未初始化的数据。这是不安全的。
您可以使用Vec的set_len。然而
这是不安全的。读取数据是内存安全的,但set_len可能不是其他类型的向量或滥用。溢出检查和正确清理很重要。
这很可能是一个重大的安全漏洞。
如果使用非基本类型,则需要考虑紧急情况安全性。
这样做的基本方法是
unsafe {
buffer.set_len(buffer.capacity());
let new_len = try!(r.read(slice));
buffer.set_len(cmp::min(buffer.len(), new_len));
}
Run Code Online (Sandbox Code Playgroud)
的cmp::min,如果你不完全信任是需要read的实现,因为不正确的输出可能会导致过大的设定长度。