1/6

Mutex<T> owns its data. There is no way to reach the value without locking, so "forgot to take the lock" is not a bug you can write.

let mut guard = counter.lock().unwrap();
*guard += 1;

lock() returns Result<MutexGuard<T>, PoisonError<_>>. The guard derefs to &mut T, and releases the lock when it drops. There is no unlock().