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