gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:26:36 25 4
gpt4 key购买 nike

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

小例子:

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

最佳答案

get_root 的代码:

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

Follow 的实现 ForwardsUOffset :

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 个字节解释为偏移量,并且仅在偏移量指向的缓冲区部分调用 follow。我不知道你的上下文中的 T 是什么,但如果文件小于 4 个字节,则此代码将因索引超出范围而出现困惑。如果不是,类似的情况可能发生在 T::follow 的实现中,因为在我见过的任何 follow 实现中都没有边界检查,并且 follow 返回一个裸值,而不是 Result

这里有两个选择:

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

免责声明:我在 Google 工作,但我不从事任何与 Flatbuffers 相关的工作。

关于rust - 如何检查 Flatbuffer 是否有效或正确处理错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54959248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com