xref: /llvm-project/compiler-rt/test/tysan/anon-struct.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 
6*641fbf15SFlorian Hahn typedef struct {
7*641fbf15SFlorian Hahn   int i1, i1b;
8*641fbf15SFlorian Hahn } s1;
9*641fbf15SFlorian Hahn typedef struct {
10*641fbf15SFlorian Hahn   int i2, i2b, i2c;
11*641fbf15SFlorian Hahn } s2;
12*641fbf15SFlorian Hahn 
13*641fbf15SFlorian Hahn void f(s1 *s1p, s2 *s2p) {
14*641fbf15SFlorian Hahn   s1p->i1 = 2;
15*641fbf15SFlorian Hahn   s2p->i2 = 3;
16*641fbf15SFlorian Hahn   // CHECK: ERROR: TypeSanitizer: type-aliasing-violation
17*641fbf15SFlorian Hahn   // CHECK: WRITE of size 4 at {{.*}} with type int (in <anonymous type> at offset 0) accesses an existing object of type int (in <anonymous type> at offset 0)
18*641fbf15SFlorian Hahn   // CHECK: {{#0 0x.* in f .*anon-struct.c:}}[[@LINE-3]]
19*641fbf15SFlorian Hahn   printf("%i\n", s1p->i1);
20*641fbf15SFlorian Hahn }
21*641fbf15SFlorian Hahn 
22*641fbf15SFlorian Hahn int main() {
23*641fbf15SFlorian Hahn   s1 s = {.i1 = 1, .i1b = 5};
24*641fbf15SFlorian Hahn   f(&s, (s2 *)&s);
25*641fbf15SFlorian Hahn }
26*641fbf15SFlorian Hahn 
27*641fbf15SFlorian Hahn // CHECK-NOT: ERROR: TypeSanitizer: type-aliasing-violation
28