In this diff I update the code for asan on Windows, so we can intercept SetUnhandledExceptionFilter and catch some exceptions depending on the result of IsHandledDeadlyException() (which depends on asan flags). This way we have the same behavior on Windows and Posix systems. On Posix, we intercept signal and sigaction, so user's code can only register signal handlers for signals that are not handled by asan. After this diff, the same happens on Windows, user's code can only register exception handlers for exceptions that are not handled by asan. Differential Revision: https://reviews.llvm.org/D29463 llvm-svn: 293957
76 lines
2.5 KiB
C++
76 lines
2.5 KiB
C++
// This is a host program for DLL tests.
|
|
//
|
|
// Just make sure we can compile this.
|
|
// The actual compile&run sequence is to be done by the DLL tests.
|
|
// RUN: %clang_cl_asan -O0 %s -Fe%t
|
|
//
|
|
// Get the list of ASan wrappers exported by the main module RTL:
|
|
// note: The mangling decoration (i.e. @4 )is removed because calling convention
|
|
// differ from 32-bit and 64-bit.
|
|
// RUN: dumpbin /EXPORTS %t | grep -o "__asan_wrap[^ ]*" | sed -e s/@.*// > %t.exports1
|
|
//
|
|
// The exception handlers differ in 32-bit and 64-bit, so we ignore them:
|
|
// RUN: grep '[E]XPORT:' %s | sed -e 's/.*[E]XPORT: //' > %t.exports2
|
|
// EXPORT: __asan_wrap__except_handler3
|
|
// EXPORT: __asan_wrap__except_handler4
|
|
// EXPORT: __asan_wrap___C_specific_handler
|
|
//
|
|
// Get the list of ASan wrappers imported by the DLL RTL:
|
|
// [BEWARE: be really careful with the sed commands, as this test can be run
|
|
// from different environemnts with different shells and seds]
|
|
// RUN: grep INTERCEPT_LIBRARY_FUNCTION %p/../../../../lib/asan/asan_win_dll_thunk.cc \
|
|
// RUN: | grep -v define | sed -e s/.*(/__asan_wrap_/ -e s/).*// \
|
|
// RUN: > %t.imports1
|
|
//
|
|
// Add functions interecepted in asan_malloc.win.cc and asan_win.cc.
|
|
// RUN: grep '[I]MPORT:' %s | sed -e 's/.*[I]MPORT: //' > %t.imports2
|
|
// IMPORT: __asan_wrap_HeapAlloc
|
|
// IMPORT: __asan_wrap_HeapFree
|
|
// IMPORT: __asan_wrap_HeapReAlloc
|
|
// IMPORT: __asan_wrap_HeapSize
|
|
// IMPORT: __asan_wrap_CreateThread
|
|
// IMPORT: __asan_wrap_RaiseException
|
|
// IMPORT: __asan_wrap_RtlRaiseException
|
|
// IMPORT: __asan_wrap_SetUnhandledExceptionFilter
|
|
//
|
|
// RUN: cat %t.imports1 %t.imports2 | sort | uniq > %t.imports-sorted
|
|
// RUN: cat %t.exports1 %t.exports2 | sort | uniq > %t.exports-sorted
|
|
//
|
|
// Now make sure the DLL thunk imports everything:
|
|
// RUN: echo
|
|
// RUN: echo "=== NOTE === If you see a mismatch below, please update asan_win_dll_thunk.cc"
|
|
// RUN: diff %t.imports-sorted %t.exports-sorted
|
|
// REQUIRES: asan-static-runtime
|
|
|
|
#include <stdio.h>
|
|
#include <windows.h>
|
|
|
|
int main(int argc, char **argv) {
|
|
if (argc != 2) {
|
|
printf("Usage: %s [client].dll\n", argv[0]);
|
|
return 101;
|
|
}
|
|
|
|
const char *dll_name = argv[1];
|
|
|
|
HMODULE h = LoadLibrary(dll_name);
|
|
if (!h) {
|
|
printf("Could not load DLL: %s (code: %lu)!\n",
|
|
dll_name, GetLastError());
|
|
return 102;
|
|
}
|
|
|
|
typedef int (*test_function)();
|
|
test_function gf = (test_function)GetProcAddress(h, "test_function");
|
|
if (!gf) {
|
|
printf("Could not locate test_function in the DLL!\n");
|
|
FreeLibrary(h);
|
|
return 103;
|
|
}
|
|
|
|
int ret = gf();
|
|
|
|
FreeLibrary(h);
|
|
return ret;
|
|
}
|