Как в си завершить выполняющуюся программу?

vertyal17

Мне казалось можно использовать halt; но оказалось нет такой функции.

ppplva

exit

VitMix

abort если завершение аварийное

Slavaga

halt в паскале

oleg_n

* int*) 0) = 0;

sergey_m

dereferencing NULL pointer, будет segmentation fault

Dasar

Вышестоящий try/catch может с легкостью поймать сгенеренное данной конструкцией исключение.
И поэтому завершения программы не будет.

Marinavo_0507

Откуда инфа насчёт лёгкости?
Кроме того, вопрос про "си", в этом языке нет таких конструкций.
Ещё: вызов любой библиотечной функции тоже можно перехватить, да и что угодно можно перехватить, если на то пошло.

freezer

но согласись, что-то писать в *NULL - не очень хорошо...

Marinavo_0507

В ядре Линукса одно время это было одним из предпочтительных способов вызвать аварийную остановку (kernel panic
потом добавили специальные макросы для этого.

freezer

в NT есть специальная функция для показа BSoD. Вообще, такое сообщение об ошибке будет дюже неинформативным

Chupa

> такое сообщение об ошибке будет дюже неинформативным
это потому что в винде нет сорсов от ядра и ksymoops'а

Dasar

Если разговор именно о Cи, то да там такой конструкции нет.
> Ещё: вызов любой библиотечной функции тоже можно перехватить
Это уже будет хак, а у хака есть дурная привычка - хаки очень не любят изменения, работу в других условиях и т.д.
try/catch - это стандартная конструкция, которая должна работать на любой платформе.
> Откуда инфа насчёт лёгкости?
Пример:


try
{
* int*) 0) = 0;
}
catch (...)
{
}


куда уж проще...

Marinavo_0507

Достаточно информативно - дамп регистров, stack trace, всё как положено.
Заметим, что на x86 это раскрывается в movl $0,0 - т.е. даже регистры не портит.
А для пущей информативности перед этим printk писали какой-нибудь.

freezer

а что, какой-нибудь int 3h не прокатит?

freezer

закрытость исходников дисциплинирует

Marinavo_0507

И какой код этот пример генерирует на твоей платформе?
На linux и gcc-3.2 такой же, как и без try/catch, что и следовало ожидать.
Ещё бы поганый C++ перехватывал SIGSEGV по своей инициативе.

Dasar

попробуй так:


try
{
* int*) 0) = 0;
throw 1;//против оптимизатора
}
catch (...){}

Marinavo_0507

Маза перестать пробовать и начать думать.
Например о том, какой код мог бы сгенерировать компилятор для перехвата SIGSEGV, и почему он так не делает.

stm2389930stm

маза придумать что-нибудь кроме segmentation fault по записи в NULL
к примеру
kill(getpidSIGKILL);
//Fortl

Chupa

kill(getpidx) = raise(x)
те же яйца, но гораздо лучше выглядит

stm2389930stm

я условно написал getpid - простов названии темы не видно, что хотим завершить текущий процесс...

Dasar

ИМХО, это проблема реализации языка C++ для юних-а, т.к. увеличивается недерминированность поведение программы в случае ошибки.

oleg_n

имхо при SIGSEGV ни о какой недетерминированности говорить не приходится

oleg_n

ужас, синий ужас
что же делать?!?

vertyal17

Вот флудеры
exit вполне подошел

teonazoi

Уважаемые флудеры, с каких пор в СИ появился try/catch?
Я не считаю с и с++ одним языком.

germafrodita

Уважаемые флудеры
Ты ошибся разделом.

VitMix

Вот флудеры
<flood>Да, они всех реально достали</flood>
Оставить комментарий
Имя или ник:
Комментарий: