возможно ли выполнить код C при раскручивании стека C ++ / исключение - PullRequest
0 голосов
/ 18 июня 2020

Мне нужно написать библиотеку C, которая будет интегрирована в базу кода C ++. Эта библиотека может вызывать код C ++, переданный в качестве обратного вызова. Эти функции могут вызывать исключения C ++.

Я хотел бы убедиться, что код очистки запускается во время процесса раскрутки стека. Я мог бы использовать атрибут cleanup, чтобы убедиться, что:

Если -fexceptions включен, функция cleanup_function запускается во время раскрутки стека, которое происходит во время обработки исключения.

Из G CC docs .

К сожалению, я не могу использовать атрибут очистки. Я хотел бы зарегистрировать функцию очистки, которая будет запускаться во время разматывания стека программно, используя переносимый C.

Возможно ли это?

1 Ответ

1 голос
/ 18 июня 2020

Я хотел бы зарегистрировать функцию очистки, которая будет запускаться во время раскрутки стека программно, используя переносимый C.

Невозможно в переносном C.

Стандарт C11 n1570 даже не требует стек вызовов и разрешить оптимизацию компилятора не использовать его. В некоторых случаях "раскрутки стека" нет. Подумайте об оптимизации хвостового вызова (попробуйте gcc -Wall -O3 -S -fverbose-asm с недавним G CC) и прочтите этот черновик отчет, объясняющий некоторые gcc оптимизаций (в работе июнь 2020 г.). Если вы думаете о C ++, прочтите n3337 , его стандарт C ++ 11.

Однако, если вы решите использовать (конкретно) достаточно недавний G CC (так что G CC 10 в июне 2020 г.) вы можете рассмотреть возможность использования встроенных команд c или прагм. В G CC есть глава о C расширениях языка и еще одна о расширениях C ++ , а также о вызове it.

Возможно, вам даже будет интересно написать свой G CC плагин , или использовать его libgccjit , или повторно использовать его libbacktrace от Яна Тейлора.

На Linux, см. Также dlopen (3) и dlsym (3) и рассмотрите возможность использования Clang .

Вы можете спросить некоторая помощь, например, AdaCore или в списке рассылки gcc-help@gcc.gnu.org publi c.

...