xref: /llvm-project/compiler-rt/test/tysan/struct-offset-different-base.cpp (revision 09a8b7cbc29d8704c343197d4b33b6972366c682)
1 // RUN: %clangxx_tysan -O0 %s -o %t && %run %t >%t.out 2>&1
2 // RUN: FileCheck %s --implicit-check-not ERROR < %t.out
3 
4 // Modified reproducer from https://github.com/llvm/llvm-project/issues/105960
5 
6 #include <stdio.h>
7 
8 struct inner1 {
9   char buffer;
10   int i;
11 };
12 
13 struct inner2 {
14   char buffer;
15   int i;
16   float endBuffer;
17 };
18 
19 void init_inner1(inner1 *iPtr) { iPtr->i = 200; }
20 void init_inner2(inner2 *iPtr) {
21   iPtr->i = 400;
22   iPtr->endBuffer = 413.0f;
23 }
24 
25 struct outer {
26   inner1 foo;
27   inner2 bar;
28   char buffer;
29 };
30 
31 int main(void) {
32   outer *l = new outer();
33 
34   init_inner1(&l->foo);
35   init_inner2(&l->bar);
36 
37   int access = l->foo.i;
38   printf("Accessed value 1 is %d\n", access);
39   access = l->bar.i;
40   printf("Accessed value 2 is %d\n", access);
41   float fAccess = l->bar.endBuffer;
42   printf("Accessed value 3 is %f\n", fAccess);
43 
44   return 0;
45 }
46 
47 // CHECK: Accessed value 1 is 200
48 // CHECK: Accessed value 2 is 400
49 // CHECK: Accessed value 3 is 413.0
50