我的实验代码在裸机x86_64-metal上运行时崩溃(当IDT尚未设置时页面错误),但在aarch64上运行完美。
通过仔细跟踪,我发现这个页面错误的原因包括功能错误的地址(远高于0x200_000,而只有前2M页面被映射为1:1)的功能" f"作为参数传递给core :: fmt :: ArgumentV1 :: new()函数:
#[doc(hidden)]
#[unstable(feature = "fmt_internals", reason = "internal to format_args!")]
pub fn new<'b, T>(x: &'b T,
f: fn(&T, &mut Formatter) -> Result) -> ArgumentV1<'b> {
unsafe {
ArgumentV1 {
formatter: mem::transmute(f),
value: mem::transmute(x)
}
}
}
AFAIK这个值是由rustc编译器硬编码的,是format_args编译时处理的结果!可变参数。
也许你有建议这个案例有什么不对。感谢。
答案 0 :(得分:1)
引用Rust项目的RELEASES.md:
fn
项类型的大小为零,每个fn
都命名为唯一类型。这将破坏转换fn
的代码,因此在transmute
类型上调用fn
将生成几个周期的警告,然后将转换为错误。
这是版本1.9.0 (2016-05-26)的发行说明的一部分,所以如果您使用的是此版本,则可能是std库中的错误,如果您正在使用&lt; 1.9您应该尝试将代码复制到playpen并让它生成程序集,以便查看地址的实际来源。