Skip to main content

O que é um estouro de pilha?

O estouro de pilha é um erro de programação no qual uma tentativa de gravar dados em um bloco de memória específico falha porque não há espaço no bloco. Esse tipo de erro ocorre da mesma maneira que estouros de buffer, estouros de heap e estouros de buffer de pilha. A diferença entre esses tipos de erros depende da estrutura de dados do computador que está sendo usada e o recurso comum é que ocorre uma tentativa de gravar mais dados do que o espaço disponível para armazená-los.

Os sintomas de um estouro de pilha podem variar dependendo do idioma do computador usado e do mecanismo de relatório de erros disponível. No C ++, um estouro de pilha geralmente se manifesta como uma falha de segmentação e, freqüentemente, não há informações adicionais para determinar onde ou como o estouro ocorreu. Um estouro em Java geralmente resulta em uma falha da máquina virtual que fornece um arquivo de erro razoavelmente detalhado. Independentemente do idioma em que ocorra um estouro, ele quase sempre pode ser corrigido pela depuração e identificação adequadas da fonte de estouro original.

As linguagens de computador que oferecem gerenciamento explícito de memória geralmente são mais fáceis de proteger contra o estouro de pilha. A prática de programação amplamente aceita geralmente determina que, para cada segmento de memória que um programa aloca, o programa também deve se excluir. O C ++ permite esse mecanismo, e um monitoramento cuidadoso dessa maneira pode reduzir ao mínimo a quantidade de memória que um programa usa. Os idiomas que não oferecem gerenciamento explícito de memória e, em vez disso, usam gerenciamento implícito de memória, são mais difíceis de proteger contra erros de estouro de pilha. O Java lida com sua própria memória dentro de sua máquina virtual, portanto, os dados não podem ser excluídos explicitamente à vontade para dar espaço a mais.

Um erro comum dos programadores iniciantes é assumir que um estouro de pilha não pode ocorrer em linguagens de computador que manipulam seu próprio gerenciamento de memória. Embora isso pareça plausível a princípio, não é realmente o caso. Os idiomas com gerenciamento implícito de memória geralmente têm coletores de lixo que liberam blocos de memória desnecessários, mas nem sempre funcionam no momento que um programador espera. Depender de coletores de lixo é relativamente perigoso e nem sempre pode proteger um programa de um erro de estouro.

Os erros de estouro podem ser cataclísmicos e interromper um programa inteiro, ou podem ficar quase silenciosos e permitir que um programa continue adiante. Esses segundos tipos de erros geralmente são os mais difíceis de encontrar, pois pode ocorrer um erro que veio de um estouro de muitas linhas de código antes. Um estouro de pilha geralmente não exige pesquisa em um programa inteiro, mas quanto mais tempo um programa puder ser executado após um estouro, mais difícil será o erro de encontrar e corrigir.