Corrupção na pilha em C++

Em C++, de que forma a pilha pode ficar corrompida. Uma maneira que eu acho é sobrescrever as variáveis de pilha acessando um array além de seus limites. Há outra forma de se corromper?

Author: Naveen, 2009-04-05

6 answers

  1. você pode ter um ponteiro Aleatório/indefinido que acaba apontando para a pilha,e escrever isso.
  2. uma função de montagem pode configurar/modificar/repor incorrectamente a pilha
  3. As ondas Cósmicas podem virar pedaços na pilha. Os elementos radioactivos no invólucro do chip podem virar pedaços. Qualquer coisa no kernel pode correr mal e alterar acidentalmente a memória da pilha.

Mas estes não são particulares para C++, o que não faz ideia de pilho.

 28
Author: Douglas Leeder, 2010-01-08 08:20:21
As violações da regra de uma definição podem levar à corrupção da pilha. O exemplo a seguir parece estúpido, mas eu o vi algumas vezes com diferentes bibliotecas compiladas em diferentes configurações.

Cabeçalho.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
}
 30
Author: Richard Wolf, 2016-10-26 13:41:53

Apontar para variáveis de pilha é uma boa maneira:

void foo()
{
  my_struct s;
  bar(&s);
}
Se bar mantém uma cópia do ponteiro, tudo pode acontecer no futuro. Resumindo: a corrupção na pilha acontece quando há ponteiros vadios apontando para a pilha.
 15
Author: Jimmy J, 2009-04-05 10:41:53

A norma c++ não define pilha/heap. Além disso, há uma série de maneiras de invocar um comportamento indefinido em um programa -- todas as quais podem corromper sua pilha (é UB, afinal de contas). A resposta curta é -- sua pergunta é muito vaga para ter uma resposta significativa.

 10
Author: dirkgently, 2009-04-05 07:16:18
A chamar uma função com a Convenção de chamadas errada.

(embora isto seja tecnicamente específico do compilador, não uma questão de C++, Todo compilador C++ tem de lidar com isso.)

 4
Author: peterchen, 2009-04-05 07:51:11
Abrir uma excepção dentro de um destruidor é um bom candidato. Estragaria a pilha de espera.
 4
Author: daramarak, 2010-02-24 16:20:56