Protected app crashes when exception is thrown in catch-block

Добрый день.

Имеется код, в котором бросается исключение в catch-блоке, окружающем защищенный код. После защиты (только виртуализация) программа падает.

Вот простейший код, на котором проблема воспроизводится:

#include <stdio.h>
#include <exception>
#include "VMProtectSDK.h"

void test()
{
    try
    {

VMProtectBeginVirtualization( "" );
        throw std::exception();
VMProtectEnd();

    }
    catch( const std::exception& )
    {
        printf( "OK - catch( std::exception ) exception correctly!\n" );
        throw std::exception();
    }

}

int main()
{
    printf( "Test started\n" );

    try
    {
        test();
    }
    catch( const std::exception& )
    {
        printf( "OK - catch( std::exception ) exception correctly!\n" );
    }

    printf( "Test finished\n" );
    return 0;
}

Соответственно без защиты всё отрабатывает корректно.
Прикладываю тестовый sample (требуется vs2017) и собранные бинари (защищенный и исходный).

Версия компилятора:

Microsoft (R) C/C++ Optimizing Compiler Version 19.12.25835 for x64

Версия протектора:

VMProtect Professional v 3.2.0 (build 976) Copyright 2003-2018 VMProtect Software

fail-throw-in-catch-binaries.zip (890 KB)
fail-throw-in-catch.zip (1.38 KB)

Проверяйте (978 билд):
http://vmpsoft.com/files/VMProtectDemo.exe

Спасибо, приложенный код стал работать. Однако проблема всё ещё осталась.

Если между местом бросания и ловлей есть ещё один (возможно и более) catch-блоков, то код продолжает падать:

#include <stdio.h>
#include <exception>
#include "VMProtectSDK.h"

void test()
{
    try
    {

VMProtectBeginVirtualization( "" );
        throw std::exception();
VMProtectEnd();

    }
    catch( int )
    {
        printf( "OK - catch( int ) exception correctly!\n" );
        throw 1;
    }
    catch( const std::exception& )
    {
        printf( "OK - catch( std::exception ) exception correctly!\n" );
        throw std::exception();
    }

}

int main()
{
    printf( "Test started\n" );

    try
    {
        test();
    }
    catch( const std::exception& )
    {
        printf( "OK - catch( std::exception ) exception correctly!\n" );
    }

    printf( "Test finished\n" );
    return 0;
}

fail-throw-in-catch-binaries.zip (737 KB)
fail-throw-in-catch.zip (1.15 KB)

Спасибо, билд 981 правит эту ошибку.

Так получилось, что мы сначала проверили дебажную сборку, в ней ошибка ещё повторяется. На всякий случай приложу собранные бинари этого же кода.

При оптимизации /O2 всё работает корректно. В целом, нам этого достаточно. Ещё раз спасибо за оперативность.
fail-throw-in-catch-binaries.zip (896 KB)
fail-throw-in-catch.zip (1.4 KB)