Le stack smashing ici est en fait causé par un mécanisme de protection utilisé par gcc pour détecter les erreurs de dépassement de tampon. Par exemple, dans l'extrait suivant :
#include <stdio.h>
void func()
{
char array[10];
gets(array);
}
int main(int argc, char **argv)
{
func();
}
Le compilateur, (dans ce cas gcc) ajoute des variables de protection (appelées canaries) qui ont des valeurs connues. Une chaîne d'entrée de taille supérieure à 10 provoque la corruption de cette variable, ce qui entraîne l'arrêt du programme par SIGABRT.
Pour y voir plus clair, vous pouvez essayer de désactiver cette protection de gcc en utilisant l'option -fno-stack-protector
lors de la compilation. Dans ce cas, vous obtiendrez une erreur différente, très probablement une erreur de segmentation car vous essayez d'accéder à un emplacement mémoire illégal. Notez que -fstack-protector
doit toujours être activée pour les versions publiées car il s'agit d'une fonctionnalité de sécurité.
Vous pouvez obtenir des informations sur le point de débordement en exécutant le programme avec un débogueur. Valgrind ne fonctionne pas bien avec les erreurs liées à la pile, mais comme un débogueur, il peut vous aider à déterminer l'emplacement et la raison du plantage.
2 votes
Pourriez-vous peut-être identifier les parties de votre code qui provoquent l'effondrement de la pile, et le poster ? Nous serons alors probablement en mesure d'indiquer exactement pourquoi cela se produit et comment le corriger.
0 votes
Je pense que c'est un synonyme d'erreur de dépassement de capacité. Par exemple, si vous initialisez un tableau de 5 éléments, cette erreur apparaîtra lorsque vous essaierez d'écrire le 6ème élément, ou tout élément en dehors des limites du tableau.