mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 20:27:11 +01:00 
			
		
		
		
	Deregister SEH handler before reporting SE.
This commit is contained in:
		| @@ -53,6 +53,7 @@ namespace Catch { | ||||
|         static LONG CALLBACK handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) { | ||||
|             for (int i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i) { | ||||
|                 if (ExceptionInfo->ExceptionRecord->ExceptionCode == signalDefs[i].id) { | ||||
|                     reset(); | ||||
|                     reportFatal(signalDefs[i].name); | ||||
|                 } | ||||
|             } | ||||
| @@ -61,22 +62,25 @@ namespace Catch { | ||||
|             return EXCEPTION_CONTINUE_SEARCH; | ||||
|         } | ||||
|  | ||||
|         FatalConditionHandler() { | ||||
|             isSet = true; | ||||
|             // 32k seems enough for Catch to handle stack overflow, | ||||
|             // but the value was found experimentally, so there is no strong guarantee | ||||
|         FatalConditionHandler():m_isSet(true), m_guaranteeSize(32 * 1024), m_exceptionHandlerHandle(CATCH_NULL) { | ||||
|             guaranteeSize = 32 * 1024; | ||||
|             exceptionHandlerHandle = CATCH_NULL; | ||||
|             // Register as first handler in current chain | ||||
|             m_exceptionHandlerHandle = AddVectoredExceptionHandler(1, handleVectoredException); | ||||
|             exceptionHandlerHandle = AddVectoredExceptionHandler(1, handleVectoredException); | ||||
|             // Pass in guarantee size to be filled | ||||
|             SetThreadStackGuarantee(&m_guaranteeSize); | ||||
|             SetThreadStackGuarantee(&guaranteeSize); | ||||
|         } | ||||
|  | ||||
|         void reset() { | ||||
|             if (m_isSet) { | ||||
|         static void reset() { | ||||
|             if (isSet) { | ||||
|                 // Unregister handler and restore the old guarantee | ||||
|                 RemoveVectoredExceptionHandler(m_exceptionHandlerHandle); | ||||
|                 SetThreadStackGuarantee(&m_guaranteeSize); | ||||
|                 m_exceptionHandlerHandle = CATCH_NULL; | ||||
|                 m_isSet = false; | ||||
|                 RemoveVectoredExceptionHandler(exceptionHandlerHandle); | ||||
|                 SetThreadStackGuarantee(&guaranteeSize); | ||||
|                 exceptionHandlerHandle = CATCH_NULL; | ||||
|                 isSet = false; | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @@ -84,11 +88,15 @@ namespace Catch { | ||||
|             reset(); | ||||
|         } | ||||
|     private: | ||||
|         bool m_isSet; | ||||
|         ULONG m_guaranteeSize; | ||||
|         PVOID m_exceptionHandlerHandle; | ||||
|         static bool isSet; | ||||
|         static ULONG guaranteeSize; | ||||
|         static PVOID exceptionHandlerHandle; | ||||
|     }; | ||||
|  | ||||
|     bool FatalConditionHandler::isSet = false; | ||||
|     ULONG FatalConditionHandler::guaranteeSize = 0; | ||||
|     PVOID FatalConditionHandler::exceptionHandlerHandle = CATCH_NULL; | ||||
|  | ||||
| } // namespace Catch | ||||
|  | ||||
| #  endif // CATCH_CONFIG_WINDOWS_SEH | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Martin Hořeňovský
					Martin Hořeňovský