Merge pull request #9436 from shuffle2/asan

msvc: enable asan compat
This commit is contained in:
Léo Lam 2021-01-27 13:24:26 +01:00 committed by GitHub
commit 305faa73ec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 36 additions and 15 deletions

View File

@ -9,6 +9,7 @@
#include <cstring> #include <cstring>
#include <vector> #include <vector>
#include "Common/Assert.h"
#include "Common/CommonFuncs.h" #include "Common/CommonFuncs.h"
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
#include "Common/MsgHandler.h" #include "Common/MsgHandler.h"
@ -28,30 +29,32 @@ namespace EMM
{ {
#ifdef _WIN32 #ifdef _WIN32
static PVOID s_veh_handle;
static LONG NTAPI Handler(PEXCEPTION_POINTERS pPtrs) static LONG NTAPI Handler(PEXCEPTION_POINTERS pPtrs)
{ {
switch (pPtrs->ExceptionRecord->ExceptionCode) switch (pPtrs->ExceptionRecord->ExceptionCode)
{ {
case EXCEPTION_ACCESS_VIOLATION: case EXCEPTION_ACCESS_VIOLATION:
{ {
int accessType = (int)pPtrs->ExceptionRecord->ExceptionInformation[0]; ULONG_PTR access_type = pPtrs->ExceptionRecord->ExceptionInformation[0];
if (accessType == 8) // Rule out DEP if (access_type == 8) // Rule out DEP
{ {
return (DWORD)EXCEPTION_CONTINUE_SEARCH; return EXCEPTION_CONTINUE_SEARCH;
} }
// virtual address of the inaccessible data // virtual address of the inaccessible data
uintptr_t badAddress = (uintptr_t)pPtrs->ExceptionRecord->ExceptionInformation[1]; uintptr_t fault_address = (uintptr_t)pPtrs->ExceptionRecord->ExceptionInformation[1];
CONTEXT* ctx = pPtrs->ContextRecord; SContext* ctx = pPtrs->ContextRecord;
if (JitInterface::HandleFault(badAddress, ctx)) if (JitInterface::HandleFault(fault_address, ctx))
{ {
return (DWORD)EXCEPTION_CONTINUE_EXECUTION; return EXCEPTION_CONTINUE_EXECUTION;
} }
else else
{ {
// Let's not prevent debugging. // Let's not prevent debugging.
return (DWORD)EXCEPTION_CONTINUE_SEARCH; return EXCEPTION_CONTINUE_SEARCH;
} }
} }
@ -84,18 +87,17 @@ static LONG NTAPI Handler(PEXCEPTION_POINTERS pPtrs)
void InstallExceptionHandler() void InstallExceptionHandler()
{ {
// Make sure this is only called once per process execution if (s_veh_handle)
// Instead, could make a Uninstall function, but whatever..
static bool handlerInstalled = false;
if (handlerInstalled)
return; return;
AddVectoredExceptionHandler(TRUE, Handler); s_veh_handle = AddVectoredExceptionHandler(TRUE, Handler);
handlerInstalled = true; ASSERT(s_veh_handle);
} }
void UninstallExceptionHandler() void UninstallExceptionHandler()
{ {
ULONG status = RemoveVectoredExceptionHandler(s_veh_handle);
ASSERT(status);
} }
#elif defined(__APPLE__) && !defined(USE_SIGACTION_ON_APPLE) #elif defined(__APPLE__) && !defined(USE_SIGACTION_ON_APPLE)

View File

@ -49,6 +49,17 @@ public:
m_post_unprotect_time; m_post_unprotect_time;
}; };
#ifdef _MSC_VER
#define ASAN_DISABLE __declspec(no_sanitize_address)
#else
#define ASAN_DISABLE
#endif
static void ASAN_DISABLE perform_invalid_access(void* data)
{
*(volatile int*)data = 5;
}
TEST(PageFault, PageFault) TEST(PageFault, PageFault)
{ {
EMM::InstallExceptionHandler(); EMM::InstallExceptionHandler();
@ -61,7 +72,7 @@ TEST(PageFault, PageFault)
pfjit.m_data = data; pfjit.m_data = data;
auto start = std::chrono::high_resolution_clock::now(); auto start = std::chrono::high_resolution_clock::now();
*(volatile int*)data = 5; perform_invalid_access(data);
auto end = std::chrono::high_resolution_clock::now(); auto end = std::chrono::high_resolution_clock::now();
#define AS_NS(diff) \ #define AS_NS(diff) \

View File

@ -133,6 +133,9 @@
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
</ClCompile> </ClCompile>
<ClCompile Condition="'$(Configuration)'=='Debug' And '$(EnableASAN)'=='true'">
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
</ClCompile>
<!--ClCompile Release--> <!--ClCompile Release-->
<ClCompile Condition="'$(Configuration)'=='Release'"> <ClCompile Condition="'$(Configuration)'=='Release'">
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion> <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>

View File

@ -4,6 +4,11 @@
<PlatformToolset>v142</PlatformToolset> <PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<PreferredToolArchitecture>x64</PreferredToolArchitecture> <PreferredToolArchitecture>x64</PreferredToolArchitecture>
<!-- To use ASAN, just uncomment this. For simplicity, you should run VS/windbg/etc
(including the built executables themselves) after using vcvarsall or similar to setup
environment, as ASAN needs access to libs and executables in the toolchain paths.
-->
<!--<EnableASAN>true</EnableASAN>-->
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>