| // RUN: %clangxx_asan -O0 -fsanitize-address-use-after-scope %s -o %t |
| |
| // RUN: not %run %t 'A' 2>&1 | FileCheck %s |
| // RUN: not %run %t 'B' 2>&1 | FileCheck %s |
| |
| // Missing lifetime markers in test_a |
| // https://bugs.llvm.org/show_bug.cgi?id=34353 |
| // XFAIL: * |
| |
| struct B { |
| B() : p('B') {} |
| char p; |
| }; |
| |
| struct C { |
| const char *p; |
| explicit C(const char *c) : p(c) {} |
| C(const B &b) : p(&b.p) {} // NOLINT |
| }; |
| |
| struct A { |
| char p; |
| explicit A() : p('C') {} |
| const operator C() const { return C(&p); } |
| }; |
| |
| volatile char r; |
| void test_a() { |
| C s = A(); |
| r = *s.p; |
| } |
| |
| void test_b() { |
| C s = B(); |
| r = *s.p; |
| } |
| |
| int main(int argc, char **argv) { |
| switch (argv[1][0]) { |
| case 'A': |
| test_a(); |
| return 0; |
| case 'B': |
| test_b(); |
| return 0; |
| } |
| return 1; |
| } |
| |
| // CHECK: ERROR: AddressSanitizer: stack-use-after-scope |