xref: /llvm-project/compiler-rt/test/hwasan/TestCases/use-after-scope-dtor-order.cpp (revision 6cc9244baa63fcb7c6f35f46dab9fa17a421a6ce)
1 // This is the ASAN test of the same name ported to HWAsan.
2 
3 // RUN: %clangxx_hwasan -O1 %s -o %t && \
4 // RUN:     not %run %t 2>&1 | FileCheck %s
5 
6 // REQUIRES: aarch64-target-arch || riscv64-target-arch
7 
8 #include <stdio.h>
9 
10 struct IntHolder {
IntHolderIntHolder11   explicit IntHolder(int *val = 0) : val_(val) {}
~IntHolderIntHolder12   __attribute__((noinline)) ~IntHolder() {
13     printf("Value: %d\n", *val_); // BOOM
14     // CHECK: ERROR: HWAddressSanitizer: tag-mismatch
15     // CHECK:  #0 0x{{.*}} in IntHolder::~IntHolder{{.*}}.cpp:[[@LINE-2]]
16   }
setIntHolder17   void set(int *val) { val_ = val; }
getIntHolder18   int *get() { return val_; }
19 
20   int *val_;
21 };
22 
main(int argc,char * argv[])23 int main(int argc, char *argv[]) {
24   // It is incorrect to use "x" int IntHolder destructor, because "x" is
25   // "destroyed" earlier as it's declared later.
26   IntHolder holder;
27   int x = argc;
28   holder.set(&x);
29   return 0;
30 }
31