xref: /llvm-project/compiler-rt/test/fuzzer/UseAfterDtor.cpp (revision a34c65e845dc7f55a335cdede2033766eb73b66a)
1*a34c65e8SMatt Morehouse #include <cstdint>
2*a34c65e8SMatt Morehouse #include <cstdio>
3*a34c65e8SMatt Morehouse 
4*a34c65e8SMatt Morehouse struct Simple {
5*a34c65e8SMatt Morehouse   int x_;
SimpleSimple6*a34c65e8SMatt Morehouse   Simple() {
7*a34c65e8SMatt Morehouse     x_ = 5;
8*a34c65e8SMatt Morehouse   }
~SimpleSimple9*a34c65e8SMatt Morehouse   ~Simple() {
10*a34c65e8SMatt Morehouse     x_ += 1;
11*a34c65e8SMatt Morehouse   }
12*a34c65e8SMatt Morehouse };
13*a34c65e8SMatt Morehouse 
14*a34c65e8SMatt Morehouse Simple *volatile SimpleSink;
15*a34c65e8SMatt Morehouse 
LLVMFuzzerTestOneInput(const uint8_t * Data,size_t Size)16*a34c65e8SMatt Morehouse extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
17*a34c65e8SMatt Morehouse   if (Size < 4) return 0;
18*a34c65e8SMatt Morehouse   if (Data[0] == 'F' && Data[1] == 'U' && Data[2] == 'Z' && Data[3] == 'Z') {
19*a34c65e8SMatt Morehouse     {
20*a34c65e8SMatt Morehouse       Simple S;
21*a34c65e8SMatt Morehouse       SimpleSink = &S;
22*a34c65e8SMatt Morehouse     }
23*a34c65e8SMatt Morehouse     if (SimpleSink->x_) fprintf(stderr, "Failed to catch use-after-dtor\n");
24*a34c65e8SMatt Morehouse   }
25*a34c65e8SMatt Morehouse   return 0;
26*a34c65e8SMatt Morehouse }
27*a34c65e8SMatt Morehouse 
28