-
-
Notifications
You must be signed in to change notification settings - Fork 405
Closed as not planned
Closed as not planned
Copy link
Description
LibAFL/libafl_bolts/src/tuples.rs
Lines 27 to 58 in 89cff63
| /// Returns if the type `T` is equal to `U`, ignoring lifetimes. | |
| #[inline] // this entire call gets optimized away :) | |
| #[must_use] | |
| pub fn type_eq<T: ?Sized, U: ?Sized>() -> bool { | |
| // decider struct: hold a cell (which we will update if the types are unequal) and some | |
| // phantom data using a function pointer to allow for Copy to be implemented | |
| struct W<'a, T: ?Sized, U: ?Sized>(&'a Cell<bool>, PhantomData<fn() -> (&'a T, &'a U)>); | |
| // default implementation: if the types are unequal, we will use the clone implementation | |
| impl<T: ?Sized, U: ?Sized> Clone for W<'_, T, U> { | |
| #[inline] | |
| fn clone(&self) -> Self { | |
| // indicate that the types are unequal | |
| // unfortunately, use of interior mutability (Cell) makes this not const-compatible | |
| // not really possible to get around at this time | |
| self.0.set(false); | |
| W(self.0, self.1) | |
| } | |
| } | |
| // specialized implementation: Copy is only implemented if the types are the same | |
| #[allow(clippy::mismatching_type_param_order)] | |
| impl<T: ?Sized> Copy for W<'_, T, T> {} | |
| let detected = Cell::new(true); | |
| // [].clone() is *specialized* in core. | |
| // Types which implement copy will have their copy implementations used, falling back to clone. | |
| // If the types are the same, then our clone implementation (which sets our Cell to false) | |
| // will never be called, meaning that our Cell's content remains true. | |
| let res = [W::<T, U>(&detected, PhantomData)].clone(); | |
| res[0].0.get() | |
| } |
this code here relies on the (unsound) specialization of Copy for cloning of arrays. I hope I don't have to explain why that's a problem^^. this will probably break in the future (since it's unsound), either with the specialization being removed, the lifetime-dependent Copy implementation being an error or both.
how else should it be implemented then? not. this operation cannot be implemented correctly and a different way to do the stuff that uses it today needs to be found.
Metadata
Metadata
Assignees
Labels
No labels