xref: /llvm-project/compiler-rt/test/tysan/struct-offset.c (revision 641fbf1524338c86c952ebb1ec8d2b497ada3cef)
1*641fbf15SFlorian Hahn // RUN: %clang_tysan -O0 %s -o %t && %run %t >%t.out 2>&1
2*641fbf15SFlorian Hahn // RUN: FileCheck %s < %t.out
3*641fbf15SFlorian Hahn 
4*641fbf15SFlorian Hahn #include <stdio.h>
5*641fbf15SFlorian Hahn #include <stdlib.h>
6*641fbf15SFlorian Hahn 
7*641fbf15SFlorian Hahn struct X {
8*641fbf15SFlorian Hahn   int i;
9*641fbf15SFlorian Hahn   int j;
10*641fbf15SFlorian Hahn };
11*641fbf15SFlorian Hahn 
12*641fbf15SFlorian Hahn int foo(struct X *p, struct X *q) {
13*641fbf15SFlorian Hahn   q->j = 1;
14*641fbf15SFlorian Hahn   p->i = 0;
15*641fbf15SFlorian Hahn   // CHECK: ERROR: TypeSanitizer: type-aliasing-violation
16*641fbf15SFlorian Hahn   // CHECK: WRITE of size 4 at {{.*}} with type int (in X at offset 0) accesses an existing object of type int (in X at offset 4)
17*641fbf15SFlorian Hahn   // CHECK: {{#0 0x.* in foo .*struct-offset.c:}}[[@LINE-3]]
18*641fbf15SFlorian Hahn   return q->j;
19*641fbf15SFlorian Hahn }
20*641fbf15SFlorian Hahn 
21*641fbf15SFlorian Hahn int main() {
22*641fbf15SFlorian Hahn   unsigned char *p = malloc(3 * sizeof(int));
23*641fbf15SFlorian Hahn   printf("%i\n", foo((struct X *)(p + sizeof(int)), (struct X *)p));
24*641fbf15SFlorian Hahn }
25*641fbf15SFlorian Hahn 
26*641fbf15SFlorian Hahn // CHECK-NOT: ERROR: TypeSanitizer: type-aliasing-violation
27