Write:: write_fmt вызывает ошибку страницы на голом металле
Мой экспериментальный код сбой при работе на голой 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! вариативные аргументы.
Возможно, у вас есть предложения о том, что случилось с этим делом. Спасибо.
Ответы
Ответ 1
Цитата из проекта Rust RELEASES.md:
fn
типы элементов имеют нулевой размер, и каждый fn
называет уникальный тип. Это нарушит код, который преобразует fn
s, поэтому вызов transmute
в типе fn
генерирует предупреждение за несколько циклов, затем будет преобразован в ошибку.
Это часть примечаний к выпуску для версии 1.9.0 (2016-05-26), поэтому, если вы используете эту версию, это может быть ошибка в библиотеке std, если вы находитесь на < 1.9 вам следует, вероятно, попытаться скопировать код в playpen и позволить ему сгенерировать сборку, чтобы вы могли видеть, откуда именно на самом деле происходит адрес.