Хранение содержимого файла ELF вместе с проанализированным представлением гоблинов (самореферентные структуры)

в одном из моих проектов ржавчины я хотел бы сохранить содержимое файла ELF в структуре вместе с его проанализированным представлением, созданным крейтом гоблинов:

      struct AnalysisFile<'a> {
    filename: String,
    content: Vec<u8>,
    elf_info: Elf<'a>
}

impl AnalysisFile<'_> {
    fn new<'a>(filename: String) -> Option<AnalysisFile<'a>> {
        let buffer = fs::read(filename).ok()?;
        let elf = goblin::elf::Elf::parse(&buffer).ok()?;
        Some(AnalysisFile {filename: filename, content: buffer, elf: elf});
    }
}

К сожалению, это не скомпилируется:

      src/main.rs|36 col 9 error 515| cannot return value referencing local variable `buffer` returns a value referencing data owned by the current function
[...]
src/main.rs|36 col 57 error 505| cannot move out of `buffer` because it is borrowed

После некоторых исследований я предполагаю, что это связано с созданием ссылки на себя внутри структуры, что, по-видимому, не разрешено в Rust. Структура Elf хранит указатель на буфер, и средство проверки заимствования запрещает перемещать владеющий Vec в AnalysisFile, поскольку заимствованные ссылки на буфер могут стать недействительными. Однако, насколько я понимаю, в данном случае это ерунда. Vec хранит данные в куче, и указатель не станет недействительным при перемещении Vec, верно? Для меня было бы приемлемо, если бы я предотвратил дальнейшие модификации Vec, которые могут привести к аннулированию выделенных буферов в API кучи.

Вы видите какое-нибудь хорошее решение, как я могу хранить содержимое файла ELF вместе с проанализированным представлением (с использованием гоблина) внутри одной и той же структуры? Я бы также согласился, если для решения потребуется несколько строк небезопасного кода...

0 ответов

Другие вопросы по тегам