CONC.DBL_LOCK
多次锁定关键资源
CONC.DBL_LOCK 检查器会标记代码尝试沿某个路径锁定变量或互斥两次的情况。
漏洞与风险
如果代码尝试沿某个路径锁定变量或互斥两次,则线程可能挂起,否则可能导致未定义的行为。
缓解与预防
如果已锁定,请始终在执行所需操作后解锁资源。
漏洞代码示例
复制
#include<pthread.h>
#include<stdio.h>
void foo(pthread_mutex_t mutex)
{
pthread_mutex_lock(&mutex);
pthread_mutex_lock(&mutex);
return;
}
int main()
{
pthread_mutex_t mutex;
if (pthread_mutex_init(&mutex, NULL) != 0) {
printf("\n mutex init has failed\n");
return 1;
}
foo(mutex);
return 0;
}
在此不符合要求的示例中,当代码尝试沿同一路径锁定同一互斥(即 *mutex)两次时,Klocwork 会在第 7 行报告 CONC.DBL_LOCK 缺陷。
修正代码示例
复制
#include<pthread.h>
#include<stdio.h>
void foo(pthread_mutex_t mutex)
{
pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);
return;
}
int main()
{
pthread_mutex_t mutex;
if (pthread_mutex_init(&mutex, NULL) != 0) {
printf("\n mutex init has failed\n");
return 1;
}
foo(mutex);
return 0;
}
在此修正代码示例中,代码沿特定线程锁定互斥,然后正确解锁互斥。