c ++ - Hvorfor undgår Windows 'gflags ikke at kollidere med denne kode?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg lavede følgende program:


int main() {
    int* p = new int[10];
    delete[] p;
    p[0] = 0;
    return 0;
}


Så udførte jeg dette program med gflags aktiveret:


C:	mpTest2Debug>"C:Program FilesDebugging Tools for Windowsgflags.exe" -p /enable Test2.exe /full
path: SOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Options
    test2.exe: page heap enabled

C:	mpTest2Debug>test2

C:	mpTest2Debug>


Som forventet kolliderer programmet. Kører det med en debugger Jeg kan se, at det kolliderer på denne linje:


p[0] = 0;


Det var det, jeg havde forventet.


Men dette program kolliderer ikke:


int main() {
    int* p = new int[10];
    p[10] = 0;
    return 0;
}


Hvorfor får ikke gflags denne adgang uden for grænserne? Generelt opdages hvilke slags fejlfejl ved gflags, og hvilke fejl registreres ikke?

Bedste reference


Men dette program kolliderer ikke:


int main() {
    int* p = new int[10];
    p[10] = 0;
    return 0; 
}


Hvorfor gflags ikke fange dette?


Fordi new -operationen ofte vil tildele hukommelse mere, end du vil have, til hukommelsesjusteringsformål. Hvis du vil kollidere dette, skal du bare bruge p[1025] = 0; eller noget større.