Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 27 additions & 6 deletions ACE/tests/Compiler_Features_41_Test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,34 +22,46 @@ run_main (int, ACE_TCHAR *[])

#if defined (ACE_HAS_WIN32_STRUCTURED_EXCEPTIONS)
bool finally_executed = false;
bool except_executed = false;

ACE_DEBUG ((LM_DEBUG,("Testing __try/__finally\n")));
ACE_DEBUG ((LM_DEBUG,("Testing __try/__except/__finally\n")));

ACE_SEH_TRY
{
ACE_DEBUG ((LM_DEBUG, ("In outer SEH_TRY\n")));

ACE_SEH_TRY
{
ACE_DEBUG ((LM_DEBUG,("In SEH_TRY\n")));
ACE_DEBUG ((LM_DEBUG, ("In inner SEH_TRY\n")));

// Intentionally cause an access violation exception, use a helper function
// as non-call SEH isn't supported with clang based windows compilers
test();
test ();

// If we get here without an exception, SEH isn't working
ACE_ERROR ((LM_ERROR, "No exception was raised from null pointer dereference\n"));
result = -1;
}
ACE_SEH_FINALLY
ACE_SEH_FINALLY
{
ACE_DEBUG ((LM_DEBUG,("In SEH_FINALLY\n")));
ACE_DEBUG ((LM_DEBUG, ("In inner SEH_FINALLY\n")));
finally_executed = true;
// If we're here due to an exception, that's the expected behavior - test passes
}
}
ACE_SEH_EXCEPT (GetExceptionCode () == EXCEPTION_ACCESS_VIOLATION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{
ACE_DEBUG ((LM_DEBUG, ("In outer SEH_EXCEPT\n")));
except_executed = true;
}

ACE_DEBUG ((LM_DEBUG,("After SEH_FINALLY\n")));

// On successful SEH handling:
// 1. The null pointer dereference should raise an exception
// 2. The FINALLY block should execute
// 3. Execution should continue after the SEH blocks
// 3. The EXCEPT block should be executed
// 4. Execution should continue after the SEH blocks
if (finally_executed)
{
ACE_DEBUG ((LM_DEBUG, "SEH test passed - FINALLY block was executed\n"));
Expand All @@ -59,6 +71,15 @@ run_main (int, ACE_TCHAR *[])
ACE_ERROR ((LM_ERROR, "SEH test failed - FINALLY block was not executed\n"));
result = -1;
}
if (except_executed)
{
ACE_DEBUG ((LM_DEBUG, "SEH test passed - EXCEPT block was executed\n"));
}
else
{
ACE_ERROR ((LM_ERROR, "SEH test failed - EXCEPT block was not executed\n"));
result = -1;
}
#else
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("Platform lacks ACE_HAS_WIN32_STRUCTURED_EXCEPTIONS\n")));
Expand Down
Loading