Разыменование необработанного указателя с явной аннотацией в Rust - PullRequest
0 голосов
/ 07 декабря 2018

Я писал небезопасный фрагмент кода, чтобы эмулировать, как C выделил бы память для int.Код выделяет память для типа isize, присваивает 0 переменной указателя, а затем бесконечно увеличивает значение по адресу каждую секунду

use std::process;
use std::{thread, time};
use std::alloc::{alloc, Layout};

fn main() {
    unsafe {
        let layout = Layout::new::<isize>();
        let p = alloc(layout);
        println!("({}) address pointed to by p: {:p}", process::id(), p);
        *(p as *mut isize) = 0;
        loop {
            thread::sleep(time::Duration::from_millis(1000));
            *(p as *mut isize) += 1;
            println!("({}) p: {}", process::id(), *(p as *mut isize));
        }
    }
}

Однако для каждого *(p as *mut size), который я мог бы заменитьс *p без жалоб компилятора (т. е. *p = 0;), поэтому я предположил, что это было правильно выведено.Мне нужна помощь, чтобы объяснить разницу и в каком случае может потребоваться явная аннотация типа.

1 Ответ

0 голосов
/ 07 декабря 2018

Это не правильно выведено.alloc возвращает указатель на u8, который может быть установлен в 0 или увеличен, поэтому компилятор не будет жаловаться.Тем не менее, он будет равен 255 вместо 4G (или что-то еще, если вы работаете в 64-битной системе).

...