Как стать автором
Поиск
Написать публикацию
Обновить

Устраняем ошибки, связанные с SIGSEGV: ошибка сегментирования в контейнерах Linux (код возврата 139)

Уровень сложностиСложный
Время на прочтение7 мин
Количество просмотров19K
Всего голосов 19: ↑13 и ↓6+12
Комментарии9

Комментарии 9

Если выделить буфер buffer размером 1 байт

int main() {
  char *buffer[1];
  buffer[0] = 0;
  return 0;
}

Зануда говорит, что тут выделяется не 1 байт. Вам повезло ;)

Так и записывают в указатель, а не символ ?

Вот тривиальный пример программы на C, в которой фигурирует ошибка сегментирования:

Ой да автор... Это тривиальный пример программы с undefined behavior, а не с гарантированным segmentation fault. Дальше ещё не читал, надеюсь примеры подобного качества на Си закончатся.

хмм ... вы хотите сказать, что одно не является подмножеством другого ?

Поддержу автора предыдущего коммента. UB не обязательно станет сегфолтом. Может"повезти", и в указателе окажется память, к которой есть доступ.

(me: думает - при каких ключах компилятора и линкера в том указателе будет память с доступом на запись)

хм, а ведь действительно - там может быть адрес указателя (например) в сегмент стека.

Или же может "повезти" в другую сторону, и функция main станет состоять из одной инструкции ud2 или вообще останется без инструкций.


В первом случае всё закончится сигналом, но не SIGSEGV, а SIGILL.
Во втором случае будет выполнен случайный код, волею судьбы оказавшийся после main.

Жаль, что я так и не понял, как побороть SIGSEGV в чужой программе. И чем отличается SIGSEGV в контейнере и в просто запущенной программе тоже не понял. Ну да, перевод же, уточнений не будет.

чем отличается SIGSEGV в контейнере и в просто запущенной программе

Спойлер: ничем

Зарегистрируйтесь на Хабре, чтобы оставить комментарий