[llvm] r293920 - [libFuzzer] Properly handle exceptions with UnhandledExceptionFilter.

Marcos Pividori via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 2 11:07:54 PST 2017

Author: mpividori
Date: Thu Feb  2 13:07:53 2017
New Revision: 293920

URL: http://llvm.org/viewvc/llvm-project?rev=293920&view=rev
[libFuzzer] Properly handle exceptions with UnhandledExceptionFilter.

Use SetUnhandledExceptionFilter instead of AddVectoredExceptionHandler.

According to the documentation on Structured Exception Handling, this is the
order for the Exception Dispatching:
+ If the process is being debugged, the system notifies the debugger.
+ The Vectored Exception Handler is called.
+ The system attempts to locate a frame-based exception handler by searching the
 stack frames of the thread in which the exception occurred.
+ If no frame-based handler can be found, the UnhandledExceptionFilter filter is
+ Default handling based on the exception type.

So, similar to what we do for asan, we should use SetUnhandledExceptionFilter
instead of AddVectoredExceptionHandler, so user's code that is being fuzzed can
execute frame-based exception handlers before we catch them . We want to catch
unhandled exceptions, not all the exceptions.

Differential Revision: https://reviews.llvm.org/D29462


Modified: llvm/trunk/lib/Fuzzer/FuzzerUtilWindows.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Fuzzer/FuzzerUtilWindows.cpp?rev=293920&r1=293919&r2=293920&view=diff
--- llvm/trunk/lib/Fuzzer/FuzzerUtilWindows.cpp (original)
+++ llvm/trunk/lib/Fuzzer/FuzzerUtilWindows.cpp Thu Feb  2 13:07:53 2017
@@ -28,7 +28,7 @@ namespace fuzzer {
 static const FuzzingOptions* HandlerOpt = nullptr;
-LONG CALLBACK ExceptionHandler(PEXCEPTION_POINTERS ExceptionInfo) {
+static LONG CALLBACK ExceptionHandler(PEXCEPTION_POINTERS ExceptionInfo) {
   switch (ExceptionInfo->ExceptionRecord->ExceptionCode) {
@@ -126,10 +126,7 @@ void SetSignalHandler(const FuzzingOptio
   if (Options.HandleSegv || Options.HandleBus || Options.HandleIll ||
-    if (!AddVectoredExceptionHandler(1, ExceptionHandler)) {
-      Printf("libFuzzer: AddVectoredExceptionHandler failed.\n");
-      exit(1);
-    }
+    SetUnhandledExceptionFilter(ExceptionHandler);
   if (Options.HandleAbrt)
     if (SIG_ERR == signal(SIGABRT, CrashHandler)) {

More information about the llvm-commits mailing list