Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Question à propos de la pile d'appel... [ Windows / System ] (yoman64)

mardi 2 septembre 2008 à 06:05:01 | Question à propos de la pile d'appel...

yoman64

Membre Club
Bonjour à tous,

N'étant pas expert en C, ma question va peut être sembler stupide, mais j'aimerais bien trouvé un expert(ou n'importe qui ayant la réponse ) pour y répondre

Alors voilà, je développe présentement un patch pour protéger la pile d'appel du moteur PHP. Étant administrateur de plusieurs serveurs FreeBSD/Linux utilisant le php, un appel récursif sans fin provoque rapidement une faute de segmentation ce qui pourrait facilement mettre hors service un serveur (attaque DoS).

Enfin bref, après plusieurs expérimentations afin de voir la taille de la pile dépendait de quoi, j'en suis venu aux résultats suivants:

Linux:
Un programme un C cause une faute de segmentation après 392 952 récursion
PHP plante après 39 354 récursions.

FreeBSD:
C plante après 8 388 133 récursions
PHP après plus de 390 000 récursions

Windows 2003:
Un programme C compilé avec gcc(mingsw) plante après 130 000 récursions
Un programme C compilé avec VS6 ne plante jamais, en redirigeant la sortie vers un fichier le fichier grossis sans arrêt, j'ai stoppé ça à 8Go.
Php plante après environ 50 000 récursions.

Windows Vista:
Un programme compilé avec VS 2008 ne plante jamais.


Tout avais été compilé en mode release.

Les codes utilisés:
Code C: http://pastebin.com/m6ac4c8c9
Code C (VS2008): [ Lien ]
Script PHP: http://pastebin.com/m491281a0

Bref ma question est:
La pile d'appels (stack call) dépend de quoi ? J'ai toujours cru que c'était dépendant du système d'exploitation, mais visiblement ce n'est pas le cas. Pourquoi sous windows avec un compilateur de chez microsoft ça ne s'arrête jamais ? Passé 10 milliards ça continue...

J'espère voir un expert (brunews ?) passer par là avec des explications concrètes

Merci de votre aide.

-------------------
Vous cherchez un hebergement Php/MySQL Gratuit et sans publicités ??
Et bien c'est la : www.e3b.org  

mardi 2 septembre 2008 à 11:56:32 | Re : Question à propos de la pile d'appel...

BruNews

Administrateur CodeS-SourceS
Réponse acceptée !
Windows only:
La taille de la pile dépend de l'option de compilation, 1 Mo par défaut. Cette zone mémoire est allouée et réservée par le loader system. La pile est gérée par un pointeur d'adresse, ESP en 32 bits et RSP en x64. Ce pointeur recule d'autant d'octets qu'on empile de params, sur 32 bits sera de 4 minimum hors param pour empiler l'adresse de retour (sera dépilé dans le registre EIP).

Il est donc très clair qu'une fonction récursive présente un danger pour la stack, à bannir en prod.

ciao...
BruNews, MVP VC++

mardi 2 septembre 2008 à 18:39:09 | Re : Question à propos de la pile d'appel...

max12

Administrateur CodeS-SourceS
Merci pour les explications BruNews (en fait je suis en partie derrière cette question, ayant participé au test). Mais je ne comprend pas pourquoi avec la version VC6 l'explosion attendu ne finit jamais par arriver, le stack ne peux quand même pas avoir une taille infinie ?

[ Lien ]
&

mardi 2 septembre 2008 à 21:00:30 | Re : Question à propos de la pile d'appel...

BruNews

Administrateur CodeS-SourceS
Certes non, une stack a par force une taille fixée.
Il est impossible d'émettre le moindre avis sans analyse du code et surtout il faut regarder le listing ASM du compilo pour comprendre ce qui est réellement fait. Il se peut fort bien que le compilo ait remplacé la récursivité par un JMP dans la fonction (un vilain goto) si l'algo est simple.

ciao...
BruNews, MVP VC++

mardi 2 septembre 2008 à 21:09:17 | Re : Question à propos de la pile d'appel...

yoman64

Membre Club
Hello,

Merci beaucoup pour ces explications très intéressantes. J'allais poser la même question que max12, mais puisque le code est très simple ( http://pastebin.com/m6ac4c8c9 ) il est fort probable que ta deuxième explication soit bonne (je vais laisser à max12 le soin de vérifier, je suis pas trop au courant des débuggeur sous windows).


Merci et a+

-------------------
Vous cherchez un hebergement Php/MySQL Gratuit et sans publicités ??
Et bien c'est la : www.e3b.org  

mardi 2 septembre 2008 à 21:20:58 | Re : Question à propos de la pile d'appel...

BruNews

Administrateur CodeS-SourceS
Réponse acceptée !
Pas besoin de debug, suffit de régler (clic droit sur le projet > options) "fichiers de sortie" sur "listing asm et source" et de compiler en RELEASE. En mode debug on n'a jamais la garantie d'avoir le meme code produit, d'ailleurs très rarement.

ciao...
BruNews, MVP VC++

mardi 2 septembre 2008 à 22:56:50 | Re : Question à propos de la pile d'appel...

max12

Administrateur CodeS-SourceS
Encore merci, on n'avait pas pensé à l'assembly (la je me sens con rare).

00AA1000  inc         dword ptr [eax]
    a(i);
00AA1002  jmp         a (0AA1000h)

Une possibilité que je ne croyait pas possible de la part du compilateur

Enfin bref, merci de nous avoir permis de dormir moins idiots ce soir

http://laptopgun.blogspot.com/
&



Cette discussion est classé dans : php, appel, question, pile, plante


Répondre à ce message

Sujets en rapport avec ce message

Appel fonction de DLL [ par zibo3 ] Bonjour, Dans mon programme, je load une dll et j'utilise une fonction comme point d'entrée pour l'attaquer mais j'ai un petit probleme. Ca fonctionn HWND et Preripherique [ par LordBob ] Bonjour a tous, voila en fait ma question est plutot simple, est ce qu'un HWND est attribué de façon aléatoire ou non? Je m'explique par exemple dans Question vocabulaire C++, vraiment très simple !!! [ par grivel ] Bonjour à tous, je code actuellement en VB et je n'ai jamais fait de C++. Seulement, il y a une source que je dois traduire du C++ vers VB.J'ai donc q probleme html [ par istase ] J'ai un petit probleme : je voudrai à partir d'un bouton se trouvant dans un formulaire en html faire appel au magnétophone de windows...c le lien c:W Question bête sur les MFC [ par evildido ] Jes suis désolé si cette question a déja été posé auparavant.Je suis débutant en programmation mais pas trop le temps de me mettre dedans à cause de l Tite question sur le polymorphisme [ par tibob51 ] Bonjour ma questio est simple:J'ai des classe B,C,D ect... qui dérive de A.Elle contienne toute une fonction F() sauf A.Je créé mes classe en utilisan question sur les versions de linux [ par boumarsel ] Quelle est la meilleure version de linux adaptée au developpement et aux bases de données. j'ai actuelement Mandrake 10, c'est vraiment du n'importe q | : L'opérateur mystère ... [ par anarchysniper ] Question assez stupide dont la réponse serait sans doute facile à trouver si google n'excluait pas le caractère en question des recherches. A quoi co question sur l'impression [ par enrageur ] Je programme sous Visual C++ sous MFC. J'utilise l'ActiveX  LEADTOOL. L'ActiveX me permet d'afficher des dessins de type vecteur. J'utilise pour impri


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,281 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.