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