xref: /llvm-project/compiler-rt/test/msan/cxa_atexit.cpp (revision 15805c030f31b8d112ee4a4706ff4f5725c794df)
1*15805c03SVitaly Buka // RUN: %clangxx_msan -fno-sanitize-memory-param-retval -O0 %s -o %t && %run %t %p
2d21b3d34SFangrui Song 
3d21b3d34SFangrui Song // PR17377: C++ module destructors get stale argument shadow.
4d21b3d34SFangrui Song 
5d21b3d34SFangrui Song #include <stdio.h>
6d21b3d34SFangrui Song #include <stdlib.h>
7d21b3d34SFangrui Song class A {
8d21b3d34SFangrui Song public:
9d21b3d34SFangrui Song   // This destructor get stale argument shadow left from the call to f().
~A()10d21b3d34SFangrui Song   ~A() {
11d21b3d34SFangrui Song     if (this)
12d21b3d34SFangrui Song       exit(0);
13d21b3d34SFangrui Song   }
14d21b3d34SFangrui Song };
15d21b3d34SFangrui Song 
16d21b3d34SFangrui Song A a;
17d21b3d34SFangrui Song 
18d21b3d34SFangrui Song __attribute__((noinline))
f(long x)19d21b3d34SFangrui Song void f(long x) {
20d21b3d34SFangrui Song }
21d21b3d34SFangrui Song 
main(void)22d21b3d34SFangrui Song int main(void) {
23d21b3d34SFangrui Song   long  x;
24d21b3d34SFangrui Song   long * volatile p = &x;
25d21b3d34SFangrui Song   // This call poisons TLS shadow for the first function argument.
26d21b3d34SFangrui Song   f(*p);
27d21b3d34SFangrui Song   return 0;
28d21b3d34SFangrui Song }
29