Summary: There is no guarantee that the tls_init is executed on the static runtime (/MT). On windows 7, this unittest is failing. On windows 10, I believe it's working because of the new CRT. On ASAN side, it doesn't matter that the hook point is run or not. It must be run only if there is other tls_initializer that are registered. Reviewers: rnk, chrisha Reviewed By: rnk Subscribers: kubamracek, llvm-commits Differential Revision: https://reviews.llvm.org/D29838 llvm-svn: 295057
52 lines
1.3 KiB
C++
52 lines
1.3 KiB
C++
// RUN: %clang_cl_asan %s -Fe%t.exe /MD
|
|
// RUN: %run %t.exe | FileCheck %s
|
|
|
|
// CHECK: my_thread_callback
|
|
// CHECK: ran_before_main: 1
|
|
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#pragma comment (lib, "dbghelp")
|
|
|
|
static bool ran_before_main = false;
|
|
|
|
extern "C" void __asan_init(void);
|
|
|
|
static void NTAPI /*__attribute__((no_sanitize_address))*/
|
|
my_thread_callback(PVOID module, DWORD reason, PVOID reserved) {
|
|
ran_before_main = true;
|
|
static const char str[] = "my_thread_callback\n";
|
|
|
|
// Fail the test if we aren't called for the expected reason or we can't write
|
|
// stdout.
|
|
if (reason != DLL_PROCESS_ATTACH)
|
|
return;
|
|
HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
|
|
if (!out || out == INVALID_HANDLE_VALUE)
|
|
return;
|
|
|
|
DWORD written = 0;
|
|
WriteFile(out, &str[0], sizeof(str), &written, NULL);
|
|
}
|
|
|
|
extern "C" {
|
|
#pragma const_seg(".CRT$XLC")
|
|
extern const PIMAGE_TLS_CALLBACK p_thread_callback;
|
|
const PIMAGE_TLS_CALLBACK p_thread_callback = my_thread_callback;
|
|
#pragma const_seg()
|
|
}
|
|
|
|
#ifdef _WIN64
|
|
#pragma comment(linker, "/INCLUDE:_tls_used")
|
|
#pragma comment(linker, "/INCLUDE:p_thread_callback")
|
|
#else
|
|
#pragma comment(linker, "/INCLUDE:__tls_used")
|
|
#pragma comment(linker, "/INCLUDE:_p_thread_callback")
|
|
#endif
|
|
|
|
int main() {
|
|
printf("ran_before_main: %d\n", ran_before_main);
|
|
}
|