我正在使用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
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个字节解释为偏移量,并且仅在offset指向的缓冲区部分调用follow
。我不知道你的上下文中有什么T
,但是如果文件小于4个字节,这个代码会因索引超出范围而发生混乱。如果不是,在T::follow
的实现中可能会发生类似的情况,因为在我看过的任何follow
实现中没有边界检查,并且follow
返回一个裸值,而不是Result
。
你有两个选择:
std::panic::catch_unwind
自己处理恐慌。免责声明:我在Google工作,但我没有处理与Flatbuffers有关的任何事情。