Mutable Static Variables

It is safe to read an immutable static variable:

  1. static HELLO_WORLD: &str = "Hello, world!";
  2. fn main() {
  3.     println!("HELLO_WORLD: {HELLO_WORLD}");
  4. }

However, since data races can occur, it is unsafe to read and write mutable static variables:

  1. static mut COUNTER: u32 = 0;
  2. fn add_to_counter(inc: u32) {
  3.     // SAFETY: There are no other threads which could be accessing `COUNTER`.
  4.     unsafe {
  5.         COUNTER += inc;
  6.     }
  7. }
  8. fn main() {
  9.     add_to_counter(42);
  10.     // SAFETY: There are no other threads which could be accessing `COUNTER`.
  11.     unsafe {
  12.         println!("COUNTER: {COUNTER}");
  13.     }
  14. }

This slide should take about 5 minutes.

  • The program here is safe because it is single-threaded. However, the Rust compiler is conservative and will assume the worst. Try removing the unsafe and see how the compiler explains that it is undefined behavior to mutate a static from multiple threads.

  • Using a mutable static is generally a bad idea, but there are some cases where it might make sense in low-level no_std code, such as implementing a heap allocator or working with some C APIs.