CONC.DBL_UNLOCK

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

CONC.DBL_UNLOCK チェッカーは、コードがリソースをロックする回数よりも多くロック解除しようとする場合にフラグを立てます。

脆弱性とリスク

コードがリソースをロックする回数よりも多くロック解除しようとすると、予期しない動作が発生する可能性があります。

軽減と防止

すでにロック解除されている場合は、リソースを再びロック解除しないでください。

脆弱コード例

コピー
  #include<pthread.h>
  void lock_unlock_wrapper(pthread_mutex_t *mutex)
  {
      pthread_mutex_lock(mutex);
      pthread_mutex_unlock(mutex);
      pthread_mutex_unlock(mutex);
      return;
  }

この準拠していない例では、コードは同じスレッドに沿って同じミューテックス (つまり、*mutex) を 2 回ロック解除しようとしているため、Klocwork は 6 行目で CONC.DBL_UNLOCK 欠陥を報告します。

修正コード例

コピー
  #include<pthread.h>
  void lock_unlock_wrapper(pthread_mutex_t *mutex)
  {
      pthread_mutex_lock(mutex);
      pthread_mutex_unlock(mutex);
      return;
  }

修正された例では、コードは特定のスレッドに沿ってミューテックスをロックしてから 1 回ロック解除しています。

セキュリティトレーニング

Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。