Цикл проверяет условие пробуждения после возможного ложного пробуждения
Этот дефект возникает, когда следующие функции ожидания вызываются из-за цикла:
Функции 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