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 ブロック内にネストしているため、その結果として通知を受け取った後、条件述部をチェックできません。通知が偽物であったり、悪意のあるものであった場合、スレッドが早々に起動する可能性があります。