Pregunta

En C ++, en el que forma la pila puede corromperse. Una forma supongo que es a sobrescribir las variables de pila mediante el acceso a una gama más allá de sus límites. ¿Hay alguna otra forma en que ésta puede sufrir?

¿Fue útil?

Solución

  1. Usted podría tener un puntero al azar / indefinido que termina apunta a la pila, y escribir a pesar de eso.
  2. Una función de montaje podría incorrecta configuración / modificar / restaurar la pila
  3. ondas cósmicas podrían voltea bits en la pila.
  4. elementos radiactivos en la carcasa del chip podría voltear bits.
  5. Cualquier cosa en el núcleo podría ir mal, y sin querer cambiar la memoria de pila.

Pero esas no son particulares a C ++, que no tiene ni idea de la pila.

Otros consejos

Violaciónes de la Regla Una definición puede conducir a daños en la pila. En el siguiente ejemplo se ve estúpido, pero lo he visto un par de veces con diferentes bibliotecas compiladas en diferentes configuraciones.

header.h

struct MyStruct
{
   int val;
#ifdef LARGEMYSTRUCT
   char padding[16];
#endif
}

file1.cpp

#define LARGEMYSTRUCT
#include "header.h"

//Here it looks like MyStruct is 20 bytes in size    

void func(MyStruct s)
{
   memset(s.padding, 0, 16); //corrupts the stack as below file2.cpp does not have LARGEMYSTRUCT declared and declares Mystruct with 4 bytes
   return; //Will probably crash here as the return pointer has been overwritten
}

file2.cpp

#include "header.h"
//Here it looks like MyStruct is only 4 bytes in size.
extern void func(MyStruct s);

void caller()
{
   MyStruct s;
   func(s); //push four bytes on to the stack
}

punteros tomando para apilar las variables es una buena manera:

void foo()
{
  my_struct s;
  bar(&s);
}

Si la barra guarda una copia del puntero a continuación, cualquier cosa puede suceder en el futuro.

En resumen:. Daños en la pila sucede cuando hay punteros callejeros apuntando a la pila

El estándar C ++ no define pila / montón. Además, hay un número de maneras de invocar un comportamiento indefinido en un programa - todo lo cual puede dañar la pila (UB es, después de todo). La respuesta corta es -. Su pregunta es demasiado vaga para tener una respuesta significativa

Llamar a una función con la convención de llamada equivocada.

(aunque esto es, no es una cuestión de C ++ técnicamente compilador específico, cada compilador de C ++ tiene que lidiar con eso.)

Lanzar una excepción dentro de un destructor es un buen candidato. Sería estropear el desenrollado de pila.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top