Как в си завершить выполняющуюся программу?
exit
abort если завершение аварийное
halt в паскале
* int*) 0) = 0;
dereferencing NULL pointer, будет segmentation fault
Вышестоящий try/catch может с легкостью поймать сгенеренное данной конструкцией исключение.
И поэтому завершения программы не будет.
И поэтому завершения программы не будет.
Откуда инфа насчёт лёгкости?
Кроме того, вопрос про "си", в этом языке нет таких конструкций.
Ещё: вызов любой библиотечной функции тоже можно перехватить, да и что угодно можно перехватить, если на то пошло.
Кроме того, вопрос про "си", в этом языке нет таких конструкций.
Ещё: вызов любой библиотечной функции тоже можно перехватить, да и что угодно можно перехватить, если на то пошло.
но согласись, что-то писать в *NULL - не очень хорошо... 

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

> такое сообщение об ошибке будет дюже неинформативным
это потому что в винде нет сорсов от ядра и ksymoops'а
это потому что в винде нет сорсов от ядра и ksymoops'а
Если разговор именно о Cи, то да там такой конструкции нет.
> Ещё: вызов любой библиотечной функции тоже можно перехватить
Это уже будет хак, а у хака есть дурная привычка - хаки очень не любят изменения, работу в других условиях и т.д.
try/catch - это стандартная конструкция, которая должна работать на любой платформе.
> Откуда инфа насчёт лёгкости?
Пример:
куда уж проще...
> Ещё: вызов любой библиотечной функции тоже можно перехватить
Это уже будет хак, а у хака есть дурная привычка - хаки очень не любят изменения, работу в других условиях и т.д.
try/catch - это стандартная конструкция, которая должна работать на любой платформе.
> Откуда инфа насчёт лёгкости?
Пример:
try
{
* int*) 0) = 0;
}
catch (...)
{
}
куда уж проще...
Достаточно информативно - дамп регистров, stack trace, всё как положено.
Заметим, что на x86 это раскрывается в movl $0,0 - т.е. даже регистры не портит.
А для пущей информативности перед этим printk писали какой-нибудь.
Заметим, что на x86 это раскрывается в movl $0,0 - т.е. даже регистры не портит.
А для пущей информативности перед этим printk писали какой-нибудь.
а что, какой-нибудь int 3h не прокатит?
закрытость исходников дисциплинирует 

И какой код этот пример генерирует на твоей платформе?
На linux и gcc-3.2 такой же, как и без try/catch, что и следовало ожидать.
Ещё бы поганый C++ перехватывал SIGSEGV по своей инициативе.
На linux и gcc-3.2 такой же, как и без try/catch, что и следовало ожидать.
Ещё бы поганый C++ перехватывал SIGSEGV по своей инициативе.
попробуй так:
try
{
* int*) 0) = 0;
throw 1;//против оптимизатора
}
catch (...){}
Маза перестать пробовать и начать думать.
Например о том, какой код мог бы сгенерировать компилятор для перехвата SIGSEGV, и почему он так не делает.
Например о том, какой код мог бы сгенерировать компилятор для перехвата SIGSEGV, и почему он так не делает.
маза придумать что-нибудь кроме segmentation fault по записи в NULL
к примеру
kill(getpidSIGKILL);
//Fortl
к примеру
kill(getpidSIGKILL);
//Fortl
kill(getpidx) = raise(x)
те же яйца, но гораздо лучше выглядит
те же яйца, но гораздо лучше выглядит
я условно написал getpid - простов названии темы не видно, что хотим завершить текущий процесс...
ИМХО, это проблема реализации языка C++ для юних-а, т.к. увеличивается недерминированность поведение программы в случае ошибки.
имхо при SIGSEGV ни о какой недетерминированности говорить не приходится
ужас, синий ужас
что же делать?!?
что же делать?!?

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

exit вполне подошел

Уважаемые флудеры, с каких пор в СИ появился try/catch?
Я не считаю с и с++ одним языком.
Я не считаю с и с++ одним языком.
Уважаемые флудерыТы ошибся разделом.
Вот флудеры<flood>Да, они всех реально достали</flood>
Оставить комментарий
vertyal17
Мне казалось можно использовать halt; но оказалось нет такой функции.