c++ 死锁检测工具

https://juejin.cn/s/c++%20%E6%AD%BB%E9%94%81%E6%A3%80%E6%B5%8B%E5%B7%A5%E5%85%B7

clang

https://clang.llvm.org/docs/UsersManual.html#cmdoption-f-no-sanitize

1
2
3
address/thread/memory/undefined leak??
clang -fsanitize=address -g memory-leak.c ; ASAN_OPTIONS=detect_leaks=1 ./a.out
-fsanitize=safe-stack:

gcc

https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html#index-fsanitize_003daddress

1
2
3
address/hwaddress/thread/leak/undefined
-fstack-protector
-finstrument-functions

msvc

1
2
asan
windbg !locks

https://maskray.me/blog/2023-02-12-all-about-leak-sanitizer

1
2
3
4
5
LSan can be used in 3 ways.
Standalone (-fsanitize=leak)
AddressSanitizer (-fsanitize=address)
HWAddressSanitizer (-fsanitize=hwaddress)
The most common way to use LSan is clang -fsanitize=address (or gcc -fsanitize=address). For LSan-supported targets (#define CAN_SANITIZE_LEAKS 1), the AddressSanitizer (ASan) runtime enables LSan by default.

trylock/sharedlock

1
2
3
4
5
6
7
try_lock -> no wait -> WaitForSingleObject(m, 0)
lock -> wait -> WaitForSingleObject(m, INFINITE)

shared_mutex/shared_lock
_Smtx_lock_shared -> AcquireSRWLockShared
精简读取器/编写器 (SRW) 锁
gcc -> pthread_rwlock/pthread_rwlock_timedrdlock