如何调试生锈不安全块中的非法硬件指令错误?

时间:2019-01-25 02:20:21

标签: rust

代码如下:

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 :(得分:2)

unsafe是一种表达方式,“闭嘴,,我知道自己在做什么”。在这种情况下,您要确保编译器确保v始终是指向Node<T>的有效对齐指针,forward的数组索引可以解析为Option<*mut Node<T>>的数组大小为MAX_HEIGHT。如果违反了这些假设中的任何一个,您将回到未定义的行为领域。

您已经关闭所有安全措施,并将编译器对准未知的指针。我大脑的理性部分想确切地知道您要在这里完成什么。

对于所提供的信息,我可以提供的最佳建议是使用rust-gdb并逐步执行程序,直到指针看起来没有理智为止。