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

            Bug ID: 91056
           Summary: Fail: asan reports stack-use-after-scope in valid
                    program
           Product: gcc
           Version: 9.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: grishalipenko at protonmail dot com
  Target Milestone: ---

#include <memory>
#include <vector>

class A
{
public:
  A ()
  {
    g = std::make_unique<double> (2.0);
  }
private:
  std::unique_ptr<double> g;
  std::vector<int> v = {1, 2, 3, 4};
};

int main (/*int argc, char *argv[]*/)
{
  for (int i = 0; i < 2; i++)
    auto a = std::make_unique<A> ();   
  return 0;
}

grigorij.lipenko@WS236 ~ $ g++ -g prog.cpp -Wall -Wextra -std=c++17
-fsanitize=address
grigorij.lipenko@WS236 ~ $ ./a.out 
=================================================================
==41033==ERROR: AddressSanitizer: stack-use-after-scope on address
0x000000200da0 at pc 0x7fe16ee380b0 bp 0x7ffe398abce0 sp 0x7ffe398ab488
READ of size 16 at 0x000000200da0 thread T0
    #0 0x7fe16ee380af in memmove (/lib64/libasan.so.5+0xa10af)
    #1 0x204fad in int* std::__copy_move<false, true,
std::random_access_iterator_tag>::__copy_m<int>(int const*, int const*, int*)
/usr/include/c++/9/bits/stl_algobase.h:386
    #2 0x204f41 in int* std::__copy_move_a<false, int const*, int*>(int const*,
int const*, int*) /usr/include/c++/9/bits/stl_algobase.h:404
    #3 0x204e64 in int* std::__copy_move_a2<false, int const*, int*>(int
const*, int const*, int*) /usr/include/c++/9/bits/stl_algobase.h:440
    #4 0x204cc8 in int* std::copy<int const*, int*>(int const*, int const*,
int*) /usr/include/c++/9/bits/stl_algobase.h:474
    #5 0x204bc2 in int* std::__uninitialized_copy<true>::__uninit_copy<int
const*, int*>(int const*, int const*, int*)
/usr/include/c++/9/bits/stl_uninitialized.h:101
    #6 0x2049b2 in int* std::uninitialized_copy<int const*, int*>(int const*,
int const*, int*) /usr/include/c++/9/bits/stl_uninitialized.h:134
    #7 0x204399 in int* std::__uninitialized_copy_a<int const*, int*, int>(int
const*, int const*, int*, std::allocator<int>&)
/usr/include/c++/9/bits/stl_uninitialized.h:289
    #8 0x203dcf in void std::vector<int, std::allocator<int>
>::_M_range_initialize<int const*>(int const*, int const*,
std::forward_iterator_tag) /usr/include/c++/9/bits/stl_vector.h:1582
    #9 0x20362e in std::vector<int, std::allocator<int>
>::vector(std::initializer_list<int>, std::allocator<int> const&)
/usr/include/c++/9/bits/stl_vector.h:626
    #10 0x20332f in A::A() /home/grigorij.lipenko/prog.cpp:8
    #11 0x203993 in std::_MakeUniq<A>::__single_object std::make_unique<A>()
/usr/include/c++/9/bits/unique_ptr.h:853
    #12 0x20319f in main /home/grigorij.lipenko/prog.cpp:19
    #13 0x7fe16e89bf32 in __libc_start_main (/lib64/libc.so.6+0x23f32)
    #14 0x20302d in _start (/home/grigorij.lipenko/a.out+0x20302d)

0x000000200da0 is located 0 bytes inside of global variable 'C.0' defined in
'prog.cpp:8:3' (0x200da0) of size 16
SUMMARY: AddressSanitizer: stack-use-after-scope (/lib64/libasan.so.5+0xa10af)
in memmove
Shadow bytes around the buggy address:
  0x000080038160: f9 f9 f9 f9 01 f9 f9 f9 f9 f9 f9 f9 01 f9 f9 f9
  0x000080038170: f9 f9 f9 f9 01 f9 f9 f9 f9 f9 f9 f9 01 f9 f9 f9
  0x000080038180: f9 f9 f9 f9 00 00 00 00 00 00 00 00 00 00 00 00
  0x000080038190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0000800381a0: 00 00 01 f9 f9 f9 f9 f9 00 00 00 00 00 00 00 00
=>0x0000800381b0: 00 00 00 00[f8]f8 f9 f9 f9 f9 f9 f9 00 00 00 00
  0x0000800381c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0000800381d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0000800381e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0000800381f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x000080038200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
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
==41033==ABORTING

Not reproduced with gcc 8.3.0 and clang 7.1.0

Reply via email to