Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Fel:
Adressfel för sanitizer: Stackbuffertspill
Anmärkningar
Ett stackbuffertspill kan inträffa på många sätt i C eller C++. Vi tillhandahåller flera exempel på den här felkategorin som du kan fånga upp med en enkel kompilering.
Exempel – stackbuffertspill
// 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;
}
Om du vill skapa och testa det här exemplet kör du dessa kommandon i en kommandotolk för Visual Studio 2019 version 16.9 eller senare:
cl example1.cpp /fsanitize=address /Zi
devenv /debugexe example1.exe
Resulterande fel
Exempel – stackbuffertmatematik
// 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
}
Om du vill skapa och testa det här exemplet kör du dessa kommandon i en kommandotolk för Visual Studio 2019 version 16.9 eller senare:
cl example2.cpp /fsanitize=address /Zi
devenv /debugexe example2.exe 9
Resulterande fel – stackbuffertmatematik
Exempel – felaktig nedgjutning på stack
// 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);
}
Om du vill skapa och testa det här exemplet kör du dessa kommandon i en kommandotolk för Visual Studio 2019 version 16.9 eller senare:
cl example3.cpp /fsanitize=address /Zi
devenv /debugexe example3.exe
Resulterande fel – felaktig nedgjutning på stack
Se även
AddressSanitizer– översikt
AddressSanitizer kända problem
AddressSanitizer- och språkreferens
AddressSanitizer-körningsreferens
AddressSanitizer skugg byte
AddressSanitizer-moln eller distribuerad testning
AddressSanitizer-felsökningsintegrering
AddressSanitizer-felexempel