let res = nom_parser(&buf)?.1;
^ here
Вы используете оператор ?
для распространения ошибки из main
. IResult<&[u8], String, u32>
= Result<(&[u8], String), nom::Err<&[u8], u32>>
. Таким образом, в случае ошибки &buf
возвращается как часть его, поэтому он должен оставаться в живых даже после выхода из main
функции, но не будет, потому что buf
является локальной переменной внутри main
.
В вашем случае nom_parser
никогда не возвращает ошибку, но проверка касается только типов и сигнатур функций.
Чтобы исправить это, вы должны как-то обработать ошибку, прежде чем распространять ее. Например:
let res = nom_parser(&buf).map_err(|_| failure::format_err!("Parsing failed!"))?.1;
Обратите внимание, что Err
в IResult
не всегда серьезная ошибка . Это может быть nom::Err::Incomplete
, что означает, что синтаксический анализ может завершиться успешно, если будет предоставлено больше данных, или nom::Err::Error
, означающее, что синтаксический анализатор не сопоставил входные данные (так что, возможно, другой синтаксический анализатор в alt!
может завершиться успешно), или nom::Err::Failure
Это означает, что во время анализа что-то пошло не так. В зависимости от ситуации вы можете рассматривать их как сбой или обращаться с ними по-разному.