xref: /llvm-project/compiler-rt/test/tysan/basic.c (revision 641fbf1524338c86c952ebb1ec8d2b497ada3cef)
1*641fbf15SFlorian Hahn // RUN: %clang_tysan -O0 %s -o %t && %run %t 10 >%t.out.0 2>&1
2*641fbf15SFlorian Hahn // RUN: FileCheck %s < %t.out.0
3*641fbf15SFlorian Hahn // RUN: %clang_tysan -O2 %s -o %t && %run %t 10 >%t.out 2>&1
4*641fbf15SFlorian Hahn // RUN: FileCheck %s < %t.out
5*641fbf15SFlorian Hahn 
6*641fbf15SFlorian Hahn #include <stdio.h>
7*641fbf15SFlorian Hahn #include <stdlib.h>
8*641fbf15SFlorian Hahn #include <string.h>
9*641fbf15SFlorian Hahn 
10*641fbf15SFlorian Hahn void __attribute__((noinline)) add_flt(float *a) {
11*641fbf15SFlorian Hahn   *a += 2.0f;
12*641fbf15SFlorian Hahn   // CHECK: ERROR: TypeSanitizer: type-aliasing-violation
13*641fbf15SFlorian Hahn   // CHECK: READ of size 4 at {{.*}} with type float accesses an existing object of type int
14*641fbf15SFlorian Hahn   // CHECK: {{#0 0x.* in add_flt .*basic.c:}}[[@LINE-3]]
15*641fbf15SFlorian Hahn   // CHECK: ERROR: TypeSanitizer: type-aliasing-violation
16*641fbf15SFlorian Hahn   // CHECK: WRITE of size 4 at {{.*}} with type float accesses an existing object of type int
17*641fbf15SFlorian Hahn   // CHECK: {{#0 0x.* in add_flt .*basic.c:}}[[@LINE-6]]
18*641fbf15SFlorian Hahn   // CHECK: ERROR: TypeSanitizer: type-aliasing-violation
19*641fbf15SFlorian Hahn   // CHECK: READ of size 4 at {{.*}} with type float accesses an existing object of type long
20*641fbf15SFlorian Hahn   // CHECK: {{#0 0x.* in add_flt .*basic.c:}}[[@LINE-9]]
21*641fbf15SFlorian Hahn   // CHECK: ERROR: TypeSanitizer: type-aliasing-violation
22*641fbf15SFlorian Hahn   // CHECK: WRITE of size 4 at {{.*}} with type float accesses an existing object of type long
23*641fbf15SFlorian Hahn   // CHECK: {{#0 0x.* in add_flt .*basic.c:}}[[@LINE-12]]
24*641fbf15SFlorian Hahn   // CHECK: ERROR: TypeSanitizer: type-aliasing-violation
25*641fbf15SFlorian Hahn   // CHECK: READ of size 4 at {{.*}} with type float accesses part of an existing object of type long that starts at offset -4
26*641fbf15SFlorian Hahn   // CHECK: {{#0 0x.* in add_flt .*basic.c:}}[[@LINE-15]]
27*641fbf15SFlorian Hahn   // CHECK: ERROR: TypeSanitizer: type-aliasing-violation
28*641fbf15SFlorian Hahn   // CHECK: WRITE of size 4 at {{.*}} with type float accesses part of an existing object of type long that starts at offset -4
29*641fbf15SFlorian Hahn   // CHECK: {{#0 0x.* in add_flt .*basic.c:}}[[@LINE-18]]
30*641fbf15SFlorian Hahn   // CHECK: ERROR: TypeSanitizer: type-aliasing-violation
31*641fbf15SFlorian Hahn   // CHECK: READ of size 4 at {{.*}} with type float partially accesses an object of type short that starts at offset 2
32*641fbf15SFlorian Hahn   // CHECK: {{#0 0x.* in add_flt .*basic.c:}}[[@LINE-21]]
33*641fbf15SFlorian Hahn }
34*641fbf15SFlorian Hahn 
35*641fbf15SFlorian Hahn int main(int argc, char *argv[]) {
36*641fbf15SFlorian Hahn   int x = atoi(argv[1]);
37*641fbf15SFlorian Hahn   add_flt((float *)&x);
38*641fbf15SFlorian Hahn   printf("x = %d\n", x);
39*641fbf15SFlorian Hahn 
40*641fbf15SFlorian Hahn   long y = x;
41*641fbf15SFlorian Hahn   add_flt((float *)&y);
42*641fbf15SFlorian Hahn   printf("y = %ld\n", y);
43*641fbf15SFlorian Hahn 
44*641fbf15SFlorian Hahn   add_flt(((float *)&y) + 1);
45*641fbf15SFlorian Hahn   printf("y = %ld\n", y);
46*641fbf15SFlorian Hahn 
47*641fbf15SFlorian Hahn   char *mem = (char *)malloc(4 * sizeof(short));
48*641fbf15SFlorian Hahn   memset(mem, 0, 4 * sizeof(short));
49*641fbf15SFlorian Hahn   *(short *)(mem + 2) = x;
50*641fbf15SFlorian Hahn   add_flt((float *)mem);
51*641fbf15SFlorian Hahn   short s1 = *(short *)mem;
52*641fbf15SFlorian Hahn   // CHECK: ERROR: TypeSanitizer: type-aliasing-violation
53*641fbf15SFlorian Hahn   // CHECK: READ of size 2 at {{.*}} with type short accesses an existing object of type float
54*641fbf15SFlorian Hahn   // CHECK: {{#0 0x.* in main .*basic.c:}}[[@LINE-3]]
55*641fbf15SFlorian Hahn   short s2 = *(short *)(mem + 2);
56*641fbf15SFlorian Hahn   // CHECK: ERROR: TypeSanitizer: type-aliasing-violation
57*641fbf15SFlorian Hahn   // CHECK: READ of size 2 at {{.*}} with type short accesses part of an existing object of type float that starts at offset -2
58*641fbf15SFlorian Hahn   // CHECK: {{#0 0x.* in main .*basic.c:}}[[@LINE-3]]
59*641fbf15SFlorian Hahn   printf("m[0] = %d, m[1] = %d\n", s1, s2);
60*641fbf15SFlorian Hahn   free(mem);
61*641fbf15SFlorian Hahn 
62*641fbf15SFlorian Hahn   return 0;
63*641fbf15SFlorian Hahn }
64*641fbf15SFlorian Hahn 
65*641fbf15SFlorian Hahn // CHECK-NOT: ERROR: TypeSanitizer: type-aliasing-violation
66