Le code ci-dessous est dit pour donner une violation de segmentation:Pourquoi ne donne-t-il PAS une violation de segmentation?
#include <stdio.h>
#include <string.h>
void function(char *str) {
char buffer[16];
strcpy(buffer,str);
}
int main() {
char large_string[256];
int i;
for(i = 0; i < 255; i++)
large_string[i] = 'A';
function(large_string);
return 1;
}
Il est compilé et exécuté comme ceci:
gcc -Wall -Wextra hw.cpp && a.exe
Mais il y a sortie rien.
NOTE
Le code ci-dessus en effet l'adresse écrase ret et ainsi de suite si vous comprenez vraiment ce qui se passe en dessous.
L'adresse ret sera 0x41414141
pour être spécifique.
Important Cela nécessite une connaissance approfondie de la pile
Le comportement indéfini est un comportement indéfini. –
Non seulement ce comportement n'est pas défini, mais vous n'avez aucun code pour produire quoi que ce soit. –
Est-ce que 2 comportement indéfini fait 1 comportement défini? ;-) La première grande_chaîne elle-même n'est pas terminée par un caractère nul, alors on essaye de copier un tampon source trop grand pour sa destination. : D – KTC