Immediately dropping a synchronization lock (e.g., mutex
, rwlock
) after acquiring it using let _ = sync_lock
is often unintentional and can lead to subtle bugs. By extending the lock lifetime to the end of the scope using a named variable, the code becomes
safer and intentions are clearer. If immediate drop is intended, using std::mem::drop
conveys the intention more clearly and reduces
error-prone behavior.
Code examples
Noncompliant code example
let _ = Mutex::new(1).lock(); // Noncompliant: Immediately drops the lock.
Compliant solution
// Extend lock lifetime to end of scope
let _lock = Mutex::new(1).lock(); // Compliant: Lock remains till scope ends.
You can also explicitly drop the lock to convey intention:
std::mem::drop(Mutex::new(1).lock()); // Compliant: Clearly drops the lock.