https://gcc.gnu.org/bugzilla/show_bug.cgi?id=123066
Bug ID: 123066
Summary: TSAN gives a false positive in std::regex_search
Product: gcc
Version: 14.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: sanitizer
Assignee: unassigned at gcc dot gnu.org
Reporter: jacob at jacobcoder dot com
CC: dodji at gcc dot gnu.org, dvyukov at gcc dot gnu.org,
jakub at gcc dot gnu.org, kcc at gcc dot gnu.org
Target Milestone: ---
Host: x86_64-linux-gnu
Target: x86_64-linux-gnu
Build: x86_64-linux-gnu
g++ falsely says data race in the call to regex_search when the following
program is built with:
g++ -Wall -Wextra -g -fsanitize=thread thread6.cpp
#include <thread>
#include <regex>
using namespace std;
void f() {
string haystack;
smatch match;
regex_search(haystack, match, regex("."));
}
int main()
{
thread{f}.detach();
f();
}
==================
WARNING: ThreadSanitizer: data race (pid=1281719)
Write of size 1 at 0x7f2a17e63b07 by thread T1:
#0 std::ctype<char>::narrow(char, char) const
/usr/include/c++/14/bits/locale_facets.h:945 (a.out+0x6204) (BuildId:
bcee17cb170f2378d194e3837df9d60e1a4b98e2)
#1 std::__detail::_Scanner<char>::_M_scan_normal()
/usr/include/c++/14/bits/regex_scanner.tcc:100 (a.out+0xe010) (BuildId:
bcee17cb170f2378d194e3837df9d60e1a4b98e2)
#2 std::__detail::_Scanner<char>::_M_advance()
/usr/include/c++/14/bits/regex_scanner.tcc:79 (a.out+0xc0a2) (BuildId:
bcee17cb170f2378d194e3837df9d60e1a4b98e2)
#3 std::__detail::_Scanner<char>::_Scanner(char const*, char const*,
std::regex_constants::syntax_option_type, std::locale)
/usr/include/c++/14/bits/regex_scanner.tcc:65 (a.out+0x982a) (BuildId:
bcee17cb170f2378d194e3837df9d60e1a4b98e2)
#4 std::__detail::_Compiler<std::__cxx11::regex_traits<char>
>::_Compiler(char const*, char const*, std::locale const&,
std::regex_constants::syntax_option_type)
/usr/include/c++/14/bits/regex_compiler.tcc:69 (a.out+0x8909) (BuildId:
bcee17cb170f2378d194e3837df9d60e1a4b98e2)
#5 std::__cxx11::basic_regex<char, std::__cxx11::regex_traits<char>
>::_M_compile(char const*, char const*,
std::regex_constants::syntax_option_type) /usr/include/c++/14/bits/regex.h:809
(a.out+0x8103) (BuildId: bcee17cb170f2378d194e3837df9d60e1a4b98e2)
#6 std::__cxx11::basic_regex<char, std::__cxx11::regex_traits<char>
>::basic_regex(char const*, std::regex_constants::syntax_option_type)
/usr/include/c++/14/bits/regex.h:473 (a.out+0x7979) (BuildId:
bcee17cb170f2378d194e3837df9d60e1a4b98e2)
#7 f() /home/bjacob/backup/C++/tests/thread6.cpp:9 (a.out+0x5790) (BuildId:
bcee17cb170f2378d194e3837df9d60e1a4b98e2)
#8 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void
(*&&)()) /usr/include/c++/14/bits/invoke.h:61 (a.out+0x42c00) (BuildId:
bcee17cb170f2378d194e3837df9d60e1a4b98e2)
#9 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void
(*&&)()) /usr/include/c++/14/bits/invoke.h:96 (a.out+0x42b65) (BuildId:
bcee17cb170f2378d194e3837df9d60e1a4b98e2)
#10 void std::thread::_Invoker<std::tuple<void (*)()>
>::_M_invoke<0ul>(std::_Index_tuple<0ul>)
/usr/include/c++/14/bits/std_thread.h:301 (a.out+0x42aca) (BuildId:
bcee17cb170f2378d194e3837df9d60e1a4b98e2)
#11 std::thread::_Invoker<std::tuple<void (*)()> >::operator()()
/usr/include/c++/14/bits/std_thread.h:308 (a.out+0x429ee) (BuildId:
bcee17cb170f2378d194e3837df9d60e1a4b98e2)
#12 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)()> >
>::_M_run() /usr/include/c++/14/bits/std_thread.h:253 (a.out+0x42970) (BuildId:
bcee17cb170f2378d194e3837df9d60e1a4b98e2)
#13 <null> <null> (libstdc++.so.6+0xe1223) (BuildId:
133b71e0013695cc7832680a74edb51008c4fc4c)
Previous read of size 1 at 0x7f2a17e63b07 by main thread:
#0 std::ctype<char>::narrow(char, char) const
/usr/include/c++/14/bits/locale_facets.h:941 (a.out+0x6156) (BuildId:
bcee17cb170f2378d194e3837df9d60e1a4b98e2)
#1 std::__detail::_Scanner<char>::_M_scan_normal()
/usr/include/c++/14/bits/regex_scanner.tcc:100 (a.out+0xe010) (BuildId:
bcee17cb170f2378d194e3837df9d60e1a4b98e2)
#2 std::__detail::_Scanner<char>::_M_advance()
/usr/include/c++/14/bits/regex_scanner.tcc:79 (a.out+0xc0a2) (BuildId:
bcee17cb170f2378d194e3837df9d60e1a4b98e2)
#3 std::__detail::_Scanner<char>::_Scanner(char const*, char const*,
std::regex_constants::syntax_option_type, std::locale)
/usr/include/c++/14/bits/regex_scanner.tcc:65 (a.out+0x982a) (BuildId:
bcee17cb170f2378d194e3837df9d60e1a4b98e2)
#4 std::__detail::_Compiler<std::__cxx11::regex_traits<char>
>::_Compiler(char const*, char const*, std::locale const&,
std::regex_constants::syntax_option_type)
/usr/include/c++/14/bits/regex_compiler.tcc:69 (a.out+0x8909) (BuildId:
bcee17cb170f2378d194e3837df9d60e1a4b98e2)
#5 std::__cxx11::basic_regex<char, std::__cxx11::regex_traits<char>
>::_M_compile(char const*, char const*,
std::regex_constants::syntax_option_type) /usr/include/c++/14/bits/regex.h:809
(a.out+0x8103) (BuildId: bcee17cb170f2378d194e3837df9d60e1a4b98e2)
#6 std::__cxx11::basic_regex<char, std::__cxx11::regex_traits<char>
>::basic_regex(char const*, std::regex_constants::syntax_option_type)
/usr/include/c++/14/bits/regex.h:473 (a.out+0x7979) (BuildId:
bcee17cb170f2378d194e3837df9d60e1a4b98e2)
#7 f() /home/bjacob/backup/C++/tests/thread6.cpp:9 (a.out+0x5790) (BuildId:
bcee17cb170f2378d194e3837df9d60e1a4b98e2)
#8 main /home/bjacob/backup/C++/tests/thread6.cpp:16 (a.out+0x585e)
(BuildId: bcee17cb170f2378d194e3837df9d60e1a4b98e2)
Location is global '<null>' at 0x000000000000 (libstdc++.so.6+0x263b07)
Thread T1 (tid=1281721, running) created by main thread at:
#0 pthread_create
../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:1022
(libtsan.so.2+0x568a6) (BuildId: 99ef88596cb10a8ccf307fe1a9070f66a44b1624)
#1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State,
std::default_delete<std::thread::_State> >, void (*)()) <null>
(libstdc++.so.6+0xe12f8) (BuildId: 133b71e0013695cc7832680a74edb51008c4fc4c)
#2 main /home/bjacob/backup/C++/tests/thread6.cpp:14 (a.out+0x5841)
(BuildId: bcee17cb170f2378d194e3837df9d60e1a4b98e2)
SUMMARY: ThreadSanitizer: data race
/usr/include/c++/14/bits/locale_facets.h:945 in std::ctype<char>::narrow(char,
char) const
________________________________________
Configured with: ../src/configure -v --with-pkgversion='Debian 14.2.0-19'
--with-bugurl=file:///usr/share/doc/gcc-14/README.Bugs
--enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2,rust --prefix=/usr
--with-gcc-major-version-only --program-suffix=-14
--program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id
--libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix
--libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu
--enable-libstdcxx-debug --enable-libstdcxx-time=yes
--with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace
--enable-gnu-unique-object --disable-vtable-verify --enable-plugin
--enable-default-pie --with-system-zlib --enable-libphobos-checking=release
--with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch
--disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64
--with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic
--enable-offload-targets=nvptx-none=/build/reproducible-path/gcc-14-14.2.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/reproducible-path/gcc-14-14.2.0/debian/tmp-gcn/usr
--enable-offload-defaulted --without-cuda-driver --enable-checking=release
--build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
--with-build-config=bootstrap-lto-lean --enable-link-serialization=3