Комментарии 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: ошибка сегментирования в контейнерах Linux (код возврата 139)