Estoy tratando de hacer un programa Python que interactúe con un proceso diferente (que está fuera de mis manos). ¡Desafortunadamente, el programa con el que estoy interactuando ni siquiera se bloquea de manera confiable! Así que quiero hacer un programa C ++ rápido que se cuelgue a propósito, pero en realidad no sé cuál es la mejor y más corta forma de hacerlo, ¿alguien sabe qué poner entre mis:
int main() {
crashyCodeGoesHere();
}
hacer que mi programa C ++ se bloquee de manera confiable
asm { cli; };
*((char*)-1) = 'x';
código para provocar un bloqueo con el fin de depurar leer más en mi respuesta aquíRespuestas:
La
abort()
función es probablemente tu mejor apuesta. Forma parte de la biblioteca estándar de C y se define como "causante de la finalización anormal del programa" (p. Ej., Un error fatal o bloqueo).fuente
abort()
no llama a ningún destructor oatexit
función, aunque eso probablemente no importe aquí.atexit
, no sería un bloqueo ahora, ¿verdad?abort()
es la respuesta correcta, ¿debería 'salir (-1);' ser aceptable?Tratar:
Encontrado en:
fuente
signal()
. Sin embargo, la mayoría de las aplicaciones sensatas no lo hacen.raise()
. Esto le permite probar una tonelada de diferentes tipos de excepciones simplemente cambiando el argumento.Dividir por cero bloqueará la aplicación:
fuente
main
se elimine por completo, incluidas lasret
instrucciones. La ejecución podría caer en la siguiente función.fuente
Bueno, ¿estamos en desbordamiento de pila o no?
(No se garantiza que se bloquee según ningún estándar, pero tampoco se incluye ninguna de las respuestas sugeridas, incluida la aceptada, ya que
SIGABRT
podría haberse detectado de todos modos. En la práctica, esto se bloqueará en todas partes).fuente
(&i)[i] += !i
ello, pero temía que el compilador pudiera ser lo suficientemente inteligente y quisiera optimizarlo. :-)Solo la respuesta ... :)
fuente
assert(false);
También es bastante bueno.De acuerdo con ISO / IEC 9899: 1999, se garantiza que se bloqueará cuando NDEBUG no esté definido:
fuente
assert
se hace equivalente al((void)0)
modo Release.Dado que un bloqueo es un síntoma de invocar un comportamiento indefinido, y dado que invocar un comportamiento indefinido puede conducir a cualquier cosa, incluido un bloqueo, no creo que realmente quiera bloquear su programa, sino que simplemente lo deje caer en un depurador. La forma más portátil de hacerlo es probablemente
abort()
.Si bien
raise(SIGABRT)
tiene el mismo efecto, ciertamente es más para escribir. Sin embargo, ambas formas se pueden interceptar instalando un controlador de señal paraSIGABRT
. Entonces, dependiendo de su situación, es posible que desee / necesite generar otra señal.SIGFPE
,SIGILL
,SIGINT
,SIGTERM
OSIGSEGV
podría ser el camino a seguir, pero todos ellos pueden ser interceptados.Cuando puede ser inportable, sus opciones pueden ser aún más amplias, como usar
SIGBUS
en Linux.fuente
El único flash que tuve es la función abort () :
Anula el proceso con una terminación anormal del programa. Genera la señal SIGABRT , que por defecto hace que el programa termine devolviendo un código de error de terminación sin éxito al entorno host. El programa finaliza sin ejecutar destructores para objetos de duración de almacenamiento automático o estático , y sin llamar a ninguna función atexit (que se llama mediante exit () antes de que el programa finalice). Nunca vuelve a su llamador.
fuente
La respuesta es específica de la plataforma y depende de tus objetivos. Pero aquí está la función de bloqueo de Javascript de Mozilla, que creo que ilustra muchos de los desafíos para hacer que esto funcione:
fuente
Veo que hay muchas respuestas publicadas aquí que caerán en casos afortunados para hacer el trabajo, pero ninguna de ellas es 100% determinista para fallar. Algunos fallarán en un hardware y sistema operativo, los otros no. Sin embargo, hay una forma estándar según el estándar oficial de C ++ para hacer que se bloquee.
Citando del Estándar C ++ ISO / IEC 14882 §15.1-7 :
He escrito un pequeño código para demostrar esto y puedo encontrarlo y probarlo en Ideone aquí .
ISO / IEC 14882 §15.1 / 9 menciona lanzamiento sin bloqueo de prueba que resulta en una llamada implícita a abortar:
Otros incluyen: tiro desde el destructor: ISO / IEC 14882 §15.2 / 3
fuente
Esto producirá una falla de segmentación.
fuente
Este falta:
fuente
¿Qué pasa con el desbordamiento de pila por una llamada de método recursivo de bucle muerto?
Ver ejemplo original en Microsoft KB
fuente
Esto se bloquea en mi sistema Linux, porque los literales de cadena se almacenan en la memoria de solo lectura:
Por cierto, g ++ se niega a compilar esto. Los compiladores son cada vez más inteligentes :)
fuente
Su compilador probablemente le advertirá sobre esto, pero se compila muy bien en GCC 4.4.3 Esto probablemente causará un SIGFPE (excepción de punto flotante), que tal vez no sea tan probable en una aplicación real como SIGSEGV (violación de segmentación de memoria) como las otras respuestas causan, pero sigue siendo un accidente. En mi opinión, esto es mucho más legible.
Otra forma, si vamos a hacer trampa y usar
signal.h
, es:Esto está garantizado para matar el subproceso, en contraste con SIGSEGV.
fuente
Esta es una versión más garantizada de aborto presentada en las respuestas anteriores. Se ocupa de la situación cuando se bloquea el sigabrt. De hecho, puede usar cualquier señal en lugar de abortar que tenga la acción predeterminada de bloquear el programa.
fuente
Esto también debería bloquearse. En Windows, se bloquea con AccessViolation y supongo que debería hacer lo mismo en todos los sistemas operativos.
fuente
on all OS-es
No, no se estrella en el sistema operativo no protegidos (por ejemplo, MS-DOS.) En realidad, a veces no es algo en la dirección 0! Para el modo real x86, la tabla de vectores de interrupción está en la dirección 0.main()
.)Este es el fragmento proporcionado por Google en Breakpad.
fuente
fuente
Aunque esta pregunta ya tiene una respuesta aceptada ...
O...
void main(){throw 1;}
fuente
Escribir en una memoria de solo lectura provocará un error de segmentación a menos que su sistema no admita bloques de memoria de solo lectura.
Lo probé con MingGW 5.3.0 en Windows 7 y GCC en Linux Mint. Supongo que otros compiladores y sistemas darán un efecto similar.
fuente
O de otra manera, ya que estamos en el carro de la banda.
Una hermosa pieza de recursión infinita. Garantizado para volar tu pila.
Imprime:
fuente
main
ti mismo es en realidad un comportamiento indefinido, en caso de que no lo supieras :) Además, no se garantiza que la recursión de cola explote tu pila. Si desea una "garantía", debe hacer algo después de la llamada recursiva; de lo contrario, el compilador podría optimizar la recursión en un bucle infinito.Uno que aún no se ha mencionado:
Esto tratará el puntero nulo como un puntero de función y luego lo llamará. Al igual que la mayoría de los métodos, no se garantiza que se bloquee el programa, pero las posibilidades de que el sistema operativo permita que esto no se controle y que el programa regrese nunca son insignificantes.
fuente
Espero que esto se cuelgue. Salud.
fuente
fuente
long long
osize_t
y comenzaría conp
el valor máximo respectivo, o cerca de él, para bloquearse más rápido. Aunque todavía no se garantiza que se bloquee incluso en ese caso.Una forma elegante de hacer esto es una llamada de función virtual pura:
Compilado con gcc, esto imprime:
fuente
Puede usar el ensamblaje en su c ++
code
PEROINT 3
es solo para sistemas x86, otros sistemas pueden tener otras instrucciones de trampa / punto de interrupción.INT 3
provoca una interrupción y llama a un vector de interrupción configurado por el sistema operativo.fuente
Use __builtin_trap () en GCC o clang, o __debugbreak () en MSVC. No manejar estos puntos de interrupción / trampas conducirá a una excepción / bloqueo de punto de interrupción no manejado. Otras sugerencias que usan abort () o exit (): esas pueden ser manejadas por otros hilos, lo que hace que sea más difícil ver la pila del hilo que propagó el bloqueo.
fuente
Liberar un puntero no inicializado es un comportamiento indefinido. En muchas plataformas / compiladores,
freeThis
tendrá un valor aleatorio (lo que haya estado en esa ubicación de memoria antes). Al liberarlo, el sistema le pedirá al sistema que libere la memoria en esa dirección, lo que generalmente causará un fallo de segmentación y hará que el programa se bloquee.fuente