C and C++ Binaries


CONCURRENCY.STARVE.BLOCKING : クリティカルセクション内でのブロック

要旨

ロックされている間にブロック関数が呼ばれています。

プロパティ

クラス名 Blocking in Critical Section
日本語クラス名 クリティカルセクション内でのブロック
クラス分類 信頼性 (reliability)
ニーモニック CONCURRENCY.STARVE.BLOCKING
カテゴリー
CWE CWE:662 Improper Synchronization
CERT-C CERT-C:CON05-C Do not perform operations that can block while holding a lock
  CERT-C:POS52-C Do not perform operations that can block while holding a POSIX lock
対応言語 C および C++ で利用可能です。
有効/無効設定 このワーニングクラスのチェックはデフォルトで有効になっています。チェックを無効にするにはプロジェクト設定ファイル (configuration file)に以下の WARNING_FILTER ルールを追加してください。
WARNING_FILTER += discard class="Blocking in Critical Section"

ワーニングが引き起こされる時

ブロック関数が、一つもしくはそれ以上のロックが取得されている間に呼ばれた場合。

ブロック関数とは Any function treated as a blocking function by CodeSonar:
ロックが取得されている間とは 以下のいずれかでロックが取得され、そのロックがリリースされていない状態を指します。
  • Any function treated as a lock acquisition function by CodeSonar:
  • 設定ファイルパラメータの LOCK_FUNCTIONS で設定されている関数

#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>

void concurrency_starve_blocking(pthread_mutex_t lock){
    sleep(2);                              /* ok: No lock held at this time */
    if( pthread_mutex_lock(&lock) != 0 ){
        abort();
    }
    sleep(3);               /* 'Blocking in Critical Section' warning issued here
                             * - a lock is held while the thread blocks.
                             */
    if( pthread_mutex_unlock(&lock) != 0 ) abort();
    sleep(4);                              /* ok: No lock held at this time */
}

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

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