xref: /llvm-project/compiler-rt/test/tysan/global.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 #include <stdlib.h>
4*641fbf15SFlorian Hahn #include <string.h>
5*641fbf15SFlorian Hahn 
6*641fbf15SFlorian Hahn float P;
7*641fbf15SFlorian Hahn long L;
8*641fbf15SFlorian Hahn 
9*641fbf15SFlorian Hahn int main() {
10*641fbf15SFlorian Hahn   *(int *)&P = 5;
11*641fbf15SFlorian Hahn   // CHECK: ERROR: TypeSanitizer: type-aliasing-violation
12*641fbf15SFlorian Hahn   // CHECK: WRITE of size 4 at {{.*}} with type int accesses an existing object of type float
13*641fbf15SFlorian Hahn   // CHECK: {{#0 0x.* in main .*global.c:}}[[@LINE-3]]
14*641fbf15SFlorian Hahn 
15*641fbf15SFlorian Hahn   void *mem = malloc(sizeof(long));
16*641fbf15SFlorian Hahn   *(int *)mem = 6;
17*641fbf15SFlorian Hahn   memcpy(mem, &L, sizeof(L));
18*641fbf15SFlorian Hahn   *(int *)mem = 8;
19*641fbf15SFlorian Hahn   // CHECK: ERROR: TypeSanitizer: type-aliasing-violation
20*641fbf15SFlorian Hahn   // CHECK: WRITE of size 4 at {{.*}} with type int accesses an existing object of type long
21*641fbf15SFlorian Hahn   // CHECK: {{#0 0x.* in main .*global.c:}}[[@LINE-3]]
22*641fbf15SFlorian Hahn   int r = *(((int *)mem) + 1);
23*641fbf15SFlorian Hahn   // CHECK: ERROR: TypeSanitizer: type-aliasing-violation
24*641fbf15SFlorian Hahn   // CHECK: READ of size 4 at {{.*}} with type int accesses part of an existing object of type long that starts at offset -4
25*641fbf15SFlorian Hahn   // CHECK: {{#0 0x.* in main .*global.c:}}[[@LINE-3]]
26*641fbf15SFlorian Hahn   free(mem);
27*641fbf15SFlorian Hahn 
28*641fbf15SFlorian Hahn   return r;
29*641fbf15SFlorian Hahn }
30*641fbf15SFlorian Hahn 
31*641fbf15SFlorian Hahn // CHECK-NOT: ERROR: TypeSanitizer: type-aliasing-violation
32