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 Weber int 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 Weber void 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