Comment déboguer 'Stack Smashing détecté'?
J'ai un complexe de code c++.
C'est un FastCGI programme, à l'aide de http://althenia.net/fcgicc
Quand j'ai demander pour un looooong url, je reçois
*** stack smashing detected ***: ./tileserve terminated
Erreur de segmentation
Pour la vraie vie, ce n'est pas un problème, puisque je n'ai jamais utiliser donc de longues url, mais ça veut dire que n'importe qui pourrait mettre fin à mon serveur.... Je n'aime pas ça.
Est-il un outil (et comment l'utiliser?) pour trouver d'où vient le problème ?
EDIT : RÉSOLU
Ok résolu.
Je faisais
int len;
char uri[200];
len = strlen(request.params[std::string("REQUEST_URI")].c_str());
printf("%d\n", len);
if (len > 200) return 1;
strcpy(uri, request.params[std::string("REQUEST_URI")].c_str());
Dirait que 200 était trop haute pour le len de test.
Il fait échec à 194.
J'ai donc fait :
if (len > 190) return 1;
C'est bien.
source d'informationauteur user1219721
Vous devez vous connecter pour publier un commentaire.
Si vous avez lu le site, vous vous rendrez compte que c'est un simple wrapper C++ sur une bibliothèque C.
Typique d'un problème avec la bibliothèque C sont des dépassements de la mémoire tampon:
Essayer ce programme:
Parce que la mémoire tampon ne peut contenir 16 caractères, les caractères restants seront gravées au-delà de sa fin. C'est stack smashinget comportement indéfini.
Un certain nombre d'implémentations de la bibliothèque d'exécution ou de votre système d'exploitation peut détecter cette situation dans certaines conditions et de mettre fin au programme.
Soit vous sont en train de faire quelque chose de mal ou la bibliothèque est.
Pour localiser le problème, vous pouvez utiliser Valgrind ou exécuter votre programme dans un débogueur. Alternativement, si votre système le permet, vous pourriez avoir un vidage de la mémoire au moment où le programme a été tué. Vous pouvez également afficher ce vidage de la mémoire dans un débogueur.
Vous pouvez utiliser quelque chose comme valgrind, ou votre compilateur peut avoir une analyse statique qui peut trouver des endroits que vous pourriez être dépassement de tampons.
Vous pouvez aussi tout simplement à la vérification de votre code d'usages de commettre des erreurs, comme les fonctions strcpy et de les remplacer avec les fonctions de sécurité comme strncpy, ou encore mieux, utiliser des objets qui gèrent leur propre mémoire comme std::string.