https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104475
Bug ID: 104475 Summary: Wstringop-overflow + atomics incorrect warning on dynamic object Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: thiago at kde dot org Target Milestone: --- Created attachment 52399 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=52399&action=edit qfutureinterface.cpp preprocessed In: static inline int switch_on(QAtomicInt &a, int which) { return a.fetchAndOrRelaxed(which) | which; } static inline int switch_off(QAtomicInt &a, int which) { return a.fetchAndAndRelaxed(~which) & ~which; } void QFutureInterfaceBase::setThrottled(bool enable) { QMutexLocker lock(&d->m_mutex); if (enable) { switch_on(d->state, Throttled); } else { switch_off(d->state, Throttled); if (!(d->state.loadRelaxed() & suspendingOrSuspended)) d->pausedWaitCondition.wakeAll(); } } Compiling the attached preprocessed sources with: g++ -Wall -Wextra -march=haswell -O2 -c -o /dev/null qfutureinterface.cpp.ii Produces: In member function ‘std::__atomic_base<_IntTp>::__int_type std::__atomic_base<_IntTp>::fetch_or(__int_type, std::memory_order) [with _ITp = int]’, inlined from ‘static T QAtomicOps<X>::fetchAndOrRelaxed(std::atomic<T>&, typename QAtomicAdditiveType<T>::AdditiveT) [with T = int; X = int]’ at /home/tjmaciei/obj/qt/qt6/qtbase/include/QtCore/../../../../../../src/qt/qt6/qtbase/src/corelib/thread/qatomic_cxx11.h:449:33, inlined from ‘T QBasicAtomicInteger<T>::fetchAndOrRelaxed(T) [with T = int]’ at /home/tjmaciei/obj/qt/qt6/qtbase/include/QtCore/../../../../../../src/qt/qt6/qtbase/src/corelib/thread/qbasicatomic.h:168:36, inlined from ‘int switch_on(QAtomicInt&, int)’ at /home/tjmaciei/src/qt/qt6/qtbase/src/corelib/thread/qfutureinterface.cpp:59:31, inlined from ‘void QFutureInterfaceBase::setThrottled(bool)’ at /home/tjmaciei/src/qt/qt6/qtbase/src/corelib/thread/qfutureinterface.cpp:71:18: /home/tjmaciei/dev/gcc/include/c++/12.0.1/bits/atomic_base.h:648:33: warning: ‘unsigned int __atomic_or_fetch_4(volatile void*, unsigned int, int)’ writing 4 bytes into a region of size 0 overflows the destination [-Wstringop-overflow=] 648 | { return __atomic_fetch_or(&_M_i, __i, int(__m)); } | ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~ In member function ‘std::__atomic_base<_IntTp>::__int_type std::__atomic_base<_IntTp>::fetch_and(__int_type, std::memory_order) [with _ITp = int]’, inlined from ‘static T QAtomicOps<X>::fetchAndAndRelaxed(std::atomic<T>&, typename QAtomicAdditiveType<T>::AdditiveT) [with T = int; X = int]’ at /home/tjmaciei/obj/qt/qt6/qtbase/include/QtCore/../../../../../../src/qt/qt6/qtbase/src/corelib/thread/qatomic_cxx11.h:425:34, inlined from ‘T QBasicAtomicInteger<T>::fetchAndAndRelaxed(T) [with T = int]’ at /home/tjmaciei/obj/qt/qt6/qtbase/include/QtCore/../../../../../../src/qt/qt6/qtbase/src/corelib/thread/qbasicatomic.h:159:37, inlined from ‘int switch_off(QAtomicInt&, int)’ at /home/tjmaciei/src/qt/qt6/qtbase/src/corelib/thread/qfutureinterface.cpp:64:32, inlined from ‘void QFutureInterfaceBase::setThrottled(bool)’ at /home/tjmaciei/src/qt/qt6/qtbase/src/corelib/thread/qfutureinterface.cpp:73:19: /home/tjmaciei/dev/gcc/include/c++/12.0.1/bits/atomic_base.h:638:34: warning: ‘unsigned int __atomic_fetch_and_4(volatile void*, unsigned int, int)’ writing 4 bytes into a region of size 0 overflows the destination [-Wstringop-overflow=] 638 | { return __atomic_fetch_and(&_M_i, __i, int(__m)); } | ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~ GCC Git commit 1ce5395977f37e8d0c03394f7b932a584ce85cc7, built today.