[Bug sanitizer/69204] ThreadSanitizer: False positive on std::promise usage
dvyukov at google dot com
gcc-bugzilla@gcc.gnu.org
Sun Jan 10 08:50:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69204
--- Comment #6 from Dmitry Vyukov <dvyukov at google dot com> ---
The problem is that gcc does not instrument atomic operations for some reason.
Here is disasm of future::set_result:
Dump of assembler code for function
std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>, bool):
...
0x000000000048bebd <+301>: mov -0x40(%rbp),%rax
0x000000000048bec1 <+305>: mov -0x44(%rbp),%edx
0x000000000048bec4 <+308>: xchg %edx,(%rax)
0x000000000048bec6 <+310>: mov %edx,%eax
0x000000000048bec8 <+312>: shr $0x1f,%eax
0x000000000048becb <+315>: test %al,%al
0x000000000048becd <+317>: je 0x48bef5
<std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>, bool)+357>
0x000000000048becf <+319>: mov -0x38(%rbp),%rax
0x000000000048bed3 <+323>: mov %rax,%rdi
0x000000000048bed6 <+326>: callq 0x407550
<_ZNSt28__atomic_futex_unsigned_base19_M_futex_notify_allEPj@plt>
...
0x000000000048bf1c <+396>: retq
That xchg is supposed to be std::atomic<unsigned>::store(memory_order_release)
that marks the future as ready.
I have no idea what has regressed.
More information about the Gcc-bugs
mailing list