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;
  }

在此修正代码示例中,代码沿特定线程锁定互斥,然后正确解锁互斥。

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。