mirror of
https://github.com/rtic-rs/rtic.git
synced 2024-12-24 02:49:34 +01:00
rtic-sync: Fix possible UB in make_channel!
This commit is contained in:
parent
5997938293
commit
db18c00c00
3 changed files with 28 additions and 1 deletions
|
@ -13,4 +13,10 @@ For each category, *Added*, *Changed*, *Fixed* add new entries at the top!
|
|||
|
||||
### Fixed
|
||||
|
||||
## [v1.0.1]
|
||||
|
||||
### Fixed
|
||||
|
||||
- `make_channel` could be UB
|
||||
|
||||
## [v1.0.0] - 2023-xx-xx
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "rtic-sync"
|
||||
version = "1.0.0"
|
||||
version = "1.0.1"
|
||||
|
||||
edition = "2021"
|
||||
authors = [
|
||||
|
|
|
@ -106,6 +106,16 @@ macro_rules! make_channel {
|
|||
static mut CHANNEL: $crate::channel::Channel<$type, $size> =
|
||||
$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.
|
||||
// Only this point is where the mutable access happens.
|
||||
unsafe { CHANNEL.split() }
|
||||
|
@ -573,4 +583,15 @@ mod tests {
|
|||
v.await.unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
fn make() {
|
||||
let _ = make_channel!(u32, 10);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic]
|
||||
fn double_make_channel() {
|
||||
make();
|
||||
make();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue