1*43aa6e6bSVitaly Buka // Test that disabling/enabling tagging does not trigger false reports on 2*43aa6e6bSVitaly Buka // allocations happened in a different state. 3*43aa6e6bSVitaly Buka 4*43aa6e6bSVitaly Buka // RUN: %clang_hwasan -O1 %s -o %t && %run %t 2>&1 5*43aa6e6bSVitaly Buka 6*43aa6e6bSVitaly Buka #include <assert.h> 7*43aa6e6bSVitaly Buka #include <sanitizer/hwasan_interface.h> 8*43aa6e6bSVitaly Buka #include <stdlib.h> 9*43aa6e6bSVitaly Buka 10*43aa6e6bSVitaly Buka enum { 11*43aa6e6bSVitaly Buka COUNT = 5, 12*43aa6e6bSVitaly Buka SZ = 10, 13*43aa6e6bSVitaly Buka }; 14*43aa6e6bSVitaly Buka void *x[COUNT]; 15*43aa6e6bSVitaly Buka main()16*43aa6e6bSVitaly Bukaint main() { 17*43aa6e6bSVitaly Buka __hwasan_enable_allocator_tagging(); 18*43aa6e6bSVitaly Buka for (unsigned i = 0; i < COUNT; ++i) { 19*43aa6e6bSVitaly Buka x[i] = malloc(SZ); 20*43aa6e6bSVitaly Buka assert(__hwasan_test_shadow(x[i], SZ) == -1); 21*43aa6e6bSVitaly Buka } 22*43aa6e6bSVitaly Buka for (unsigned i = 0; i < COUNT; ++i) 23*43aa6e6bSVitaly Buka free(x[i]); 24*43aa6e6bSVitaly Buka 25*43aa6e6bSVitaly Buka __hwasan_disable_allocator_tagging(); 26*43aa6e6bSVitaly Buka for (unsigned i = 0; i < COUNT; ++i) { 27*43aa6e6bSVitaly Buka x[i] = malloc(SZ); 28*43aa6e6bSVitaly Buka assert(__hwasan_tag_pointer(x[i], 0) == x[i]); 29*43aa6e6bSVitaly Buka assert(__hwasan_test_shadow(x[i], SZ) == -1); 30*43aa6e6bSVitaly Buka } 31*43aa6e6bSVitaly Buka for (unsigned i = 0; i < COUNT; ++i) 32*43aa6e6bSVitaly Buka free(x[i]); 33*43aa6e6bSVitaly Buka 34*43aa6e6bSVitaly Buka __hwasan_enable_allocator_tagging(); 35*43aa6e6bSVitaly Buka for (unsigned i = 0; i < COUNT; ++i) { 36*43aa6e6bSVitaly Buka x[i] = malloc(SZ); 37*43aa6e6bSVitaly Buka assert(__hwasan_test_shadow(x[i], SZ) == -1); 38*43aa6e6bSVitaly Buka } 39*43aa6e6bSVitaly Buka for (unsigned i = 0; i < COUNT; ++i) 40*43aa6e6bSVitaly Buka free(x[i]); 41*43aa6e6bSVitaly Buka return 0; 42*43aa6e6bSVitaly Buka } 43