https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86296

--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> ---
$ g++ b.cpp -O1 -fsantiize=address
$ ./a.out
=================================================================
==22544==ERROR: AddressSanitizer: stack-use-after-scope on address
0x7ffc3624eca0 at pc 0x000000400ec3 bp 0x7ffc3624ebf0 sp 0x7ffc3624ebe8
READ of size 4 at 0x7ffc3624eca0 thread T0
    #0 0x400ec2 in main /tmp/b.cpp:74
    #1 0x7f45e4d4bf29 in __libc_start_main ../csu/libc-start.c:308
    #2 0x400c79 in _start (/tmp/a.out+0x400c79)

Address 0x7ffc3624eca0 is located in stack of thread T0 at offset 160 in frame
    #0 0x400d31 in main /tmp/b.cpp:68

  This frame has 8 object(s):
    [32, 36) 'safe_fd'
    [96, 100) '<unknown>'
    [160, 164) '<unknown>' <== Memory access at offset 160 is inside this
variable
    [224, 228) '__tmp'
    [288, 292) '<unknown>'
    [352, 356) '<unknown>'
    [416, 420) '<unknown>'
    [480, 484) '<unknown>'
etc.

Additionally (though this isn't the cause of the behaviour you observe):

$ g++ b.cpp -D_GLIBCXX_ASSERTIONS
$ ./a.out

default initialization: safe_fd =
/home/jwakely/gcc/9/include/c++/9.0.0/bits/unique_ptr.h:328: typename
std::add_lvalue_reference<_Tp>::type std::unique_ptr<_Tp, _Dp>::operator*()
const [with _Tp = int; _Dp = raii_generic_deleter<int, -1, int (*)(int),
close>; typename std::add_lvalue_reference<_Tp>::type = int&]: Assertion 'get()
!= pointer()' failed.
Aborted (core dumped)

Reply via email to