xref: /llvm-project/compiler-rt/test/tysan/violation-pr62828.cpp (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 // https://github.com/llvm/llvm-project/issues/62828
5*641fbf15SFlorian Hahn #include <stdio.h>
6*641fbf15SFlorian Hahn 
7*641fbf15SFlorian Hahn typedef int int_v8[8];
8*641fbf15SFlorian Hahn typedef short short_v8[8];
9*641fbf15SFlorian Hahn short *test1(int_v8 *cast_c_array, short_v8 *shuf_c_array1, int *ptr) {
10*641fbf15SFlorian Hahn   int *input1 = reinterpret_cast<int *>(((int_v8 *)(cast_c_array)));
11*641fbf15SFlorian Hahn   short *input2 = reinterpret_cast<short *>(reinterpret_cast<int_v8 *>(input1));
12*641fbf15SFlorian Hahn 
13*641fbf15SFlorian Hahn   short *output1 = reinterpret_cast<short *>(((short_v8 *)(shuf_c_array1)));
14*641fbf15SFlorian Hahn   short *output2 =
15*641fbf15SFlorian Hahn       reinterpret_cast<short *>(reinterpret_cast<short_v8 *>(output1));
16*641fbf15SFlorian Hahn 
17*641fbf15SFlorian Hahn   for (int r = 0; r < 8; ++r) {
18*641fbf15SFlorian Hahn     int tmp = (int)((r * 4) + ptr[r]);
19*641fbf15SFlorian Hahn     if ((ptr[r] / 4) == 0) {
20*641fbf15SFlorian Hahn       int *input = reinterpret_cast<int *>(((int_v8 *)(cast_c_array)));
21*641fbf15SFlorian Hahn       input[r] = tmp;
22*641fbf15SFlorian Hahn     }
23*641fbf15SFlorian Hahn   }
24*641fbf15SFlorian Hahn 
25*641fbf15SFlorian Hahn   // CHECK:      ERROR: TypeSanitizer: type-aliasing-violation on address
26*641fbf15SFlorian Hahn   // CHECK-NEXT: READ of size 2 at {{.+}} with type short accesses an existing object of type int
27*641fbf15SFlorian Hahn   // CHECK-NEXT:    in test1(int (*) [8], short (*) [8], int*) {{.*/?}}violation-pr62828.cpp:29
28*641fbf15SFlorian Hahn   for (int i3 = 0; i3 < 4; ++i3) {
29*641fbf15SFlorian Hahn     output2[i3] = input2[(i3 * 2)];
30*641fbf15SFlorian Hahn   }
31*641fbf15SFlorian Hahn   return output2;
32*641fbf15SFlorian Hahn }
33*641fbf15SFlorian Hahn 
34*641fbf15SFlorian Hahn int main() {
35*641fbf15SFlorian Hahn   int_v8 in[4] = {{4, 4, 4, 4}};
36*641fbf15SFlorian Hahn   short_v8 out[4] = {{0}};
37*641fbf15SFlorian Hahn   int ptr[8] = {2};
38*641fbf15SFlorian Hahn   test1(in, out, ptr);
39*641fbf15SFlorian Hahn   short *p = reinterpret_cast<short *>(out);
40*641fbf15SFlorian Hahn   for (int i = 0; i < 32; i++) {
41*641fbf15SFlorian Hahn     printf("%d ", p[i]);
42*641fbf15SFlorian Hahn   }
43*641fbf15SFlorian Hahn   return 0;
44*641fbf15SFlorian Hahn }
45