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