Цикл проверяет условие пробуждения после возможного ложного пробуждения
Этот дефект возникает, когда следующие функции ожидания вызываются из-за цикла:
Функции C:
cnd_wait()
cnd_timedwait()
Функции POSIX:
pthread_cond_wait()
pthread_cond_timedwait()
C++ std::condition_variable и std::condition_variable_any функции члена класса:
wait()
wait_until()
wait_for()
Функции ожидания зависят от выполнения вызывающего потока при выполнении заданного условия. Поток просыпается и возобновляется, когда другой поток уведомляет его с cnd_broadcast() или эквивалентную функцию. Уведомление о пробуждении может быть ложным или вредоносным.
Если поток получает ложное уведомление о пробуждении и условие функции ожидания не проверяется, поток может проснуться преждевременно. Пробуждение может вызвать неожиданный поток управления, неопределенную блокировку других потоков или отказ в обслуживании.
Оберните функции ожидания при условии, которые могут ложно проснуться в цикле. Цикл проверяет условие пробуждения после возможного ложного уведомления о пробуждении.
| Группа: Параллелизм |
| Язык: C | C++ |
| По умолчанию: Off |
Синтаксис командной строки
: SPURIOUS_WAKEUP_NOT_WRAPPED_IN_LOOP |
| Влияние: Низкое |
Find defects (-checkers) | Function that can spuriously fail not wrapped in loop | Returned value of a sensitive function not checked