Re[9]: А чего молчим про Crowdstrike
От: vdimas Россия  
Дата: 25.07.24 09:43
Оценка:
Здравствуйте, Константин Б., Вы писали:

V>>Установка точек возврата для исключений работает аналогичным образом, как setjmp/longjmp.

КБ>А передавать управление на эту точку возврата кто будет? longjmp сам вызовется?

Вызывается изнутри _Unwind_RaiseException — сначала производится cleanup текущих стековых переменных, затем поиск обработчика через type_info, затем происходит аналог longjmp на установленную точку входа обработчика.


КБ>В случае SEH операционная система нужный обработчик вызовет (который мало что сделать сможет, но это другой вопрос).


В случае структурных исключений ядро просто трансформирует аппаратные прерывания в софтовые с известной на уровне ABI операционки структурой данных, описывающих исключение.
Т.е., сводит сигналы различной природы к одному АПИ.


КБ>А longjmp руками вызвать надо.


longjmp — это невыразимый обычными ср-вами языка трюк "отмотки" стека с одновременной передачей управления некоей выставленной заранее точке в коде, где указатель стека как раз восстанавливается до значения в этой точке.

Пробрасывания и перехваты исключений построены ровно по такому же принципу, разве что вместо аргумента int user_data оперируют указателями на void*, под которым скрываются более сложные структуры, описывающие семантику происходящего. При доступе к АПИ компилятора на Си нефик делать всё это раскрутить вручную, как это происходит автоматом на плюсах.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.