Как убрать безопасные операции в небезопасном блоке?

У меня вопрос, как получить наиболее точный небезопасный блок в 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, просто хочу посмотреть, есть ли лучшие идеи.

0 ответов

Другие вопросы по тегам