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.