CERT.CONC.WAKE_IN_LOOP_C

疑似的にループで起動する可能性のある関数はラップする

このチェッカーは、ループで開始されない 'cnd_wait'、cnd_timedwait'、'wait'、'wait_for'、および 'wait_until' の呼び出しを報告します。

脆弱性とリスク

cnd_wait() 関数または cnd_timedwait() 関数を while ループに含めないと、無期限ブロックやサービス拒否 (DoS) につながる可能性があります。

軽減と防止

cnd_wait() 関数の呼び出しを while ループ内から行い、cnd_wait() を呼び出す前と後に状態をチェックするようにします。

脆弱コード例

struct node_t {
    void *node;
    struct node_t *next;
};

struct node_t list;
static mtx_t lock;
static cnd_t condition;

void consume_list_element(void) {
    if (thrd_success != mtx_lock(&lock)) {
        /* エラーを処理します */
    }

    if (list.next == NULL) {
        if (thrd_success != cnd_wait(&condition, &lock)) {
            /* エラーを処理します */
        }
    }

    /* 条件が当てはまる場合、続行します */

    if (thrd_success != mtx_unlock(&lock)) {
        /* エラーを処理します */
    }
}

この非準拠コード例は、cnd_wait() 関数を if ブロック内にネストしているため、その結果として通知を受け取った後、条件述部をチェックできません。通知が偽物であったり、悪意のあるものであった場合、スレッドが早々に起動する可能性があります。