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?
18
6 answers
- você pode ter um ponteiro Aleatório/indefinido que acaba apontando para a pilha,e escrever isso.
- uma função de montagem pode configurar/modificar/repor incorrectamente a pilha 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