Подтвердить что ты не робот

Поведение исключений С++, выполняющихся в c-программе

Предположим, что у меня есть общая библиотека, которая реализована на С++, но предоставляет интерфейс c. Эта библиотека затем используется в c-программе.

Предоставляет ли gcc какие-либо гарантии того, что происходит, если исключение выходит из библиотеки С++ в приложение c?
Будет ли это, например. всегда заканчивать программу?

В основном меня интересует ответ gcc на Linux на x64 и ARMv7-R, но ответы на другие операционные системы, компиляторы и архитектуры также приветствуются.

EDIT:
Просто для того, чтобы это было ясным: я не говорю о том, чтобы исключение проходило через c-функцию, а затем попадалось в вызывающую функцию С++ или взаимодействие с обратными вызовами c или С++. Сам код приложения является чистым c. В какой-то момент он будет вызывать функцию общей библиотеки (которая внутренне является чистым С++), и код приложения не будет вызываться до тех пор, пока эта функция не вернется. Также допустим, что я не могу контролировать, какие флаги используются для компиляции кода приложения.

4b9b3361

Ответ 1

Из того, что я вижу о исключениях С++, в этот пример, который я принял из MSDN, GCC, похоже, включает следующую сборку в выводе:

    call    __cxa_end_catch
    jmp     .L37
    movq    %rax, %rbx
    call    __cxa_end_catch
    movq    %rbx, %rax
    movq    %rax, %rdi
    call    _Unwind_Resume

Использует то, что я могу только предположить, - это вызов библиотеки С++ для функций, которые имеют дело с исключениями (например, _Unwind_resume). Поэтому, если код C ссылается на вашу библиотеку, он должен будет предоставить эти символы/функции, что означает, что код будет вводить библиотеку С++ для устранения исключений.

Однако я еще не знаю, что требует библиотека С++ для выполнения своей работы. Я ожидал бы, что это будет самодостаточным, но я не уверен в этом.

Изменить: ответ на этот вопрос, вероятно, заключается в ответах на следующие два существующих вопроса (и их интерпретация):

Изменить 2: Из этого ответа, кажется, что, поскольку __cxa_throw использует таблицу для отслеживания доступных обработчиков. Я бы предположил, что когда таблица исчерпана, что в нашем случае происходит, когда мы вводим код C, функция вызывала бы std::terminate. Следовательно, среда выполнения С++ (на которую вы должны были связать) должна позаботиться об этом для вас, если вам не нужно поставить предложение catch all.

Поскольку я все еще не уверен, я напишу тест этой теории и обновить ответ с результатами.

Ответ 2

Если исключение С++ выходит из внешнего блока try (который может быть только в самом внешнем вызове функции С++), то исключение не может быть обнаружено.

Неперехваченное исключение всегда приводит к завершению с помощью std::terminate, в соответствии со стандартом С++, §15.3/9.