1*673dc3d4SNico Weber // RUN: %clang_cl_asan -Od %s -Fe%t 2*673dc3d4SNico Weber // RUN: %run %t | FileCheck %s 3*673dc3d4SNico Weber 4*673dc3d4SNico Weber // This is a test for http://code.google.com/p/address-sanitizer/issues/detail?id=305 5*673dc3d4SNico Weber 6*673dc3d4SNico Weber #include <stdio.h> 7*673dc3d4SNico Weber 8*673dc3d4SNico Weber typedef void (*FPTR)(); 9*673dc3d4SNico Weber 10*673dc3d4SNico Weber // __xi_a and __xi_z are defined in VC/crt/src/crt0dat.c 11*673dc3d4SNico Weber // and are located in .CRT$XIA and .CRT$XIZ respectively. 12*673dc3d4SNico Weber extern "C" FPTR __xi_a, __xi_z; 13*673dc3d4SNico Weber main()14*673dc3d4SNico Weberint main() { 15*673dc3d4SNico Weber unsigned count = 0; 16*673dc3d4SNico Weber 17*673dc3d4SNico Weber // Iterate through CRT initializers. 18*673dc3d4SNico Weber for (FPTR* it = &__xi_a; it < &__xi_z; ++it) { 19*673dc3d4SNico Weber if (*it) 20*673dc3d4SNico Weber count++; 21*673dc3d4SNico Weber } 22*673dc3d4SNico Weber 23*673dc3d4SNico Weber printf("Number of nonzero CRT initializers: %u\n", count); 24*673dc3d4SNico Weber // CHECK: Number of nonzero CRT initializers 25*673dc3d4SNico Weber } 26*673dc3d4SNico Weber call_me_maybe()27*673dc3d4SNico Webervoid call_me_maybe() {} 28*673dc3d4SNico Weber 29*673dc3d4SNico Weber #pragma data_seg(".CRT$XIB") 30*673dc3d4SNico Weber // Add an initializer that shouldn't get its own redzone. 31*673dc3d4SNico Weber FPTR run_on_startup = call_me_maybe; 32