C and C++


CONCURRENCY.LOCK.ORDER : ロック順序の不一致

要旨

異なったスレッドが異なった順番で同じロックを取得しました。 これはデッドロックもしくは未定義動作の原因となります。

プロパティ

クラス名 Conflicting Lock Order
日本語クラス名 ロック順序の不一致
クラス分類 信頼性 (reliability)
ニーモニック CONCURRENCY.LOCK.ORDER
カテゴリー
MisraC2023 MisraC2023:22.16 All mutex objects locked by a thread shall be explicitly unlocked by the same thread
Misra2012 Misra2012:22.16 All mutex objects locked by a thread shall be explicitly unlocked by the same thread
CWE CWE:413 Improper Resource Locking
  CWE:696 Incorrect Behavior Order
CERT-C CERT-C:CON35-C Avoid deadlock by locking in a predefined order
  CERT-C:POS51-C Avoid deadlock with POSIX threads by locking in predefined order
CERT-CPP CERT-CPP:CON53-CPP Avoid deadlock by locking in a predefined order
JPL JPL:9 Place restrictions on the use of semaphores and locks.
対応言語 C および C++ で利用可能です。
有効/無効設定 このワーニングクラスのチェックはデフォルトで無効になっています。チェックを有効にするにはプロジェクト設定ファイル (configuration file)に以下の WARNING_FILTER ルールを追加してください。
WARNING_FILTER += allow class="Conflicting Lock Order"

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

以下のどの関数でも引き起こされます。

#include <pthread.h>

pthread_mutex_t Green;
pthread_mutex_t Blue;


/* ----- Thread 1 ----- */
void green_before_blue(void){
    pthread_mutex_lock(&Green);                        /* Green acquired before Blue */
    pthread_mutex_lock(&Blue);  /* 'Conflicting Lock Order' warning issued either here or in marked location below */
    /* ... operate on locked data */
    pthread_mutex_unlock(&Blue);
    pthread_mutex_unlock(&Green);
}

/* ----- Thread 2 ----- */
void blue_before_green(void){
    pthread_mutex_lock(&Blue);                         /* Blue acquired before Green */
    pthread_mutex_lock(&Green);  /* 'Conflicting Lock Order' warning issued either here or in marked location above */
    /* ... operate on locked data */
    pthread_mutex_unlock(&Green);
    pthread_mutex_unlock(&Blue);
}

マルチスレッド環境で2つのスレッドが2つのロックを異なった順序で獲得しようとした場合、デッドロックになる可能性があります。

Conflicting Lock Order example diagram

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

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