CONC.NO_LOCK
Missing lock
The CONC.NO_LOCK checker flags cases where there is no lock that corresponds to an unlock call.
Vulnerability and risk
If code attempts to unlock a variable or mutex when it is not locked in a given thread, it can result in unexpected behavior.
Mitigation and prevention
Do not unlock a resource unless it is locked by a given thread.
Vulnerable code example
Copy
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
pthread_t tid[2];
void *trythis(void *arg)
{
pthread_mutex_t lock;
if (pthread_mutex_init(&lock, NULL) != 0) {
printf("\n mutex init has failed\n");
return NULL;
}
pthread_mutex_unlock(&lock);
return NULL;
}
int main(void)
{
int i = 0;
int error;
error = pthread_create(&(tid[i]),
NULL,
&trythis, NULL);
if (error != 0)
printf("\nThread can't be created :[%s]",
strerror(error));
pthread_join(tid[0], NULL);
return 0;
}
In this noncompliant example, Klocwork reports a CONC.NO_LOCK defect on line 27 as the code tries to unlock the mutex that is not yet locked.
Fixed code example
Copy
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
pthread_t tid[2];
void *trythis(void *arg)
{
pthread_mutex_t lock;
if (pthread_mutex_init(&lock, NULL) != 0) {
printf("\n mutex init has failed\n");
return NULL;
}
pthread_mutex_lock(&lock);
pthread_mutex_unlock(&lock);
return NULL;
}
int main(void)
{
int i = 0;
int error;
error = pthread_create(&(tid[i]),
NULL,
&trythis, NULL);
if (error != 0)
printf("\nThread can't be created :[%s]",
strerror(error));
pthread_join(tid[0], NULL);
return 0;
}
In the fixed example, the code unlocks the locked mutex properly along a particular thread.
Related checkers
External guidance
Extension
This checker can be extended. The related knowledge base record kinds are:
See Tuning C/C++ analysis for more information.