logo Homepage
+  NewbieContest
|-+  Général» Général» Une expérience traumatisante
Username:
Password:
Pages: [1]
  Imprimer  
Auteur Fil de discussion: Une expérience traumatisante  (Lu 6285 fois)
The-Snake

Profil challenge

Classement : 9256/55019

Membre Junior
**
Hors ligne Hors ligne
Messages: 78


Voir le profil
« le: 15 Novembre 2008 à 13:41:48 »

Il y a quelques heures j'étais en examen de "Programmation Elementaire".

Au boûts de quelques exercices, je tombe sur un "rev_wstr" a écrire en C : du gâ-teau.
En gros, on te passe en ligne de commande :
/.rev_wstr "j'aime les pâtes"
Et tu dois renvoyer :
"pâtes les j'aime"
Quelque chose comme ça...

C'est tout con franchement. J'écris un programme en cinq fonction :
=> Je cherche le nombre de mot et j'alloue de la mémoire à un char** en fonction de ce nombre de mots.
=> Je cherche le nombre de lettres de chaque mot et j'alloue de la mémoire aux char* sur lesquels pointe le char**.
=> Je remplis le tableau avec les mots.
=> J'inverse l'ordre des mots.
=> J'imprime le tableau avec une boucle qui libère la mémoire une fois que l'élément est imprimé.

Au final je me suis retrouvé avec un code plutôt court et assez propre (on comprend le fonctionnement en un clin d'œil).

Mais qu'est-ce qui s'est passé... éh bien je n'en sais rien. Mon programme faisait des segfaults qui n'avaient AUCUN sens... et dans des cas très très précis.

Par exemple, si vous lui passez une phrase avec un nombre de mots pair, et que le mot se trouvant à la position (nombre de mots / 2) est long de plus de huit lettre, alors le programme fonctionne parfaitement, MAIS je reçoit une segfault à la sortie du main (après le return (0) du main).

Autre exemple, si vous lui passez une phrase de plus de 12 mots, et qu'avant le premier appel de la fonction putstr (une fonction qui fait une boucle de write pour afficher des chaînes de caractères), je ne fait pas au moins un appel de la fonction putchar... le programme segfault au premier appel de putstr.
Je devais donc faire un putchar(0); pour éviter cette segfault, ce qui n'a aucun sens, je ne me trompe pas ?

Toujours avec les phrases de plus de 12 mots, au premier free() se trouvant dans le code, segfault également : attention, il ne s'agit pas d'un appel de free, il s'agit juste de free() rencontré dans le code : je faisais par exemple des :
si nombre de mots < 12 alors libérer la mémoire... mais ça segfaultait quand même : par contre, si je commente le free, le programme fonctionne (il m'affiche bien la phrase à l'envers) mais une segfault à la sortie du main.

Je suis vraiment traumatisé parce que je vais me choper une mauvaise note et que je ne comprend pas du tout pourquoi...
J'ai beaucoup relu mon code est il est vraiment impeccable, j'avais de quoi être fier de moi ! Pourtant ça ne marchait pas ! J'ai cru que j'allais devenir dingue et j'ai quitté la salle deux heure avant la fin de l'examen (de toute façon, quand on a un exercice faux, les suivants ne comptent pas pour la note).

Rendez-vous compte...
Pour que mon programme marche, je devais apeller une fonction qui ne servait à rien :
putchar(0);
Je devais volontairement oublier de libérer la mémoire...
Et au lieu de terminer mon programme par return(0); je devais le terminer par exit(0); (encore que j'ai pas essayé, mais je pense que ça m'aurait évité la segfault finale)... ça n'a tellement pas de sens que j'ai quitté la salle en rendant la version defectueuse, mais avec un code sensé, logique et propre.

Qu'est-ce qui pourrait expliquer ce genre de chose ?
Ne serait-ce qu'expliquer pourquoi un programme plante après s'être terminée...
« Dernière édition: 15 Novembre 2008 à 14:10:16 par The-Snake » Journalisée
_o_
Relecteur

Profil challenge

Classement : 43/55019

Membre Héroïque
*
Hors ligne Hors ligne
Messages: 1258


Voir le profil
« #1 le: 15 Novembre 2008 à 14:44:57 »

Les jardinages mémoires sont toujours mystérieux et peuvent souvent avoir des symptômes extrêmement curieux (comme par exemple, un plantage 3 minutes après l'écrasement mémoire, ou à la fin du programme, lors des libérations).

De l'intérêt, notamment, d'utiliser toutes les capacités des compilos à détecter ce genre d'erreur en faisant afficher tous les avertissements, de ne pas caster n'importe comment les variables pour que la compilation fonctionne, enfin, d'utiliser les outils de détection de ces problèmes (valgrind, insure, pour ceux que je connais...)¹.

Bref, sans le code en question, n'espère pas avoir une réponse détaillée à ta question.

¹: bien évidemment, tous ces conseils s'appliquent à du C. D'autres langages n'ont pas cette problématique, mais en ont d'autres. Sinon, ça ne serait pas drôle.
« Dernière édition: 15 Novembre 2008 à 14:47:17 par _o_ » Journalisée

Les épreuves de hack de NC sont trop faciles ? Et pourtant ! Bienvenue dans la vraie vie : http://thedailywtf.com/Articles/So-You-Hacked-Our-Site!.aspx
lemulot

Profil challenge

Classement : 6097/55019

Néophyte
*
Hors ligne Hors ligne
Messages: 34

{EPITECH.}


Voir le profil
« #2 le: 15 Novembre 2008 à 14:54:18 »

On reconnais les gens d'Epitech 
Moi, pas de malloc ni de mots mis dans une chaine.
Juste un compteur qui va jusqu'au bout. Puis, on décrémente. au premier espace , my_putchar en incrémentent.
ensuite on reprend a l'espace ...

voila, sinon, cool encore un aff_z (4eme fois en exam  ). Pas, fait le 4 et 5.
Journalisée
The-Snake

Profil challenge

Classement : 9256/55019

Membre Junior
**
Hors ligne Hors ligne
Messages: 78


Voir le profil
« #3 le: 15 Novembre 2008 à 17:35:37 »

Sympa pour l'aff_z ^^ !

C'est pas bête comme solution j'y avais pas pensé. J'étais partis sur le principe du to_wordtab et j'ai dérivé là-dessus...
C'est bête j'aurais bien aimé faire le 5... il est pas bien sorcier et il à l'air bien tripant.
Journalisée
Pages: [1]
  Imprimer  
 
Aller à: