Как убрать безопасные операции в небезопасном блоке?
У меня вопрос, как получить наиболее точный небезопасный блок в Rust. В настоящее время Rust позволяет выполнять безопасные операции внутри небезопасного блока. Например, следующий код взят из библиотеки rust stdlib Vec:
pub fn push(&mut self, value: T) {
// This will panic or abort if we would allocate > isize::MAX bytes
// or if the length increment would overflow for zero-sized types.
if self.len == self.buf.capacity() {
self.reserve(1);
}
unsafe {
let end = self.as_mut_ptr().add(self.len);
ptr::write(end, value);
self.len += 1;
}
}
Здесь у нас есть 3 строки небезопасных утверждений. Однако третья линия, которая выполняет приращение, на самом деле безопасна от ржавчины.
Мой вопрос в том, как я могу получить точный небезопасный блок, например:
pub fn push(&mut self, value: T) {
// This will panic or abort if we would allocate > isize::MAX bytes
// or if the length increment would overflow for zero-sized types.
if self.len == self.buf.capacity() {
self.reserve(1);
}
unsafe {
let end = self.as_mut_ptr().add(self.len);
ptr::write(end, value);
}
self.len += 1;
}
Или есть какие-нибудь инструменты / библиотеки, которые могут помочь?
Я могу придумать простой способ постепенно сузить рамки с помощью syn crate, просто хочу посмотреть, есть ли лучшие идеи.