Цикл проверяет условие отказа после возможного ложного отказа
Этот дефект возникает, когда следующие атомарные функции сравнения и обмена, которые могут непроизвольно отказать, вызываются из-за пределов цикла.
Атомарные функции C:
atomic_compare_exchange_weak()
atomic_compare_exchange_weak_explicit()
C++ атомарные функции:
std::atomic<T>::compare_exchange_weak(T* expected, T desired)
std::atomic<T>::compare_exchange_weak_explicit(T* expected, T desired, std::memory_order succ, std::memory_order fail)
std::atomic_compare_exchange_weak(std::atomic<T>* obj, T* expected, T desired)
std::atomic_compare_exchange_weak_explicit(volatile std::atomic<T>* obj, T* expected, T desired, std::memory_order succ, std::memory_order fail)
Функции сравнивают содержимое памяти представлений объектов, на которые указывает obj
и expected
. Сравнение может ложно вернуть false, даже если содержимое памяти равное. Этот ложный отказ делает функции быстрее на некоторых платформах.
Атомарная функция сравнения и обмена, которая ложно отказывает, может вызвать неожиданные результаты и неожиданный поток управления.
Оберните атомарные функции сравнения и обмена, которые могут ложно отказать в цикле. Цикл проверяет условие отказа после возможного ложного отказа.
Группа: Параллелизм |
Язык: C | C++ |
По умолчанию: Off |
Синтаксис командной строки
: SPURIOUS_FAILURE_NOT_WRAPPED_IN_LOOP |
Влияние: Низкое |
Find defects (-checkers)
| Function that can spuriously wake up not wrapped in loop
| Returned value of a sensitive function not checked