C and C++ Binaries


CONCURRENCY.DL : 二重ロック

要旨

ミューテックスが、間にアンロックされないまま2回 pthread_mutex_lock() でロックされようとしています。

より広範囲な二重ロックをチェックする場合は 二度のロックロック解放の欠如 を有効にしてください。

プロパティ

クラス名 Double Lock
日本語クラス名 二重ロック
クラス分類 信頼性 (reliability)
ニーモニック CONCURRENCY.DL
カテゴリー
MisraC2023 MisraC2023:22.18 Non-recursive mutexes shall not be recursively locked
  MisraC2023:D.4.1 Run-time failures shall be minimized
Misra2012 Misra2012:22.18 Non-recursive mutexes shall not be recursively locked
  Misra2012:D.4.1 Run-time failures shall be minimized
CWE CWE:764 Multiple Locks of a Critical Resource
対応言語 C および C++ で利用可能です。
有効/無効設定 このワーニングクラスのチェックはデフォルトで有効になっています。チェックを無効にするにはプロジェクト設定ファイル (configuration file)に以下の WARNING_FILTER ルールを追加してください。
WARNING_FILTER += discard class="Double Lock"

ワーニングを引き起こす関数

A warning is triggered if a lock acquisition function is called to acquire a mutex that has definitely already been acquired.

For the purpose of this check:

#include <pthread.h>

void dl_1(pthread_mutex_t lock){
  pthread_mutex_lock(&lock);
  pthread_mutex_lock(&lock);     /* 'Double Lock' warning issued here. */
}

void dl_2(pthread_mutex_t lock){
  pthread_mutex_lock(&lock);
  pthread_mutex_unlock(&lock);
  pthread_mutex_lock(&lock);     /* 'Double Lock' warning issued here - pthread_mutex_unlock()
                                  *  may have failed to release the lock.
                                  */
}

int no_dl(pthread_mutex_t lock){
  if (!pthread_mutex_lock(&lock)){return -1;}
  if (!pthread_mutex_unlock(&lock)){return -1;}
  return pthread_mutex_lock(&lock);                /* ok: if control reaches this line,
                                                    * the call to pthread_mutex_unlock() must have succeeded
                                                    */
}

注釈

既にロックされているミューテックスをロックしようとすると、デッドロックもしくは未定義動作の原因となります。

関連のある設定ファイルパラメータ

設定ファイルの以下のパラメータがこのワーニングクラスのチェックに影響します。