如何检查Flatbuffer是否有效或正确处理错误?

问题描述 投票:-1回答:1

我正在使用Rust和Flatbuffers来加载文件。当我尝试加载一个不是有效的flatbuffer文件的文件时,我的程序会因索引超出范围而发生恐慌。如何向用户显示错误而不是崩溃?

小例子:

file_content_as_u8 // This is my &[u8] where I have loaded the file content.
// &[u8] to fltabuffer where get_root_as_file is generated by flatbuffer
let file_content = get_root_as_file(file_content_as_u8);
// Try to read data field from flatbuffer
let data = file_content.data();
// If file_content_as_u8 wasn't a valid flatbuffer file file_content.data()
// results in a panic with an index out of range
rust crash flatbuffers panic
1个回答
1
投票

get_root的代码:

#[inline]
pub fn get_root<'a, T: Follow<'a> + 'a>(data: &'a [u8]) -> T::Inner {
    <ForwardsUOffset<T>>::follow(data, 0)
}

FollowForwardsUOffset实施:

impl<'a, T: Follow<'a>> Follow<'a> for ForwardsUOffset<T> {
    type Inner = T::Inner;
    #[inline(always)]
    fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
        let slice = &buf[loc..loc + SIZE_UOFFSET];
        let off = read_scalar::<u32>(slice) as usize;
        T::follow(buf, loc + off)
    }
}

此实现不执行任何边界检查,将前4个字节解释为偏移量,并且仅在offset指向的缓冲区部分调用follow。我不知道你的上下文中有什么T,但是如果文件小于4个字节,这个代码会因索引超出范围而发生混乱。如果不是,在T::follow的实现中可能会发生类似的情况,因为在我看过的任何follow实现中没有边界检查,并且follow返回一个裸值,而不是Result

你有两个选择:

  • 将错误报告给Flatbuffers开发人员,让他们更好地处理损坏的文件。
  • 使用std::panic::catch_unwind自己处理恐慌。

免责声明:我在Google工作,但我没有处理与Flatbuffers有关的任何事情。

© www.soinside.com 2019 - 2024. All rights reserved.