Какой лучший способ поймать переполнение стека в C?
Более конкретно:
Программа C содержит интерпретатор для языка сценариев.
Скрипты не доверяют и могут содержать бесконечные ошибки рекурсии. Интерпретатор должен уметь их поймать и плавно продолжать. (Очевидно, это частично можно решить с помощью программного стека, но производительность значительно улучшится, если существенные фрагменты кода библиотеки могут быть записаны на C, как минимум, это влечет за собой функции C, работающие над рекурсивными структурами данных, создаваемыми скриптами.)
Предпочтительная форма захвата будет включать longjmp обратно в основной цикл. (Это совершенно нормально, чтобы отбросить все данные, которые были сохранены в кадрах стека ниже основного цикла.)
Отказоустойчивое портативное решение - использовать адреса локальных переменных для контроля текущей глубины стека и для каждой рекурсивной функции содержать вызов функции проверки стека, которая использует этот метод. Конечно, в нормальном случае это накладывает определенные накладные расходы во время выполнения; это также означает, что если я забуду поставить вызов проверки стека в одном месте, интерпретатор будет иметь скрытую ошибку.
Есть ли лучший способ сделать это? В частности, я не ожидаю лучшего портативного решения, но если бы у меня было системное решение для Linux, а другое для Windows, это было бы нормально.
Я видел ссылки на что-то, называемое структурированной обработкой исключений в Windows, хотя ссылки, которые я видел, касались перевода этого в механизм обработки исключений С++; можно ли получить доступ из C, и если это так полезно для этого сценария?
Я понимаю, что Linux позволяет поймать сигнал сбоя сегментации; можно ли надежно превратить это в longjmp обратно в ваш основной цикл?
Java, похоже, поддерживает перехват на всех платформах; как это реализовать?