CONC.NO_UNLOCK
漏解锁
CONC.NO_UNLOCK 检查器会报告由于没有相应解锁的锁定线程导致潜在锁定的情况。
漏洞与风险
漏释放锁定可能导致死锁。如果一个锁定保留且未释放,则无法继续进行任何调用来获取该锁定,除非释放该锁定。
缓解与预防
为了帮助避免锁争用:
- 请尝试让代码的锁定部分尽可能小和简单以便于理解。
- 请勿锁定可能导致数据竞争等并发问题的代码部分。
- 务必避免循环等待的状况。
- 如果使用多个锁(通常在升级保护模式下),务必确保在每种情况下已执行完全相同的升级操作。
漏洞代码示例
复制
#include <pthread.h>
extern int z();
void foo(pthread_mutex_t *mutex) {
pthread_mutex_lock(mutex);
switch (z()) {
case 0:
return;
case 1:
break;
}
pthread_mutex_unlock(mutex);
}
Klocwork 报告如果事例 0 生效,互斥将在第 6 行锁定并且不会在第 9 行解锁。
修正代码示例
复制
#include <pthread.h>
extern int z();
void foo(pthread_mutex_t *mutex) {
pthread_mutex_lock(mutex);
switch (z()) {
case 0:
pthread_mutex_unlock(mutex);
return;
case 1:
break;
}
pthread_mutex_unlock(mutex);
}
在该修正代码示例中,解锁已包含在第 9 行中。
相关检查器
外部指导
扩展
此检查器可进行扩展。相关的知识库记录类型包括:
- CONC.LOCK
- CONC.LOCK.TRY
- CONC.UNLOCK
- CONC.CONDSIGNAL
- CONC.CONDWAIT
有关详情,请参阅调整 C/C++ 分析。