J'essaie de créer un programme Python qui s'interface avec un autre processus brutal (c'est hors de ma portée). Malheureusement, le programme avec lequel je m'interface ne plante même pas de manière fiable! Je veux donc créer un programme C ++ rapide qui se bloque exprès, mais je ne connais pas vraiment la meilleure et la plus courte façon de le faire, est-ce que quelqu'un sait quoi mettre entre mes:
int main() {
crashyCodeGoesHere();
}
faire planter mon programme C ++ de manière fiable
asm { cli; };
*((char*)-1) = 'x';
code suivant pour provoquer un plantage afin de déboguer en savoir plus dans ma réponse iciRéponses:
La
abort()
fonction est probablement votre meilleur choix. Il fait partie de la bibliothèque standard C et est défini comme «provoquant une fin anormale du programme» (par exemple, une erreur fatale ou un crash).la source
abort()
n'appelle aucun destructeur ouatexit
fonction, bien que cela n'ait probablement pas d'importance ici.atexit
s, ce ne serait pas un crash maintenant?abort()
c'est la bonne réponse, alors 'exit (-1); `devrait être acceptable?Essayer:
Trouvé dans:
la source
signal()
. Cependant, la plupart des applications sensées ne le font pas.raise()
. Cela vous permet de tester une tonne de différents types d'exceptions en changeant simplement l'argument.Si vous divisez par zéro, l'application se bloquera:
la source
main
suppression complète du corps, y compris l'ret
instruction. L'exécution pourrait simplement tomber dans la fonction suivante.la source
Eh bien, sommes-nous en débordement de pile , ou non?
(Il n'est pas garanti de planter selon les normes, mais aucune des réponses suggérées, y compris celle acceptée, car elle
SIGABRT
aurait pu être interceptée de toute façon. En pratique, cela plantera partout.)la source
(&i)[i] += !i
place, mais je craignais que le compilateur soit assez intelligent et que je veuille l'optimiser. :-)Juste la réponse ... :)
la source
assert(false);
est assez bon aussi.Selon ISO / IEC 9899: 1999, il est garanti de se bloquer lorsque NDEBUG n'est pas défini:
la source
assert
est rendu équivalent au((void)0)
mode Release.Puisqu'un crash est un symptôme d'invocation d'un comportement non défini, et puisque l'invocation d'un comportement non défini peut conduire à n'importe quoi, y compris un crash, je ne pense pas que vous vouliez vraiment planter votre programme, mais faites-le simplement tomber dans un débogueur. La façon la plus portable de le faire est probablement
abort()
.Bien que cela
raise(SIGABRT)
ait le même effet, c'est certainement plus à écrire. Les deux manières peuvent cependant être interceptées en installant un gestionnaire de signaux pourSIGABRT
. Donc, selon votre situation, vous voudrez peut-être / devrez lever un autre signal.SIGFPE
,SIGILL
,SIGINT
,SIGTERM
OuSIGSEGV
peut - être la voie à suivre, mais ils peuvent tous être interceptés.Lorsque vous ne pouvez pas être transférable, vos choix peuvent être encore plus larges, comme l'utilisation
SIGBUS
sur Linux.la source
Le seul flash que j'ai eu est la fonction abort () :
Il interrompt le processus avec une fin de programme anormale.Il génère le signal SIGABRT , qui par défaut provoque la fin du programme renvoyant un code d'erreur de fin infructueuse à l'environnement hôte.Le programme est terminé sans exécuter de destructeurs pour les objets de durée de stockage automatique ou statique et sans faire appel à tout atexit (qui est appelé par la sortie () avant que se termine le programme) fonction. Il ne revient jamais à son appelant.
la source
La réponse est spécifique à la plateforme et dépend de vos objectifs. Mais voici la fonction de crash de Mozilla Javascript, qui, je pense, illustre beaucoup de défis pour faire fonctionner cela:
la source
Je vois qu'il y a beaucoup de réponses publiées ici qui tomberont dans des cas chanceux pour faire le travail, mais aucune d'entre elles n'est 100% déterministe pour planter. Certains tomberont en panne sur un matériel et un système d'exploitation, d'autres non. Cependant, il existe un moyen standard selon la norme C ++ officielle de le faire planter.
Citant de la norme C ++ ISO / IEC 14882 §15.1-7 :
J'ai écrit un petit code pour le démontrer et je peux le trouver et l'essayer sur Ideone ici .
L'ISO / CEI 14882 §15.1 / 9 mentionne un lancer sans bloc d'essai entraînant un appel implicite à l'abandon:
Autres: jet du destructeur: ISO / IEC 14882 §15.2 / 3
la source
Cela produira un défaut de segmentation.
la source
Celui-ci manque:
la source
Qu'en est-il du débordement de pile par un appel de méthode récursive en boucle morte?
Voir l' exemple d'origine sur Microsoft KB
la source
Cela se bloque sur mon système Linux, car les littéraux de chaîne sont stockés en mémoire morte:
Soit dit en passant, g ++ refuse de compiler cela. Les compilateurs deviennent de plus en plus intelligents :)
la source
Votre compilateur vous avertit probablement à ce sujet, mais il compile très bien sous GCC 4.4.3 Ce sera probablement provoquera un SIGFPE (exception à virgule flottante), ce qui n'est peut-être pas aussi probable dans une application réelle que SIGSEGV (violation de segmentation de mémoire) que les autres réponses causent, mais c'est quand même un crash. À mon avis, c'est beaucoup plus lisible.
Une autre façon, si nous allons tricher et utiliser
signal.h
, est:Ceci est garanti pour tuer le sous-processus, contrairement à SIGSEGV.
la source
Il s'agit d'une version plus garantie de l'abandon présentée dans les réponses ci-dessus.Elle prend soin de la situation lorsque sigabrt est bloqué.Vous pouvez en fait utiliser n'importe quel signal au lieu d'abandonner qui a pour effet par défaut de planter le programme.
la source
Cela devrait également planter. Sous Windows, il se bloque avec AccessViolation et il devrait faire de même sur tous les systèmes d'exploitation, je suppose.
la source
on all OS-es
Non, il ne tombe pas en panne dans le système d' exploitation non protégé (par exemple MS-DOS.) En fait, parfois il est quelque chose dans l' adresse 0! Pour le mode réel x86, Interrupt Vector Table est à l'adresse 0.main()
.Il s'agit de l'extrait fourni par Google dans Breakpad.
la source
la source
Bien que cette question ait déjà une réponse acceptée ...
Ou...
void main(){throw 1;}
la source
L'écriture dans une mémoire en lecture seule entraînera une erreur de segmentation, sauf si votre système ne prend pas en charge les blocs de mémoire en lecture seule.
Je l'ai testé avec MingGW 5.3.0 sur Windows 7 et GCC sur Linux Mint. Je suppose que d'autres compilateurs et systèmes donneront un effet similaire.
la source
Ou d'une autre manière puisque nous sommes dans le wagon du groupe.
Un joli morceau de récursion infinie. Garanti pour faire exploser votre pile.
Imprime:
la source
main
soi-même est en fait un comportement indéfini, au cas où vous ne le sauriez pas :) En outre, la récursivité de la queue n'est pas garantie de faire exploser votre pile. Si vous voulez une "garantie", vous devez faire quelque chose après l'appel récursif, sinon le compilateur pourrait optimiser la récursivité dans une boucle infinie.Celui qui n'a pas encore été mentionné:
Cela traitera le pointeur nul comme un pointeur de fonction, puis l'appellera. Tout comme la plupart des méthodes, cela ne garantit pas le plantage du programme, mais les chances que le système d'exploitation laisse cela sans contrôle et que le programme revienne jamais sont négligeables.
la source
J'espère que ça plante. À votre santé.
la source
la source
long long
ousize_t
et commenceraisp
à la valeur maximale respective, ou à proximité, pour planter plus rapidement. Bien qu'il ne soit toujours pas garanti de planter même dans ce cas.Une façon élégante de le faire est un appel de fonction virtuelle pure:
Compilé avec gcc, ceci imprime:
la source
Vous pouvez utiliser l'assemblage dans votre c ++
code
MAISINT 3
c'est uniquement pour les systèmes x86 que d'autres systèmes peuvent avoir d'autres instructions d'interruption / point d'arrêt.INT 3
provoque une interruption et appelle un vecteur d'interruption configuré par le système d'exploitation.la source
Utilisez __builtin_trap () dans GCC ou clang, ou __debugbreak () dans MSVC. Le non-traitement de ces points d'arrêt / interruptions entraînera une exception / panne de point d'arrêt non gérée. Autres suggestions qui utilisent abort () ou exit (): celles-ci peuvent être gérées par d'autres threads, ce qui rend plus difficile la visualisation de la pile du thread qui a propagé le crash.
la source
La libération d'un pointeur non initialisé est un comportement non défini. Sur de nombreuses plates-formes / compilateurs,
freeThis
aura une valeur aléatoire (ce qui se trouvait auparavant à cet emplacement mémoire). Le libérer demandera au système de libérer la mémoire à cette adresse, ce qui provoquera généralement une erreur de segmentation et fera planter le programme.la source