CONC.DBL_UNLOCK
多次解锁关键资源
CONC.DBL_UNLOCK 检查器会标记代码尝试解锁资源的次数超过锁定次数的情况。
漏洞与风险
如果代码尝试解锁资源的次数超过资源的锁定次数,则可能会导致意外的行为。
缓解与预防
如果已解锁,请勿再次解锁资源。
漏洞代码示例
复制
#include<pthread.h>
void lock_unlock_wrapper(pthread_mutex_t *mutex)
{
pthread_mutex_lock(mutex);
pthread_mutex_unlock(mutex);
pthread_mutex_unlock(mutex);
return;
}
在此不符合要求的示例中,当代码尝试沿同一线程解锁同一互斥(即 *mutex)两次时,Klocwork 会在第 6 行报告 CONC.DBL_UNLOCK 缺陷。
修正代码示例
复制
#include<pthread.h>
void lock_unlock_wrapper(pthread_mutex_t *mutex)
{
pthread_mutex_lock(mutex);
pthread_mutex_unlock(mutex);
return;
}
在此修正代码示例中,代码沿给定线程锁定互斥,然后解锁互斥一次。