CONC.DBL_LOCK
Multiple locks of critical resource
The CONC.DBL_LOCK checker flags cases where code tries to lock a variable or mutex twice along a certain path.
Vulnerability and risk
If code attempts to lock a variable or mutex twice along a certain path, there are chances the thread can hang or else it may result in undefined behavior.
Mitigation and prevention
If already locked, always unlock a resource after performing required operations.
Vulnerable code example
Copy
#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;
}
In this noncompliant example, Klocwork reports a CONC.DBL_LOCK defect on line 7, as the code tries to lock the same mutex (that is, *mutex) twice along the same path.
Fixed code example
Copy
#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;
}
In the fixed example, the code locks and then unlocks the mutex properly along a particular thread.
Related checkers
External guidance
Security training
Application security training materials provided by Secure Code Warrior.