rtic-sync: Fix possible UB in make_channel!

This commit is contained in:
Emil Fresk 2023-06-14 20:07:21 +02:00
parent 5997938293
commit db18c00c00
3 changed files with 28 additions and 1 deletions

View file

@ -13,4 +13,10 @@ For each category, *Added*, *Changed*, *Fixed* add new entries at the top!
### Fixed ### Fixed
## [v1.0.1]
### Fixed
- `make_channel` could be UB
## [v1.0.0] - 2023-xx-xx ## [v1.0.0] - 2023-xx-xx

View file

@ -1,6 +1,6 @@
[package] [package]
name = "rtic-sync" name = "rtic-sync"
version = "1.0.0" version = "1.0.1"
edition = "2021" edition = "2021"
authors = [ authors = [

View file

@ -106,6 +106,16 @@ macro_rules! make_channel {
static mut CHANNEL: $crate::channel::Channel<$type, $size> = static mut CHANNEL: $crate::channel::Channel<$type, $size> =
$crate::channel::Channel::new(); $crate::channel::Channel::new();
static CHECK: ::core::sync::atomic::AtomicU8 = ::core::sync::atomic::AtomicU8::new(0);
critical_section::with(|_| {
if CHECK.load(::core::sync::atomic::Ordering::Relaxed) != 0 {
panic!("call to the same `make_channel` instance twice");
}
CHECK.store(1, ::core::sync::atomic::Ordering::Relaxed);
});
// SAFETY: This is safe as we hide the static mut from others to access it. // SAFETY: This is safe as we hide the static mut from others to access it.
// Only this point is where the mutable access happens. // Only this point is where the mutable access happens.
unsafe { CHANNEL.split() } unsafe { CHANNEL.split() }
@ -573,4 +583,15 @@ mod tests {
v.await.unwrap(); v.await.unwrap();
} }
} }
fn make() {
let _ = make_channel!(u32, 10);
}
#[test]
#[should_panic]
fn double_make_channel() {
make();
make();
}
} }