我的实验代码在裸机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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
AFAIK这个值是由rustc编译器硬编码的,是format_args编译时处理的结果!可变参数.
也许你有建议这个案子有什么问题.谢谢.
引用自 Rust 项目的RELEASES.md:
fn
项目类型的大小为零,并且每个类型都fn
命名一个唯一的类型。这将破坏转换fn
s 的代码,因此调用transmute
类型fn
将生成几个周期的警告,然后将转换为错误。
这是版本 1.9.0 (2016-05-26)发行说明的一部分,因此如果您使用此版本,它可能是 std 库中的错误,如果您使用 <1.9,您可能应该尝试复制代码进入游戏围栏并让它生成程序集,这样您就可以看到地址的实际来源。
归档时间: |
|
查看次数: |
240 次 |
最近记录: |