C的静态代码检查器是否会标记缺少的互斥锁解锁?

时间:2018-12-13 09:32:02

标签: c static clang analysis clang-tidy

在下面的代码中,两个线程正在使用相同的功能,并且每个线程应该在启动之前获取锁。因此,第一个线程获得了锁,执行了工作,然后离开,但没有释放锁,因为有意地注释掉了unlock命令。第二个线程永远不会获得锁,因此永远不会执行该作业。

我创建了这个简单的示例,只是为了测试我使用的静态代码检查器是否会标记这种情况(缺少解锁),而不会。我正在使用CodeChecker,它具有clang静态分析器和clang-tidy检查器。您是否知道会标记此内容的任何静态代码检查器?我认为Coverity可以,但我没有获得证明的许可证。

#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>

pthread_t tid[2];
int counter;
pthread_mutex_t lock;

void* doSomeThing() {
    pthread_mutex_lock(&lock);

    unsigned long i = 0;
    counter += 1;
    printf("\n Job %d started\n", counter);

    for(i=0; i<(0xFFFFFFF);i++);

    printf("\n Job %d finished\n", counter);

    // pthread_mutex_unlock(&lock);

    return NULL;
}

int main(void) {
    int i = 0;
    int err;

    if (pthread_mutex_init(&lock, NULL) != 0) {
        printf("\n mutex init failed\n");
        return 1;
    }

    while(i < 2) {
        err = pthread_create(&(tid[i]), NULL, &doSomeThing, NULL);
        if (err != 0)
            printf("\ncan't create thread :[%s]", strerror(err));
        i++;
    }

    pthread_join(tid[0], NULL);
    pthread_join(tid[1], NULL);
    pthread_mutex_destroy(&lock);

    return 0;
}

1 个答案:

答案 0 :(得分:1)

通过--concurrency选项,信号量锁定/解锁组合会导致缺陷。

有关其他详细信息,请参见此article