14430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov// We can't unwind stack if we're running coroutines on heap-allocated
24430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov// memory. Make sure we don't report these leaks.
34430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov
44430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov// RUN: %clangxx_lsan %s -o %t
52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %run %t 2>&1
62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: not %run %t foo 2>&1 | FileCheck %s
74430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov
84430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov#include <stdio.h>
94430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov#include <ucontext.h>
104430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov#include <unistd.h>
114430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov
124430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonovconst int kStackSize = 1 << 20;
134430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov
144430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonovvoid Child() {
154430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov  int child_stack;
164430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov  printf("Child: %p\n", &child_stack);
174430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov  int *leaked = new int[666];
184430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov}
194430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov
204430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonovint main(int argc, char *argv[]) {
214430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov  char stack_memory[kStackSize + 1];
224430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov  char *heap_memory = new char[kStackSize + 1];
234430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov  char *child_stack = (argc > 1) ? stack_memory : heap_memory;
244430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov
254430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov  printf("Child stack: %p\n", child_stack);
264430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov  ucontext_t orig_context;
274430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov  ucontext_t child_context;
284430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov  getcontext(&child_context);
294430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov  child_context.uc_stack.ss_sp = child_stack;
304430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov  child_context.uc_stack.ss_size = kStackSize / 2;
314430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov  child_context.uc_link = &orig_context;
324430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov  makecontext(&child_context, Child, 0);
334430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov  if (swapcontext(&orig_context, &child_context) < 0) {
344430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov    perror("swapcontext");
354430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov    return 1;
364430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov  }
374430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov
384430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov  delete[] heap_memory;
394430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov  return 0;
404430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov}
414430fdb4b04ae28d22cc6b24eab762afdb2fa0b7Alexey Samsonov
422fb08720b11b4c339e191b90d85477c6a2dd74dbAlexey Samsonov// CHECK: SUMMARY: {{(Leak|Address)}}Sanitizer: 2664 byte(s) leaked in 1 allocation(s)
43