Error: stack-buffer-overflow
Error de AddressSanitizer: desbordamiento del búfer de pila
En C o C++, puede producirse de muchas maneras un desbordamiento del búfer de pila. Proporcionamos varios ejemplos de esta categoría de error que se pueden detectar mediante una recompilación sencilla.
Error: desbordamiento del búfer de pila
// example1.cpp
// stack-buffer-overflow error
#include <string.h>
int main(int argc, char **argv) {
char x[10];
memset(x, 0, 10);
int res = x[argc * 10]; // Boom! Classic stack buffer overflow
return res;
}
Para compilar y probar este ejemplo, ejecute estos comandos en un símbolo del sistema para desarrolladores de Visual Studio 2019 versión 16.9 o posterior:
cl example1.cpp /fsanitize=address /Zi
devenv /debugexe example1.exe
Error resultante
Ejemplo: cálculos matemáticos del búfer de pila
// example2.cpp
// stack-buffer-overflow error
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int main(int argc, char **argv) {
assert(argc >= 2);
int idx = atoi(argv[1]);
char AAA[10], BBB[10], CCC[10];
memset(AAA, 0, sizeof(AAA));
memset(BBB, 0, sizeof(BBB));
memset(CCC, 0, sizeof(CCC));
int res = 0;
char *p = AAA + idx;
printf("AAA: %p\ny: %p\nz: %p\np: %p\n", AAA, BBB, CCC, p);
return *(short*)(p) + BBB[argc % 2] + CCC[argc % 2]; // Boom! ... when argument is 9
}
Para compilar y probar este ejemplo, ejecute estos comandos en un símbolo del sistema para desarrolladores de Visual Studio 2019 versión 16.9 o posterior:
cl example2.cpp /fsanitize=address /Zi
devenv /debugexe example2.exe 9
Error resultante: cálculos matemáticos del búfer de pila
Ejemplo: conversión a tipo heredado incorrecta en la pila
// example3.cpp
// stack-buffer-overflow error
class Parent {
public:
int field;
};
class Child : public Parent {
public:
volatile int extra_field;
};
int main(void) {
Parent p;
Child *c = (Child*)&p;
c->extra_field = 42; // Boom !
return (c->extra_field == 42);
}
Para compilar y probar este ejemplo, ejecute estos comandos en un símbolo del sistema para desarrolladores de Visual Studio 2019 versión 16.9 o posterior:
cl example3.cpp /fsanitize=address /Zi
devenv /debugexe example3.exe
Error resultante: conversión a tipo heredado incorrecta en la pila
Consulte también
Introducción a AddressSanitizer
Problemas conocidos de AddressSanitizer
Referencia de lenguaje y compilación de AddressSanitizer
Referencia del entorno de ejecución addressSanitizer
Bytes de sombra addressSanitizer
Pruebas distribuidas o en la nube addressSanitizer
Integración del depurador AddressSanitizer
Ejemplos de errores addressSanitizer