CONC.DBL_LOCK

重大なリソースの複数のロック

CONC.DBL_LOCK チェッカーは、コードが特定のパスに沿って変数またはミューテックスを 2 回ロックしようとする場合にフラグを立てます。

脆弱性とリスク

コードが特定のパスに沿って変数またはミューテックスを 2 回ロックしようとすると、スレッドがハングする可能性があるか、あるいは未定義の動作が発生する場合があります。

軽減と防止

すでにロックされている場合は、必要な操作を実行した後に、リソースを必ずロック解除してください。

脆弱コード例

コピー
   #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) を 2 回ロックしようとしているため、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 が提供しているアプリケーションセキュリティトレーニング教材。