Как опция -fstack-protector в gcc предотвращает разрушение стека?
Я столкнулся с проблемой разбивания стека, и мне трудно найти причину. Ошибка разрушения стека возникает только изредка и только в самом конце выполнения программы. Это также перестает происходить полностью, когда я компилирую его с помощью опции 'fstack-protector' с gcc. Мне интересно, является ли использование опции 'fstack-protector' реальным решением или я просто скрываю проблему? Я бы опубликовал код, но он длиной 3000 строк, и я не уверен, какая часть кода отвечает.
1 ответ
Эта опция не предотвращает разрушение стека, а скорее обнаруживает его и останавливает программу.
Со страницы руководства gcc:
-fstack-протектор
Выдать дополнительный код для проверки переполнения буфера, например, атак с разбиванием стека. Это делается путем добавления переменной защиты к функциям с уязвимыми объектами. Это включает в себя функции, которые вызывают "alloca", и функции с буферами размером более 8 байт. Защитные устройства инициализируются при входе в функцию, а затем проверяются при выходе из функции. Если контрольная проверка не пройдена, выдается сообщение об ошибке и программа завершается.
У вас все еще есть проблема переполнения, но добавление переменных защиты, очевидно, маскирует проблему. Если вы запускаете вашу программу под Valgrind, она должна быть в состоянии обнаружить, что происходит.