Я пытаюсь создать программу на Python, которая взаимодействует с другим аварийным процессом (это не в моих руках). К сожалению, программа, с которой я взаимодействую, даже не дает сбоя! Поэтому я хочу сделать быструю программу на C ++, которая намеренно зависает, но я на самом деле не знаю лучшего и кратчайшего способа сделать это, кто-нибудь знает, что нужно поместить между моими:
int main() {
crashyCodeGoesHere();
}
чтобы моя C ++ программа аварийно завершилась
asm { cli; };
*((char*)-1) = 'x';
код, чтобы вызвать сбой, чтобы отладить, подробнее в моем ответе здесьОтветы:
abort()
Функция, вероятно , ваш лучший выбор. Он является частью стандартной библиотеки C и определяется как «вызывающий ненормальное завершение программы» (например, фатальная ошибка или сбой).источник
abort()
не вызывает никаких деструкторов илиatexit
функций, хотя это, скорее всего, здесь не имеет значения.atexit
s, это не было бы крахом, не так ли?abort()
как правильный ответ, то должен ли 'exit (-1); `быть приемлемым?Пытаться:
Нашел в:
источник
signal()
. Однако большинство нормальных приложений этого не делают.raise()
. Это позволяет вам проверять множество различных типов исключений, просто изменяя аргумент.Деление на ноль приведет к сбою приложения:
источник
main
будет полностью удалено, включаяret
инструкцию. Выполнение может просто попасть в следующую функцию.источник
Ну, у нас переполнение стека или нет?
(Не гарантируется сбой по каким-либо стандартам, но ни один из предложенных ответов, в том числе и принятый, не
SIGABRT
может быть получен, поскольку его все равно можно было бы перехватить. На практике это произойдет везде.)источник
(&i)[i] += !i
, но боялся, что компилятор может быть достаточно умным, и хочу оптимизировать это. :-)Просто ответ ... :)
источник
assert(false);
тоже довольно хорошоВ соответствии с ISO / IEC 9899: 1999 гарантированно происходит сбой, когда NDEBUG не определен:
источник
assert
сделан эквивалентным((void)0)
в режиме Release.Поскольку сбой является признаком вызова неопределенного поведения, и поскольку вызов неопределенного поведения может привести к чему угодно, включая сбой, я не думаю, что вы действительно хотите вывести свою программу из строя, но просто поместите ее в отладчик. Вероятно, самый переносимый способ сделать это
abort()
.Хотя
raise(SIGABRT)
имеет тот же эффект, это, безусловно, больше писать. Однако оба способа могут быть перехвачены путем установки обработчика сигнала дляSIGABRT
. Поэтому, в зависимости от вашей ситуации, вы можете / должны поднять другой сигнал.SIGFPE
,SIGILL
,SIGINT
,SIGTERM
ИлиSIGSEGV
может быть путь, но все они могут быть перехвачены.Когда вы можете быть непереносимыми, ваш выбор может быть еще шире, как при использовании
SIGBUS
в Linux.источник
Единственная вспышка, которая у меня была, это функция abort () :
Он прерывает процесс с ненормальным завершением программы. Он генерирует сигнал SIGABRT , который по умолчанию заставляет программу завершить работу, возвращая неуспешный код ошибки завершения в среду хоста. Программа завершается без выполнения деструкторов для объектов автоматической или статической длительности хранения. и без вызова какой-либо функции atexit (которая вызывается методом exit () до завершения программы). Он никогда не возвращается к своему абоненту.
источник
Ответ зависит от платформы и зависит от ваших целей. Но вот функция сбоя Mozilla Javascript, которая, я думаю, иллюстрирует множество проблем, которые могут возникнуть при выполнении этой работы:
источник
Я вижу, что здесь опубликовано много ответов, которые выпадут в удачных случаях, чтобы выполнить работу, но ни один из них не является на 100% детерминированным к краху. Некоторые будут зависать на одном оборудовании и ОС, другие - нет. Тем не менее, существует официальный способ, согласно официальному стандарту C ++, заставить его аварийно завершить работу.
Цитирование из стандарта C ++ ISO / IEC 14882 §15.1-7 :
Я написал небольшой код, чтобы продемонстрировать это, и его можно найти и попробовать на Ideone здесь .
ИСО / МЭК 14882 §15.1 / 9 упоминает throw без блока try, что приводит к неявному вызову abort:
Другие включают: бросок от деструктора: ISO / IEC 14882 §15.2 / 3
источник
Это приведет к ошибке сегментации.
источник
Этот отсутствует:
источник
Как насчет переполнения стека при вызове рекурсивного метода мертвого цикла?
См. Оригинальный пример на Microsoft KB
источник
Это происходит сбой в моей системе Linux, потому что строковые литералы хранятся в постоянной памяти:
Кстати, g ++ отказывается компилировать это. Компиляторы становятся умнее и умнее :)
источник
Ваш компилятор, вероятно, предупредит вас об этом, но он прекрасно компилируется в GCC 4.4.3. Это, вероятно, вызовет SIGFPE (исключение с плавающей запятой), что, вероятно, не так вероятно в реальном приложении, как SIGSEGV (нарушение сегментации памяти), как другие ответы вызывают, но это все еще крах. На мой взгляд, это гораздо более читабельно.
Другой способ, если мы собираемся обмануть и использовать
signal.h
, это:Это гарантированно уничтожит подпроцесс, в отличие от SIGSEGV.
источник
Это более гарантированная версия прерывания, представленная в приведенных выше ответах. Она заботится о ситуации, когда sigabrt заблокирован. Вы можете использовать любой сигнал вместо прерывания, который имеет действие по умолчанию сбоя программы.
источник
Это тоже должно вылететь. В Windows происходит сбой с AccessViolation, и он должен делать то же самое на всех ОС, я думаю.
источник
on all OS-es
Нет, он не откажет в не защищенной ОС (например , MS-DOS.) На самом деле, иногда это что - то в адрес 0! Для x86 режиме реального времени, вектор прерывания Таблица в адрес 0.main()
.Это фрагмент, предоставленный Google в Breakpad.
источник
источник
Хотя на этот вопрос уже есть принятый ответ ...
Или...
void main(){throw 1;}
источник
Запись в постоянную память вызовет ошибку сегментации, если ваша система не поддерживает блоки памяти только для чтения.
Я проверил это с MingGW 5.3.0 на Windows 7 и GCC на Linux Mint. Я предполагаю, что другие компиляторы и системы дадут аналогичный эффект.
источник
Или другой путь, так как мы в группе.
Прекрасный кусок бесконечной рекурсии. Гарантированно взорвать ваш стек.
Распечатывает:
источник
main
себя - это на самом деле неопределенное поведение, если вы не знали :) Кроме того, хвостовая рекурсия не гарантированно разрушит ваш стек. Если вам нужна «гарантия», вы должны что- то сделать после рекурсивного вызова, иначе компилятор может оптимизировать рекурсию в бесконечный цикл.Тот, который еще не был упомянут:
Это будет рассматривать нулевой указатель как указатель на функцию, а затем вызывать его. Как и большинство методов, это не гарантирует сбой программы, но шансы ОС, позволяющей это сделать, не проверяются, и программы, которая когда-либо возвращается, ничтожно малы.
источник
Надеюсь, это потерпит крах. Приветствия.
источник
источник
long long
илиsize_t
и начать сp
соответствующего максимального значения, или близко к нему, чтобы сбой быстрее. Хотя даже в этом случае сбой не гарантирован.Стильный способ сделать это - вызов чисто виртуальной функции:
Скомпилированный с GCC, это печатает:
источник
Вы можете использовать ассемблер в своем c ++,
code
НОINT 3
только для систем x86, в других системах могут быть другие инструкции прерывания / прерывания.INT 3
вызывает прерывание и вызывает вектор прерывания, установленный ОС.источник
Используйте __builtin_trap () в GCC или clang, или __debugbreak () в MSVC. Несоблюдение этих контрольных точек / ловушек приведет к необработанному исключению / аварийному завершению. Другие предложения, которые используют abort () или exit (): они могут обрабатываться другими потоками, что затрудняет просмотр стека потока, который распространялся на сбой.
источник
Освобождение неинициализированного указателя является неопределенным поведением. На многих платформах / компиляторах
freeThis
будет иметь случайное значение (независимо от того, что было в этом месте памяти раньше). При его освобождении система будет освобождать память по этому адресу, что обычно вызывает ошибку сегментации и приводит к сбою программы.источник