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