<div dir="ltr">I'm fine with committing a Windows-specific test case, and don't see how it relates to my comment. If you're copying a test case and modifying some bits of it, RUN-line should be modified accordingly.<br>
<div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jul 11, 2014 at 12:44 PM, Timur Iskhodzhanov <span dir="ltr"><<a href="mailto:timurrrr@google.com" target="_blank">timurrrr@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><p dir="ltr">The problem is that we don't currently run the tests from test/asan/TestCases on Windows.  This is subject to fix soon; I just wanted to get this feature covered sooner.</p>

<div class="gmail_quote">11 июля 2014 г. 22:15 пользователь "Alexey Samsonov" <<a href="mailto:vonosmas@gmail.com" target="_blank">vonosmas@gmail.com</a>> написал:<div><div class="h5"><br type="attribution">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jul 11, 2014 at 4:57 AM, Timur Iskhodzhanov <span dir="ltr"><<a href="mailto:timurrrr@google.com" target="_blank">timurrrr@google.com</a>></span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: timurrrr<br>
Date: Fri Jul 11 06:57:41 2014<br>
New Revision: 212807<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=212807&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=212807&view=rev</a><br>
Log:<br>
[ASan/Win] Catch NULL derefs and page faults<br>
<br>
Reviewed at <a href="http://reviews.llvm.org/D4471" target="_blank">http://reviews.llvm.org/D4471</a><br>
<br>
Added:<br>
    compiler-rt/trunk/test/asan/TestCases/Windows/null_deref.cc<br>
Modified:<br>
    compiler-rt/trunk/lib/asan/asan_posix.cc<br>
    compiler-rt/trunk/lib/asan/asan_report.cc<br>
    compiler-rt/trunk/lib/asan/asan_report.h<br>
    compiler-rt/trunk/lib/asan/asan_win.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc<br>
<br>
Modified: compiler-rt/trunk/lib/asan/asan_posix.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_posix.cc?rev=212807&r1=212806&r2=212807&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_posix.cc?rev=212807&r1=212806&r2=212807&view=diff</a><br>



==============================================================================<br>
--- compiler-rt/trunk/lib/asan/asan_posix.cc (original)<br>
+++ compiler-rt/trunk/lib/asan/asan_posix.cc Fri Jul 11 06:57:41 2014<br>
@@ -50,7 +50,7 @@ void AsanOnSIGSEGV(int, void *siginfo, v<br>
       (code == si_SEGV_MAPERR || code == si_SEGV_ACCERR))<br>
     ReportStackOverflow(pc, sp, bp, context, addr);<br>
   else<br>
-    ReportSIGSEGV(pc, sp, bp, context, addr);<br>
+    ReportSIGSEGV("SEGV", pc, sp, bp, context, addr);<br>
 }<br>
<br>
 // ---------------------- TSD ---------------- {{{1<br>
<br>
Modified: compiler-rt/trunk/lib/asan/asan_report.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_report.cc?rev=212807&r1=212806&r2=212807&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_report.cc?rev=212807&r1=212806&r2=212807&view=diff</a><br>



==============================================================================<br>
--- compiler-rt/trunk/lib/asan/asan_report.cc (original)<br>
+++ compiler-rt/trunk/lib/asan/asan_report.cc Fri Jul 11 06:57:41 2014<br>
@@ -611,14 +611,15 @@ void ReportStackOverflow(uptr pc, uptr s<br>
   ReportErrorSummary("stack-overflow", &stack);<br>
 }<br>
<br>
-void ReportSIGSEGV(uptr pc, uptr sp, uptr bp, void *context, uptr addr) {<br>
+void ReportSIGSEGV(const char *description, uptr pc, uptr sp, uptr bp,<br>
+                   void *context, uptr addr) {<br>
   ScopedInErrorReport in_report;<br>
   Decorator d;<br>
   Printf("%s", d.Warning());<br>
   Report(<br>
-      "ERROR: AddressSanitizer: SEGV on unknown address %p"<br>
+      "ERROR: AddressSanitizer: %s on unknown address %p"<br>
       " (pc %p sp %p bp %p T%d)\n",<br>
-      (void *)addr, (void *)pc, (void *)sp, (void *)bp,<br>
+      description, (void *)addr, (void *)pc, (void *)sp, (void *)bp,<br>
       GetCurrentTidOrInvalid());<br>
   Printf("%s", d.EndWarning());<br>
   GET_STACK_TRACE_SIGNAL(pc, bp, context);<br>
<br>
Modified: compiler-rt/trunk/lib/asan/asan_report.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_report.h?rev=212807&r1=212806&r2=212807&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_report.h?rev=212807&r1=212806&r2=212807&view=diff</a><br>



==============================================================================<br>
--- compiler-rt/trunk/lib/asan/asan_report.h (original)<br>
+++ compiler-rt/trunk/lib/asan/asan_report.h Fri Jul 11 06:57:41 2014<br>
@@ -34,8 +34,8 @@ void DescribeThread(AsanThreadContext *c<br>
 // Different kinds of error reports.<br>
 void NORETURN<br>
     ReportStackOverflow(uptr pc, uptr sp, uptr bp, void *context, uptr addr);<br>
-void NORETURN<br>
-    ReportSIGSEGV(uptr pc, uptr sp, uptr bp, void *context, uptr addr);<br>
+void NORETURN ReportSIGSEGV(const char *description, uptr pc, uptr sp, uptr bp,<br>
+                            void *context, uptr addr);<br>
 void NORETURN ReportDoubleFree(uptr addr, StackTrace *free_stack);<br>
 void NORETURN ReportFreeNotMalloced(uptr addr, StackTrace *free_stack);<br>
 void NORETURN ReportAllocTypeMismatch(uptr addr, StackTrace *free_stack,<br>
<br>
Modified: compiler-rt/trunk/lib/asan/asan_win.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_win.cc?rev=212807&r1=212806&r2=212807&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_win.cc?rev=212807&r1=212806&r2=212807&view=diff</a><br>



==============================================================================<br>
--- compiler-rt/trunk/lib/asan/asan_win.cc (original)<br>
+++ compiler-rt/trunk/lib/asan/asan_win.cc Fri Jul 11 06:57:41 2014<br>
@@ -21,6 +21,7 @@<br>
<br>
 #include "asan_interceptors.h"<br>
 #include "asan_internal.h"<br>
+#include "asan_report.h"<br>
 #include "asan_thread.h"<br>
 #include "sanitizer_common/sanitizer_libc.h"<br>
 #include "sanitizer_common/sanitizer_mutex.h"<br>
@@ -86,6 +87,44 @@ void AsanOnSIGSEGV(int, void *siginfo, v<br>
   UNIMPLEMENTED();<br>
 }<br>
<br>
+static LPTOP_LEVEL_EXCEPTION_FILTER default_seh_handler;<br>
+<br>
+long WINAPI SEHHandler(EXCEPTION_POINTERS *info) {<br>
+  EXCEPTION_RECORD *exception_record = info->ExceptionRecord;<br>
+  CONTEXT *context = info->ContextRecord;<br>
+  uptr pc = (uptr)exception_record->ExceptionAddress;<br>
+#ifdef _WIN64<br>
+  uptr bp = (uptr)context->Rbp, sp = (uptr)context->Rsp;<br>
+#else<br>
+  uptr bp = (uptr)context->Ebp, sp = (uptr)context->Esp;<br>
+#endif<br>
+<br>
+  if (exception_record->ExceptionCode == EXCEPTION_ACCESS_VIOLATION ||<br>
+      exception_record->ExceptionCode == EXCEPTION_IN_PAGE_ERROR) {<br>
+    const char *description =<br>
+        (exception_record->ExceptionCode == EXCEPTION_ACCESS_VIOLATION)<br>
+            ? "access-violation"<br>
+            : "in-page-error";<br>
+    uptr access_addr = exception_record->ExceptionInformation[1];<br>
+    ReportSIGSEGV(description, pc, sp, bp, context, access_addr);<br>
+  }<br>
+<br>
+  // FIXME: Handle EXCEPTION_STACK_OVERFLOW here.<br>
+<br>
+  return default_seh_handler(info);<br>
+}<br>
+<br>
+int SetSEHFilter() {<br>
+  default_seh_handler = SetUnhandledExceptionFilter(SEHHandler);<br>
+  return 0;<br>
+}<br>
+<br>
+// Put a pointer to SetSEHFilter at the end of the global list<br>
+// of C initializers, after the default handler is set by the CRT.<br>
+// See crt0dat.c in the CRT sources for the details.<br>
+#pragma section(".CRT$XIZ", long, read)  // NOLINT<br>
+__declspec(allocate(".CRT$XIZ")) int (*__intercept_seh)() = SetSEHFilter;<br>
+<br>
 }  // namespace __asan<br>
<br>
 #endif  // _WIN32<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc?rev=212807&r1=212806&r2=212807&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc?rev=212807&r1=212806&r2=212807&view=diff</a><br>



==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc Fri Jul 11 06:57:41 2014<br>
@@ -17,9 +17,10 @@<br>
<br>
 #define WIN32_LEAN_AND_MEAN<br>
 #define NOGDI<br>
-#include <stdlib.h><br>
-#include <io.h><br>
 #include <windows.h><br>
+#include <dbghelp.h><br>
+#include <io.h><br>
+#include <stdlib.h><br>
<br>
 #include "sanitizer_common.h"<br>
 #include "sanitizer_libc.h"<br>
@@ -449,7 +450,30 @@ void StackTrace::SlowUnwindStack(uptr pc<br>
<br>
 void StackTrace::SlowUnwindStackWithContext(uptr pc, void *context,<br>
                                             uptr max_depth) {<br>
-  UNREACHABLE("no signal context on windows");<br>
+  CONTEXT ctx = *(CONTEXT *)context;<br>
+  STACKFRAME64 stack_frame;<br>
+  memset(&stack_frame, 0, sizeof(stack_frame));<br>
+  size = 0;<br>
+#if defined(_WIN64)<br>
+  int machine_type = IMAGE_FILE_MACHINE_AMD64;<br>
+  stack_frame.AddrPC.Offset = ctx.Rip;<br>
+  stack_frame.AddrFrame.Offset = ctx.Rbp;<br>
+  stack_frame.AddrStack.Offset = ctx.Rsp;<br>
+#else<br>
+  int machine_type = IMAGE_FILE_MACHINE_I386;<br>
+  stack_frame.AddrPC.Offset = ctx.Eip;<br>
+  stack_frame.AddrFrame.Offset = ctx.Ebp;<br>
+  stack_frame.AddrStack.Offset = ctx.Esp;<br>
+#endif<br>
+  stack_frame.AddrPC.Mode = AddrModeFlat;<br>
+  stack_frame.AddrFrame.Mode = AddrModeFlat;<br>
+  stack_frame.AddrStack.Mode = AddrModeFlat;<br>
+  while (StackWalk64(machine_type, GetCurrentProcess(), GetCurrentThread(),<br>
+                     &stack_frame, &ctx, NULL, &SymFunctionTableAccess64,<br>
+                     &SymGetModuleBase64, NULL) &&<br>
+         size < Min(max_depth, kStackTraceMax)) {<br>
+    trace[size++] = (uptr)stack_frame.AddrPC.Offset;<br>
+  }<br>
 }<br>
<br>
 void MaybeOpenReportFile() {<br>
<br>
Added: compiler-rt/trunk/test/asan/TestCases/Windows/null_deref.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/Windows/null_deref.cc?rev=212807&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/Windows/null_deref.cc?rev=212807&view=auto</a><br>



==============================================================================<br>
--- compiler-rt/trunk/test/asan/TestCases/Windows/null_deref.cc (added)<br>
+++ compiler-rt/trunk/test/asan/TestCases/Windows/null_deref.cc Fri Jul 11 06:57:41 2014<br>
@@ -0,0 +1,15 @@<br>
+// RUN: %clangxx_asan -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-%os --check-prefix=CHECK<br></blockquote><div><br></div><div>stray CHECK-%os?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">



+// FIXME: merge this with the common null_deref test when we can run common<br>
+// tests on Windows.<br>
+<br>
+__attribute__((noinline))<br>
+static void NullDeref(int *ptr) {<br>
+  // CHECK: ERROR: AddressSanitizer: access-violation on unknown address<br>
+  // CHECK:   {{0x0*000.. .*pc 0x.*}}<br>
+  ptr[10]++;  // BOOM<br>
+}<br>
+int main() {<br>
+  NullDeref((int*)0);<br>
+  // CHECK: {{    #1 0x.* in main.*null_deref.cc:}}[[@LINE-1]]<br>
+  // CHECK: {{AddressSanitizer can not provide additional info.}}<br></blockquote><div><br></div><div>I don't think you need {{}} here - it's not a regexp.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">



+}<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr">Alexey Samsonov<br><a href="mailto:vonosmas@gmail.com" target="_blank">vonosmas@gmail.com</a></div>
</div></div>
</blockquote></div></div></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr">Alexey Samsonov<br><a href="mailto:vonosmas@gmail.com" target="_blank">vonosmas@gmail.com</a></div>
</div></div>