segmentation generado dumped c++ segmentation-fault

c++ - generado - segmentation fault(core dumped) ubuntu



¿Por qué no puedo causar una falla seg? (10)

Ambas cosas que haces producirán un "comportamiento indefinido" en C ++ (bueno, llamar a main () en realidad está explícitamente prohibido). No hay garantía de que causen fallas seg. Esto dependerá de muchas cosas, pero principalmente de la plataforma en la que se está ejecutando, que no ha especificado.

De hecho, cualquier método sugerido para causar una falla de seguridad puede o no funcionar. Esto se debe a que una falla de seg se asocia casi siempre con el concepto de comportamiento indefinido de C ++.

Está bien, por alguna razón, estoy teniendo problemas para causar una falla de seguridad. Quiero producir uno para poder usar gdb para ver cómo depurar uno. He probado los dos ejemplos del artículo de Wikipedia pero ninguno funciona.

El primero:

char *s = "Hello World!"; *s = ''H'';

Y el segundo ejemplo:

int main(void) { main(); }

EDITAR: Estoy usando Ubutnu 9.10 y g++ como mi compilador. ¿Alguien me puede mostrar algún código que esté garantizado para segfault?


El artículo de Wikipedia en realidad enumera tres métodos (uno de los cuales es una falta de referencia de puntero nulo); ¿Por qué no probaste eso?

En cuanto a por qué los dos ejemplos que probaste no lo hicieron, bueno, la respuesta correcta, como han señalado otros, es que es un comportamiento indefinido, por lo que cualquier cosa podría suceder (lo que incluye no segregar). Pero se podría especular que la razón por la que el primer formulario no falló para usted es porque su compilador o sistema es laxo con respecto a la protección de la memoria. En cuanto al segundo caso, un compilador consciente de la recursividad de la cola posiblemente podría optimizar el bucle main infinitamente recursivo y no terminar desbordando la pila.


Es imposible intentarlo y de forma fiable desreferenciar los punteros.
Esto se debe a que la aplicación maneja la memoria puede variar de compilador a compilador también en el mismo compilador con diferentes opciones (el modo de depuración / liberación se maneja de manera diferente).

Lo que puedes hacer es elevar explícitamente el segfault usando una señal:

#include <signal.h> int main() { raise(SIGSEGV); }


Mi sabor de una línea:

*(char *)0 = 0;


Muchas formas de generar un segfault.

Como desreferenciar un mal puntero:

char *s = (char *)0xDEADBEEF; *s = ''a'';


Para el primer ejemplo, es probable que el compilador ponga la cadena en la memoria de escritura, por lo que no hay ningún error de seg al intentar cambiarla.

Para el segundo, el compilador puede estar optimizando la llamada de distancia o puede estar optimizando la llamada a un salto (ya que es una llamada de cola ), lo que significa que la pila no está creciendo con direcciones de retorno para cada llamada, por lo que Podríamos repetir indefinidamente.

Pero como Neil mencionó en su publicación, cualquiera de estas cosas resulta en un "comportamiento indefinido", por lo que el código no es requerido en el tiempo de ejecución para generar una falla de seguridad.


Segfault más corto que nunca:

*(int*)0=0;


Si intentas concatenar dos constantes ... obtendrás una ... al menos es una forma simple ...

strcat ("a", "b");

=)


char * ptr = 0; *ptr = 1; Segmentation fault


int *hello = NULL; printf(*hello);

o puede definir una estructura (por ejemplo, HelloWorld struct)

HelloWorld *myWorld = NULL; myWorld->world = "hello";