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