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

Reply via email to