xref: /llvm-project/compiler-rt/test/tysan/struct-offset-multiple-compilation-units.cpp (revision 641fbf1524338c86c952ebb1ec8d2b497ada3cef)
1*641fbf15SFlorian Hahn // RUN: %clangxx_tysan -O0 %s -c -o %t.o
2*641fbf15SFlorian Hahn // RUN: %clangxx_tysan -O0 %s -DPMAIN -c -o %tm.o
3*641fbf15SFlorian Hahn // RUN: %clangxx_tysan -O0 %s -DPINIT -c -o %tinit.o
4*641fbf15SFlorian Hahn // RUN: %clangxx_tysan -O0 %t.o %tm.o %tinit.o -o %t
5*641fbf15SFlorian Hahn // RUN: %run %t 2>&1 | FileCheck %s
6*641fbf15SFlorian Hahn 
7*641fbf15SFlorian Hahn #include <stdio.h>
8*641fbf15SFlorian Hahn #include <stdlib.h>
9*641fbf15SFlorian Hahn 
10*641fbf15SFlorian Hahn extern "C" {
11*641fbf15SFlorian Hahn typedef struct X {
12*641fbf15SFlorian Hahn   int *start;
13*641fbf15SFlorian Hahn   int *end;
14*641fbf15SFlorian Hahn   int i;
15*641fbf15SFlorian Hahn } X;
16*641fbf15SFlorian Hahn };
17*641fbf15SFlorian Hahn 
18*641fbf15SFlorian Hahn #ifdef PMAIN
19*641fbf15SFlorian Hahn int foo(struct X *);
20*641fbf15SFlorian Hahn void bar(struct X *);
21*641fbf15SFlorian Hahn void init(struct X *);
22*641fbf15SFlorian Hahn 
23*641fbf15SFlorian Hahn int main() {
24*641fbf15SFlorian Hahn   struct X x;
25*641fbf15SFlorian Hahn   init(&x);
26*641fbf15SFlorian Hahn   printf("%d\n", foo(&x));
27*641fbf15SFlorian Hahn   free(x.start);
28*641fbf15SFlorian Hahn   return 0;
29*641fbf15SFlorian Hahn }
30*641fbf15SFlorian Hahn 
31*641fbf15SFlorian Hahn #elif PINIT
32*641fbf15SFlorian Hahn 
33*641fbf15SFlorian Hahn void init(struct X *x) {
34*641fbf15SFlorian Hahn   x->start = (int *)calloc(100, sizeof(int));
35*641fbf15SFlorian Hahn   x->end = x->start + 99;
36*641fbf15SFlorian Hahn   x->i = 0;
37*641fbf15SFlorian Hahn }
38*641fbf15SFlorian Hahn 
39*641fbf15SFlorian Hahn #else
40*641fbf15SFlorian Hahn 
41*641fbf15SFlorian Hahn __attribute__((noinline)) int foo(struct X *x) {
42*641fbf15SFlorian Hahn   if (x->start < x->end)
43*641fbf15SFlorian Hahn     return 30;
44*641fbf15SFlorian Hahn   return 10;
45*641fbf15SFlorian Hahn }
46*641fbf15SFlorian Hahn 
47*641fbf15SFlorian Hahn void bar(struct X *x) { x->end = NULL; }
48*641fbf15SFlorian Hahn 
49*641fbf15SFlorian Hahn #endif
50*641fbf15SFlorian Hahn 
51*641fbf15SFlorian Hahn // CHECK-NOT: ERROR: TypeSanitizer: type-aliasing-violation
52