Как отладить неверную аппаратную ошибку в небезопасном блоке ржавчины? - PullRequest
0 голосов
/ 25 января 2019

Вот код:

pub struct Node<T> {
    data: Option<T>,
    level: usize,
    forward: [Option<*mut Node<T>>; MAX_HEIGHT],
}

И я хочу повторить связанный список:

        // let next = some_node.forward[n];
        unsafe {
            loop {
                match next {
                    None => { break; }
                    Some(v) => {
                        write!(f, "{:?}", (*v).data)?;
                        break;
                    }
                }
            }
        }

Когда я использую ключевое слово unsafe, я получаю ошибку [1] 74042 illegal hardware instruction cargo run, так что, есть ли способ отладки этого небезопасного блока?

1 Ответ

0 голосов
/ 25 января 2019

unsafe - это способ сказать: «Заткнись, ржавчина, я знаю, что делаю». В этом случае вы гарантируете компилятору, что v всегда является действительным выровненным указателем на Node<T>, что индексирование массива forward разрешается в массив Option<*mut Node<T>> с размером MAX_HEIGHT. Если какое-либо из этих предположений будет нарушено, вы вернетесь в неопределенную зону поведения.

Вы отключили все средства защиты и нацелили свой компилятор на неизвестные указатели. Рациональная часть моего мозга хочет точно знать, чего вы пытаетесь достичь здесь.

Лучший совет, который я могу предложить с предоставленной информацией, - это использовать rust-gdb и шагать по вашей программе, пока ваши указатели не будут выглядеть вменяемыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...