https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94299
Bug ID: 94299 Summary: false positive: AddressSanitizer: stack-use-after-scope on address Product: gcc Version: 9.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: sanitizer Assignee: unassigned at gcc dot gnu.org Reporter: jan.kratochvil at redhat 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, marxin at gcc dot gnu.org Target Milestone: --- Created attachment 48103 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=48103&action=edit reproducer patch I believe it is a false positive. gcc-9.2.1-1.fc31.x86_64 git clone https://github.com/llvm/llvm-project.git (cd llvm-project;git checkout b6ae8937e031cde2e70e6a83d46c21e940fdf4ac;patch -p1 <../asan.patch) mkdir llvm-project-gccassertdebugasanO1 cd llvm-project-gccassertdebugasanO1 cmake ../llvm-project-gccassertdebugasanO1/llvm/ -DCMAKE_BUILD_TYPE=Debug -DLLVM_USE_LINKER=gold -DLLVM_ENABLE_PROJECTS="lldb;clang;lld" -DLLVM_USE_SPLIT_DWARF=ON -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=gold -Wl,--gdb-index" -DCMAKE_SHARED_LINKER_FLAGS="-fuse-ld=gold -Wl,--gdb-index" -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_OPTIMIZED_TABLEGEN=ON -DLLVM_USE_SANITIZER=Address make gdb -batch -ex 'catch syscall exit_group' -ex r -ex bt -ex 'frame 19' -ex 'info source' --args ./bin/lldb -o 'command regex -h h -s s foo s/1/2/' Catchpoint 1 (syscall 'exit_group' [231]) [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib64/libthread_db.so.1". [Detaching after vfork from child process 1526560] [Detaching after vfork from child process 1526576] [New Thread 0x7fffd1ad2700 (LWP 1526592)] (lldb) command regex -h h -s s foo s/1/2/ ================================================================= ==1526553==ERROR: AddressSanitizer: stack-use-after-scope on address 0x7fffffffa410 at pc 0x7fffd9c497ec bp 0x7fffffff9c10 sp 0x7fffffff9c00 READ of size 1 at 0x7fffffffa410 thread T0 #0 0x7fffd9c497eb in void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<char const*>(char const*, char const*, std::forward_iterator_tag) (/quad/home/jkratoch/redhat/llvm-monorepo3-gccassertdebugasanO1/bin/../lib/liblldb.so.11git+0x28d77eb) #1 0x7fffdb147b04 in lldb_private::CommandObject::CommandObject(lldb_private::CommandInterpreter&, llvm::StringRef, llvm::StringRef, llvm::StringRef, unsigned int) (/quad/home/jkratoch/redhat/llvm-monorepo3-gccassertdebugasanO1/bin/../lib/liblldb.so.11git+0x3dd5b04) #2 0x7fffdb14d6b2 in lldb_private::CommandObjectRegexCommand::CommandObjectRegexCommand(lldb_private::CommandInterpreter&, llvm::StringRef, llvm::StringRef, llvm::StringRef, unsigned int, unsigned int, bool) (/quad/home/jkratoch/redhat/llvm-monorepo3-gccassertdebugasanO1/bin/../lib/liblldb.so.11git+0x3ddb6b2) #3 0x7fffe2c80c35 in CommandObjectCommandsAddRegex::DoExecute(lldb_private::Args&, lldb_private::CommandReturnObject&) (/quad/home/jkratoch/redhat/llvm-monorepo3-gccassertdebugasanO1/bin/../lib/liblldb.so.11git+0xb90ec35) #4 0x7fffdb1432c3 in lldb_private::CommandObjectParsed::Execute(char const*, lldb_private::CommandReturnObject&) (/quad/home/jkratoch/redhat/llvm-monorepo3-gccassertdebugasanO1/bin/../lib/liblldb.so.11git+0x3dd12c3) #5 0x7fffdb12c344 in lldb_private::CommandInterpreter::HandleCommand(char const*, lldb_private::LazyBool, lldb_private::CommandReturnObject&, lldb_private::ExecutionContext*, bool, bool) (/quad/home/jkratoch/redhat/llvm-monorepo3-gccassertdebugasanO1/bin/../lib/liblldb.so.11git+0x3dba344) #6 0x7fffdb1319be in lldb_private::CommandInterpreter::IOHandlerInputComplete(lldb_private::IOHandler&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) (/quad/home/jkratoch/redhat/llvm-monorepo3-gccassertdebugasanO1/bin/../lib/liblldb.so.11git+0x3dbf9be) #7 0x7fffdad4286f in lldb_private::IOHandlerEditline::Run() (/quad/home/jkratoch/redhat/llvm-monorepo3-gccassertdebugasanO1/bin/../lib/liblldb.so.11git+0x39d086f) #8 0x7fffdacb1d2d in lldb_private::Debugger::RunIOHandlers() (/quad/home/jkratoch/redhat/llvm-monorepo3-gccassertdebugasanO1/bin/../lib/liblldb.so.11git+0x393fd2d) #9 0x7fffdb0e5ade in lldb_private::CommandInterpreter::RunCommandInterpreter(bool, bool, lldb_private::CommandInterpreterRunOptions&) (/quad/home/jkratoch/redhat/llvm-monorepo3-gccassertdebugasanO1/bin/../lib/liblldb.so.11git+0x3d73ade) #10 0x7fffd9e51ed9 in lldb::SBDebugger::RunCommandInterpreter(bool, bool, lldb::SBCommandInterpreterRunOptions&, int&, bool&, bool&) (/quad/home/jkratoch/redhat/llvm-monorepo3-gccassertdebugasanO1/bin/../lib/liblldb.so.11git+0x2adfed9) #11 0x412c7e in Driver::MainLoop() (/quad/home/jkratoch/redhat/llvm-monorepo3-gccassertdebugasanO1/bin/lldb+0x412c7e) #12 0x42339d in main (/quad/home/jkratoch/redhat/llvm-monorepo3-gccassertdebugasanO1/bin/lldb+0x42339d) #13 0x7fffd54351a2 in __libc_start_main ../csu/libc-start.c:308 #14 0x4078ad in _start (/quad/home/jkratoch/redhat/llvm-monorepo3-gccassertdebugasanO1/bin/lldb+0x4078ad) Address 0x7fffffffa410 is located in stack of thread T0 at offset 944 in frame #0 0x7fffe2c80311 in CommandObjectCommandsAddRegex::DoExecute(lldb_private::Args&, lldb_private::CommandReturnObject&) (/quad/home/jkratoch/redhat/llvm-monorepo3-gccassertdebugasanO1/bin/../lib/liblldb.so.11git+0xb90e311) This frame has 39 object(s): [32, 33) '<unknown>' [48, 49) '<unknown>' [64, 65) '<unknown>' [80, 81) '<unknown>' [96, 97) '<unknown>' [112, 113) '<unknown>' [128, 129) '<unknown>' [144, 145) '<unknown>' [160, 161) '<unknown>' [176, 177) '<unknown>' [192, 193) '<unknown>' [208, 209) '<unknown>' [224, 225) '<unknown>' [240, 241) '<unknown>' [256, 264) '<unknown>' [288, 304) '<unknown>' [320, 336) 'name' (line 990) [352, 368) '<unknown>' [384, 400) '<unknown>' [416, 432) 'io_handler_sp' (line 999) [448, 464) '<unknown>' [480, 496) '<unknown>' [512, 528) '<unknown>' [544, 560) '<unknown>' [576, 592) '<unknown>' [608, 624) '<unknown>' [640, 656) '<unknown>' [672, 688) '<unknown>' [704, 720) '<unknown>' [736, 752) '<unknown>' [768, 784) '<unknown>' [800, 816) '<unknown>' [832, 848) '<unknown>' [864, 880) '<unknown>' [896, 912) 'cmd_sp' (line 1130) [928, 960) '<unknown>' <== Memory access at offset 944 is inside this variable [992, 1024) '<unknown>' [1056, 1096) 'error' (line 989) [1136, 1176) '<unknown>' HINT: this may be a false positive if your program uses some custom stack unwind mechanism, swapcontext or vfork (longjmp and C++ exceptions *are* supported) SUMMARY: AddressSanitizer: stack-use-after-scope (/quad/home/jkratoch/redhat/llvm-monorepo3-gccassertdebugasanO1/bin/../lib/liblldb.so.11git+0x28d77eb) in void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<char const*>(char const*, char const*, std::forward_iterator_tag) Shadow bytes around the buggy address: 0x10007fff7430: 00 00 f2 f2 00 00 f2 f2 00 00 f2 f2 00 00 f2 f2 0x10007fff7440: 00 00 f2 f2 00 00 f2 f2 00 00 f2 f2 00 00 f2 f2 0x10007fff7450: 00 00 f2 f2 00 00 f2 f2 f8 f8 f2 f2 00 00 f2 f2 0x10007fff7460: 00 00 f2 f2 00 00 f2 f2 00 00 f2 f2 00 00 f2 f2 0x10007fff7470: f8 f8 f2 f2 f8 f8 f2 f2 00 00 f2 f2 00 00 f2 f2 =>0x10007fff7480: f8 f8[f8]f8 f2 f2 f2 f2 f8 f8 f8 f8 f2 f2 f2 f2 0x10007fff7490: 00 00 00 00 00 f2 f2 f2 f2 f2 00 00 00 00 00 f3 0x10007fff74a0: f3 f3 f3 f3 00 00 00 00 00 00 00 00 00 00 00 00 0x10007fff74b0: 00 00 00 00 00 00 f1 f1 f1 f1 f8 f8 f2 f2 f8 f8 0x10007fff74c0: f2 f2 f8 f8 f2 f2 f8 f8 f2 f2 f8 f8 f2 f2 f8 f8 0x10007fff74d0: f2 f2 f8 f8 f2 f2 00 00 f2 f2 f8 f8 f2 f2 f8 f8 Shadow byte legend (one shadow byte represents 8 application bytes): Addressable: 00 Partially addressable: 01 02 03 04 05 06 07 Heap left redzone: fa Freed heap region: fd Stack left redzone: f1 Stack mid redzone: f2 Stack right redzone: f3 Stack after return: f5 Stack use after scope: f8 Global redzone: f9 Global init order: f6 Poisoned by user: f7 Container overflow: fc Array cookie: ac Intra object redzone: bb ASan internal: fe Left alloca redzone: ca Right alloca redzone: cb Shadow gap: cc ==1526553==ABORTING Thread 1 "lldb" hit Catchpoint 1 (call to syscall exit_group), __sanitizer::internal__exit (exitcode=1) at ../../../../libsanitizer/sanitizer_common/sanitizer_linux.cc:429 429 Die(); // Unreachable. #0 __sanitizer::internal__exit (exitcode=1) at ../../../../libsanitizer/sanitizer_common/sanitizer_linux.cc:429 #1 0x00007ffff768f2e7 in __sanitizer::Die () at ../../../../libsanitizer/sanitizer_common/sanitizer_flags.h:37 #2 0x00007ffff767097c in __asan::ScopedInErrorReport::~ScopedInErrorReport (this=0x7fffffff8f96, __in_chrg=<optimized out>) at ../../../../libsanitizer/asan/asan_report.cc:185 #3 0x00007ffff76703f3 in __asan::ReportGenericError (pc=140736846927852, bp=bp@entry=140737488329744, sp=sp@entry=140737488329728, addr=addr@entry=140737488331792, is_write=is_write@entry=false, access_size=access_size@entry=1, exp=0, fatal=true) at ../../../../libsanitizer/asan/asan_report.cc:192 #4 0x00007ffff7670edb in __asan::__asan_report_load1 (addr=addr@entry=140737488331792) at ../../../../libsanitizer/asan/asan_rtl.cc:116 #5 0x00007fffd9c497ec in std::char_traits<char>::assign (__c2=@0x7fffffffa410: 104 'h', __c1=<optimized out>) at /usr/include/c++/9/bits/char_traits.h:365 #6 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_S_copy (__n=1, __s=0x7fffffffa410 "h", __d=<optimized out>) at /usr/include/c++/9/bits/basic_string.h:349 #7 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_S_copy_chars (__k2=<optimized out>, __k1=0x7fffffffa410 "h", __p=<optimized out>) at /usr/include/c++/9/bits/basic_string.h:398 #8 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<char const*> (this=0x7fffffff9ec0, __beg=<optimized out>, __end=<optimized out>) at /usr/include/c++/9/bits/basic_string.tcc:225 #9 0x00007fffdb147b05 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct_aux<char const*> (__end=<optimized out>, __beg=<optimized out>, this=0x7fffffff9ec0) at /usr/include/c++/9/bits/basic_string.h:243 #10 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<char const*> (__end=<optimized out>, __beg=<optimized out>, this=0x7fffffff9ec0) at /usr/include/c++/9/bits/basic_string.h:266 #11 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string (__a=..., __n=<optimized out>, __s=<optimized out>, this=0x7fffffff9ec0) at /usr/include/c++/9/bits/basic_string.h:513 #12 llvm::StringRef::str[abi:cxx11]() const (this=0x7fffffff9e80) at /home/jkratoch/redhat/llvm-monorepo3/llvm/include/llvm/ADT/StringRef.h:250 #13 llvm::StringRef::operator std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > (this=0x7fffffff9e80) at /home/jkratoch/redhat/llvm-monorepo3/llvm/include/llvm/ADT/StringRef.h:275 #14 lldb_private::CommandObject::CommandObject (this=0x6120000133c0, interpreter=..., name=..., help=..., syntax=..., flags=<optimized out>) at /home/jkratoch/redhat/llvm-monorepo3/lldb/source/Interpreter/CommandObject.cpp:47 #15 0x00007fffdb14d6b3 in lldb_private::CommandObjectRaw::CommandObjectRaw (flags=0, syntax=..., help=..., name=..., interpreter=..., this=0x6120000133c0) at /home/jkratoch/redhat/llvm-monorepo3/lldb/include/lldb/Interpreter/CommandObject.h:396 #16 lldb_private::CommandObjectRegexCommand::CommandObjectRegexCommand (this=0x6120000133c0, interpreter=..., name=..., help=..., syntax=..., max_matches=10, completion_type_mask=0, is_removable=true) at /home/jkratoch/redhat/llvm-monorepo3/lldb/source/Interpreter/CommandObjectRegexCommand.cpp:24 #17 0x00007fffe2c80c36 in std::make_unique<lldb_private::CommandObjectRegexCommand, lldb_private::CommandInterpreter&, llvm::StringRef&, llvm::StringRef, llvm::StringRef, int, int, bool> () at /usr/include/c++/9/bits/unique_ptr.h:848 #18 CommandObjectCommandsAddRegex::DoExecute (this=<optimized out>, command=..., result=...) at /home/jkratoch/redhat/llvm-monorepo3/lldb/source/Commands/CommandObjectCommands.cpp:991 #19 0x00007fffdb1432c4 in lldb_private::CommandObjectParsed::Execute (this=<optimized out>, args_string=<optimized out>, result=...) at /home/jkratoch/redhat/llvm-monorepo3/lldb/source/Interpreter/CommandObject.cpp:995 #20 0x00007fffdb12c345 in lldb_private::CommandInterpreter::HandleCommand (this=this@entry=0x615000000800, command_line=<optimized out>, lazy_add_to_history=lazy_add_to_history@entry=lldb_private::eLazyBoolCalculate, result=..., override_context=override_context@entry=0x0, repeat_on_empty_command=repeat_on_empty_command@entry=true, no_context_switching=<optimized out>) at /usr/include/c++/9/bits/basic_string.h:2300 #21 0x00007fffdb1319bf in lldb_private::CommandInterpreter::IOHandlerInputComplete (this=0x615000000800, io_handler=..., line=...) at /usr/include/c++/9/bits/basic_string.h:2300 #22 0x00007fffdad42870 in lldb_private::IOHandlerEditline::Run (this=0x6130000129d0) at /home/jkratoch/redhat/llvm-monorepo3/lldb/source/Core/IOHandler.cpp:551 #23 0x00007fffdacb1d2e in lldb_private::Debugger::RunIOHandlers (this=0x618000001c80) at /home/jkratoch/redhat/llvm-monorepo3/lldb/source/Core/Debugger.cpp:835 #24 0x00007fffdb0e5adf in lldb_private::CommandInterpreter::RunCommandInterpreter (this=this@entry=0x615000000800, auto_handle_events=<optimized out>, spawn_thread=<optimized out>, options=...) at /home/jkratoch/redhat/llvm-monorepo3/lldb/source/Interpreter/CommandInterpreter.cpp:2968 #25 0x00007fffd9e51eda in lldb::SBDebugger::RunCommandInterpreter (this=this@entry=0x7fffffffcb10, auto_handle_events=<optimized out>, auto_handle_events@entry=true, spawn_thread=<optimized out>, spawn_thread@entry=false, options=..., num_errors=@0x7fffffffbe80: 0, quit_requested=@0x7fffffffbd20: false, stopped_for_crash=<optimized out>) at /home/jkratoch/redhat/llvm-monorepo3/lldb/source/API/SBDebugger.cpp:1189 #26 0x0000000000412c7f in Driver::MainLoop (this=this@entry=0x7fffffffcaf0) at /home/jkratoch/redhat/llvm-monorepo3/lldb/tools/driver/Driver.cpp:613 #27 0x000000000042339e in main (argc=<optimized out>, argv=<optimized out>) at /home/jkratoch/redhat/llvm-monorepo3/lldb/tools/driver/Driver.cpp:898 #19 0x00007fffdb1432c4 in lldb_private::CommandObjectParsed::Execute (this=<optimized out>, args_string=<optimized out>, result=...) at /home/jkratoch/redhat/llvm-monorepo3/lldb/source/Interpreter/CommandObject.cpp:995 995 handled = DoExecute(cmd_args, result); Current source file is /home/jkratoch/redhat/llvm-monorepo3/lldb/source/Interpreter/CommandObject.cpp Compilation directory is /home/jkratoch/redhat/llvm-monorepo3-gccassertdebugasanO1/tools/lldb/source/Interpreter Located in /home/jkratoch/redhat/llvm-monorepo3/lldb/source/Interpreter/CommandObject.cpp Contains 1134 lines. Source language is c++. Producer is GNU C++14 9.2.1 20190827 (Red Hat 9.2.1-1) -mtune=generic -march=x86-64 -g -gsplit-dwarf -O1 -std=c++14 -fPIC -fvisibility-inlines-hidden -fno-omit-frame-pointer -fsanitize=address -fsanitize-address-use-after-scope -fno-exceptions -fno-rtti. Compiled with DWARF 2 debugging format. Does not include preprocessor macro info.