Хранение содержимого файла 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 вместе с проанализированным представлением (с использованием гоблина) внутри одной и той же структуры? Я бы также согласился, если для решения потребуется несколько строк небезопасного кода...