Ich versuche, ein Python-Programm zu erstellen, das mit einem anderen Absturzprozess verbunden ist (das liegt nicht in meiner Hand). Leider stürzt das Programm, mit dem ich verbunden bin, nicht einmal zuverlässig ab! Ich möchte also ein schnelles C ++ - Programm erstellen, das absichtlich abstürzt, aber ich weiß nicht, wie ich das am besten und kürzesten machen kann. Weiß jemand, was ich zwischen meine:
int main() {
crashyCodeGoesHere();
}
damit mein C ++ - Programm zuverlässig abstürzt
asm { cli; };
*((char*)-1) = 'x';
Code, um einen Absturz auszulösen, um mehr in meiner Antwort hierAntworten:
Die
abort()
Funktion ist wahrscheinlich die beste Wahl. Es ist Teil der C-Standardbibliothek und wird als "Verursachen einer abnormalen Programmbeendigung" definiert (z. B. ein schwerwiegender Fehler oder Absturz).quelle
abort()
keine Destruktoren oderatexit
Funktionen aufruft, obwohl dies hier wahrscheinlich keine Rolle spielt.atexit
s aufrufen würde, wäre es jetzt kein Absturz, oder?abort()
die richtige Antwort ist, sollte 'exit (-1); `akzeptabel sein?Versuchen:
Gefunden in:
quelle
signal()
. Die meisten vernünftigen Anwendungen tun dies jedoch nicht.raise()
. Auf diese Weise können Sie eine Vielzahl verschiedener Arten von Ausnahmen testen, indem Sie einfach das Argument ändern.Durch Teilen durch Null stürzt die Anwendung ab:
quelle
main
Textkörper einschließlich derret
Anweisung vollständig gelöscht wird . Die Ausführung fällt möglicherweise in die folgende Funktion.quelle
Nun sind wir auf Stack - Überlauf , oder nicht?
(Es ist nicht garantiert, dass es nach irgendwelchen Maßstäben abstürzt, aber es gibt auch keine der vorgeschlagenen Antworten, einschließlich der akzeptierten, da
SIGABRT
es ohnehin hätte abgefangen werden können. In der Praxis wird dies überall abstürzen.)quelle
(&i)[i] += !i
stattdessen darüber nachgedacht , aber ich befürchtete, der Compiler könnte klug genug sein und das optimieren. :-)Nur die Antwort ... :)
quelle
assert(false);
ist auch ziemlich gut.Gemäß ISO / IEC 9899: 1999 ist ein Absturz garantiert, wenn NDEBUG nicht definiert ist:
quelle
assert
entspricht dem((void)0)
Release-Modus.Da ein Absturz ein Symptom für das Aufrufen von undefiniertem Verhalten ist und das Aufrufen von undefiniertem Verhalten zu allem führen kann, einschließlich eines Absturzes, denke ich nicht, dass Sie Ihr Programm wirklich zum Absturz bringen möchten, sondern es einfach in einen Debugger fallen lassen möchten. Der tragbarste Weg, dies zu tun, ist wahrscheinlich
abort()
.Während
raise(SIGABRT)
es den gleichen Effekt hat, ist es sicherlich mehr zu schreiben. Beide Möglichkeiten können jedoch durch Installieren eines Signalhandlers für abgefangen werdenSIGABRT
. Abhängig von Ihrer Situation möchten / müssen Sie möglicherweise ein anderes Signal auslösen.SIGFPE
,SIGILL
,SIGINT
,SIGTERM
OderSIGSEGV
könnte der Weg zu gehen, aber sie alle abgefangen werden können.Wenn Sie nicht portierbar sind, sind Ihre Auswahlmöglichkeiten möglicherweise noch umfangreicher, z. B. unter
SIGBUS
Linux.quelle
Der einzige Blitz, den ich hatte, ist die Funktion abort () :
Es bricht den Prozess mit einer abnormalen Programmbeendigung ab. Es erzeugt das SIGABRT-Signal , das standardmäßig dazu führt, dass das Programm beendet wird und ein nicht erfolgreicher Beendigungsfehlercode an die Host-Umgebung zurückgegeben wird. Das Programm wird beendet, ohne Destruktoren für Objekte mit automatischer oder statischer Speicherdauer auszuführen und ohne Aufrufen einer Funktion atexit (die von exit () aufgerufen wird, bevor das Programm beendet wird). Es kehrt nie zu seinem Anrufer zurück.
quelle
Die Antwort ist plattformspezifisch und hängt von Ihren Zielen ab. Aber hier ist die Mozilla Javascript-Absturzfunktion, die meiner Meinung nach viele Herausforderungen für diese Funktion veranschaulicht:
quelle
Ich sehe, dass hier viele Antworten veröffentlicht werden, die in glückliche Fälle geraten, um die Arbeit zu erledigen, aber keine von ihnen ist zu 100% deterministisch für einen Absturz. Einige stürzen auf einer Hardware und einem Betriebssystem ab, andere nicht. Es gibt jedoch eine Standardmethode gemäß dem offiziellen C ++ - Standard, um einen Absturz zu verursachen.
Zitat aus C ++ Standard ISO / IEC 14882 §15.1-7 :
Ich habe einen kleinen Code geschrieben, um dies zu demonstrieren, und kann hier auf Ideone gefunden und ausprobiert werden .
ISO / IEC 14882 §15.1 / 9 erwähnt den Wurf ohne Try-Block, was zu einem impliziten Aufruf zum Abbruch führt:
Andere schließen ein: vom Zerstörer werfen: ISO / IEC 14882 §15.2 / 3
quelle
Dies führt zu einem Segmentierungsfehler.
quelle
Dieser fehlt:
quelle
Was ist mit einem Stapelüberlauf durch einen rekursiven Methodenaufruf in einer toten Schleife?
Siehe Originalbeispiel in Microsoft KB
quelle
Dies stürzt auf meinem Linux-System ab, da Zeichenfolgenliterale im Nur-Lese-Speicher gespeichert sind:
G ++ weigert sich übrigens, dies zu kompilieren. Compiler werden immer schlauer :)
quelle
Ihr Compiler wird Sie wahrscheinlich davor warnen, aber unter GCC 4.4.3 wird er problemlos kompiliert. Dies führt wahrscheinlich zu einem SIGFPE (Gleitkomma-Ausnahme), das in einer realen Anwendung möglicherweise nicht so wahrscheinlich ist wie SIGSEGV (Speichersegmentierungsverletzung) wie Die anderen Antworten verursachen, aber es ist immer noch ein Absturz. Meiner Meinung nach ist dies viel besser lesbar.
Ein anderer Weg, wenn wir betrügen und benutzen wollen
signal.h
, ist:Dies ist im Gegensatz zu SIGSEGV garantiert, um den Unterprozess abzubrechen.
quelle
Dies ist eine garantiertere Version des Abbruchs, die in den obigen Antworten dargestellt ist. Sie kümmert sich um die Situation, in der Sigabrt blockiert ist. Sie können jedes Signal anstelle des Abbruchs verwenden, bei dem das Programm standardmäßig abstürzt.
quelle
Dies sollte auch abstürzen. Unter Windows stürzt es mit AccessViolation ab und sollte auf allen Betriebssystemen, denke ich, dasselbe tun.
quelle
on all OS-es
Nein, es ist nicht in nicht geschütztem OS nicht abstürzen (zB MS-DOS.) Eigentlich manchmal ist etwas in der Adresse 0! Für den x86-Real-Modus befindet sich die Interrupt-main()
.Dies ist das von Google in Breakpad bereitgestellte Snippet.
quelle
quelle
Obwohl diese Frage bereits eine akzeptierte Antwort hat ...
Oder...
void main(){throw 1;}
quelle
Das Schreiben in einen Nur-Lese-Speicher führt zu einem Segmentierungsfehler, es sei denn, Ihr System unterstützt keine Nur-Lese-Speicherblöcke.
Ich habe es mit MingGW 5.3.0 unter Windows 7 und GCC unter Linux Mint getestet. Ich nehme an, dass andere Compiler und Systeme einen ähnlichen Effekt erzielen.
quelle
Oder anders, seit wir auf dem Bandwagen sind.
Ein schönes Stück unendlicher Rekursion. Garantiert, um Ihren Stapel zu sprengen.
Druckt aus:
quelle
main
selbst ist eigentlich nicht definiertes Verhalten, falls Sie nicht wissen :) Auch Endrekursion ist nicht garantiert , um Ihren Stapel zu blasen. Wenn Sie eine "Garantie" wünschen, müssen Sie nach dem rekursiven Aufruf etwas tun , sonst könnte der Compiler die Rekursion in eine Endlosschleife optimieren.Eine, die noch nicht erwähnt wurde:
Dadurch wird der Nullzeiger als Funktionszeiger behandelt und dann aufgerufen. Wie bei den meisten Methoden kann nicht garantiert werden, dass das Programm abstürzt, aber die Wahrscheinlichkeit, dass das Betriebssystem dies deaktiviert und das Programm jemals zurückkehrt, ist vernachlässigbar gering.
quelle
Hoffe das stürzt ab. Prost.
quelle
quelle
long long
oder zu verwendensize_t
und mitp
dem jeweiligen Maximalwert oder in der Nähe davon zu beginnen, um schneller abzustürzen. Obwohl es auch in diesem Fall nicht garantiert ist, dass es abstürzt.Eine stilvolle Möglichkeit hierfür ist ein rein virtueller Funktionsaufruf:
Zusammengestellt mit gcc, druckt dies:
quelle
Sie können Assembly in Ihrem C ++ verwenden,
code
ABERINT 3
nur für x86-Systeme. Andere Systeme verfügen möglicherweise über andere Trap- / Breakpoint-Anweisungen.INT 3
verursacht einen Interrupt und ruft einen vom Betriebssystem eingerichteten Interrupt-Vektor auf.quelle
Verwenden Sie __builtin_trap () in GCC oder clang oder __debugbreak () in MSVC. Wenn diese Haltepunkte / Traps nicht behandelt werden, führt dies zu einer nicht behandelten Haltepunktausnahme / einem Absturz. Andere Vorschläge, die abort () oder exit () verwenden: Diese können von anderen Threads verarbeitet werden, wodurch es schwieriger wird, den Stapel des Threads zu sehen, der den Absturz verbreitet hat.
quelle
Das Freigeben eines nicht initialisierten Zeigers ist ein undefiniertes Verhalten. Auf vielen Plattformen / Compilern
freeThis
wird ein zufälliger Wert angezeigt (was auch immer sich zuvor an diesem Speicherort befand). Wenn Sie es freigeben, wird das System aufgefordert, den Speicher an dieser Adresse freizugeben. Dies führt normalerweise zu einem Segmentierungsfehler und führt zum Absturz des Programms.quelle