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 и позволить ему сгенерировать сборку, чтобы вы могли видеть, откуда именно на самом деле происходит адрес.