mace 记录 -- Rust 指针cast变为0

ptr_cast_0.png

如上图所示,指针 cast 的结果变成了0,按理说self是合法的,不应该出现,chatgpt的回答是

这通常意味着你正在尝试引用一个空值或未初始化的值

显然不是这个原因,查了cast的文档也没有发现线索,于是想到借助asan来检查(需要nightly版本)内存,使用以下命令

RUSTFLAGS=-Zsanitizer=address cargo test -Zbuild-std --target x86_64-unknown-linux-gnu --package mace --lib

发现并没有崩溃在上图的位置,而是在page内容填充的地方,代码如下

self.slots.write(self.slots_off, self.payload_off as u32);

这里slots是一个raw pointer,asan的报错是“写入的地址未对齐“,这大致算是找到方向了。将这里修改为字节拷贝后再次运行,发现仍然崩溃在上图的位置

沿着“地址未对齐”这个方向,很快意识到,插入的key和value是任意长度的,这些内存都是从一个 arena 中分配的,因此很可能出现分配出来的内存不是按照指针宽度对齐的,在Rust中指针的宽度就是size_of::<usize>(),随即修改 arena 分配和分配的内存使用相关的地方,再此使用 asan 来跑,问题就消失了

这里简单的记录以下:对于没有按照指针宽度对齐的指针进行类型转换是未定义行为