forked from BigfootDev/flatbuffers
Rust soundness fixes (#7518)
* Rust soundness fixes * Second pass * Make init_from_table unsafe * Remove SafeSliceAccess * Clippy * Remove create_vector_of_strings * More clippy * Remove deprecated root type accessors * More soundness fixes * Fix EndianScalar for bool * Add TriviallyTransmutable * Add debug assertions * Review comments * Review feedback
This commit is contained in:
committed by
GitHub
parent
dadbff5714
commit
374f8fb5fb
@@ -29,7 +29,11 @@ use core::marker::PhantomData;
|
||||
/// continue traversing the FlatBuffer.
|
||||
pub trait Follow<'buf> {
|
||||
type Inner;
|
||||
fn follow(buf: &'buf [u8], loc: usize) -> Self::Inner;
|
||||
/// # Safety
|
||||
///
|
||||
/// `buf[loc..]` must contain a valid value of `Self` and anything it
|
||||
/// transitively refers to by offset must also be valid
|
||||
unsafe fn follow(buf: &'buf [u8], loc: usize) -> Self::Inner;
|
||||
}
|
||||
|
||||
/// FollowStart wraps a Follow impl in a struct type. This can make certain
|
||||
@@ -39,17 +43,21 @@ pub struct FollowStart<T>(PhantomData<T>);
|
||||
impl<'a, T: Follow<'a> + 'a> FollowStart<T> {
|
||||
#[inline]
|
||||
pub fn new() -> Self {
|
||||
Self { 0: PhantomData }
|
||||
Self(PhantomData)
|
||||
}
|
||||
|
||||
/// # Safety
|
||||
///
|
||||
/// `buf[loc..]` must contain a valid value of `T`
|
||||
#[inline]
|
||||
pub fn self_follow(&'a self, buf: &'a [u8], loc: usize) -> T::Inner {
|
||||
pub unsafe fn self_follow(&'a self, buf: &'a [u8], loc: usize) -> T::Inner {
|
||||
T::follow(buf, loc)
|
||||
}
|
||||
}
|
||||
impl<'a, T: Follow<'a>> Follow<'a> for FollowStart<T> {
|
||||
type Inner = T::Inner;
|
||||
#[inline]
|
||||
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
T::follow(buf, loc)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user