/* IFT1166 - démonstration #6 - exercice 6 14-octobre -2005 v1.08 M.Lokbani MàJ pour A05 à partir de ex-démo01 + gcc3.4.2, +comments 15-septembre-2003 v1.07 M.Lokbani -exo3, +gcc3.2, +comments 07- mai -2000 v1.05 M.Lokbani mise à jour pour E00 08- octobre -1999 v1.04 (#3 ex.1.03) M.Lokbani commentaires supplémentaires 28-septembre-1999 v1.03 (#3 ex.1.02) P.Langlais commentaires+correction exos 2+3 26-septembre-1999 v1.02 (#3 ex.1.01) M.Lokbani exos 2+3 P.Langlais 13-septembre-1999 v1.01 (#1) M.Lokbani mise à jour des commentaires pour exo1 12-septembre-1999 v1.00 (#1) M.Lokbani écriture du programme pour exo1 contact: lokbani@iro.umontreal.ca Cette démonstration a pour but de vous donnez quelques astuces de programmation. Copyright (C) 1999-2005 Université de Montréal Département d'informatique et de Recherche Opérationnelle Mohamed Lokbani -- Tous Droits Réservés -- All Rights Reserved -- */ #include // contient les déclarations E/S #include // contient les manipulateurs de formats E/S #include // !! le string de C++ pas celui de C #include // !! le string de C pas celui de C++ #include using namespace std; struct item { char *chaine; int info; }; void AfficheTable(item *T, int nb) { static int appel = 1; cout << "Affichage " << appel++ << endl; // illustration de quelques manipulateurs de iostream (inclure iomanip) for (int i=0; ig++ -Wall -pedantic -Os -c demo06exo6sol.cpp -o demo06exo6sol.o >Exit code: 0 >g++ -o demo06exo6sol.exe demo06exo6sol.o >Exit code: 0 L'exécution du programme va produire en sortie: >demo06exo6 Affichage 1 Elt 1: Camus 1 Elt 2: Rilke 2 Elt 3: Le Clezio 3 Elt 4: >Exit code: 0 Remarquer que le programme ne part pas plus loin! L'exécution de ce programme sous Linux va provoquer une segmentation fault i.e. un accès mémoire interdit. Par l'instruction suivante, on veut afficher en sortie le 4 élément de la structure T[3].chaine << " " << T[3].info or cet élément n'a pas été initialisé .. du coup cela dépend de l'adresse pointée par cet appel qui correspond à nul part! Si c'est une adresse interdite c'est une segmentation fault, sinon ça peut-être n'importe quoi ... comme une sortie normale (exit 0) alors qu'en réalité c'est une sortie ratée. b) Membres initialisés: ----------------------- On recompile le code avec l'option ExpOk g++ -Wall -pedantic -Os -DExpOk -c demo06exo6sol.cpp -o demo06exo6sol.o On utilise ici le préprocesseur pour valider choisir l'instruction à prendre en compte lors de la compilation. >demo06exo6 Affichage 1 Elt 1: Camus 1 Elt 2: Rilke 2 Elt 3: Le Clezio 3 Elt 4: 4 Elt 5: 5 Affichage 2 Elt 1: Camus 1 Elt 2: Rilke 2 Affichage 3 Elt 1: Camus 1 Elt 2: Rilke 2 Elt 3: Le Clezio 3 Elt 4: Rilke 2 Affichage 4 Elt 1: Camus 1 Elt 2: Rilke 2 Elt 3: Le Clezio 3 Elt 4: Rilke 2 >Exit code: 0 2) Penser à l'allocation statique. On recompile le code avec les options ExpOk et Verif pour prendre en compte certaines instructions du programme g++ -Wall -pedantic -Os -DExpOk -DVerif -c demo06exo6sol.cpp -o demo06exo6sol.o Erreur cette chaîne est plus longue que Rilke ceci constitue également une maladresse dans la mesure où l'espace alloué pour Rilke n'est plus adressable (on perd son adresse) Sous Linux ---------- Affichage 1 Elt 1: Camus 1 Elt 2: Rilke 2 Elt 3: Le Clezio 3 Elt 4: 4 Elt 5: 5 Segmentation fault (core dumped) Sous Windows ------------ >demo06exo6 Affichage 1 Elt 1: Camus 1 Elt 2: Rilke 2 Elt 3: Le Clezio 3 Elt 4: 4 Elt 5: 5 >Exit code: -1073741819 (puis affichage message d'erreur dans une fenêtre) Le même problème s'est posé dans l'exercice -1- de cette démonstration 3) Ne pas surutiliser les appels! g++ -Wall -pedantic -Os -DExpOk -c demo06exo6sol.cpp -o demo06exo6sol.o free(T[1].chaine); // première libération ok free(T[3].chaine); // l'espace a déjà été libéré : c'est une erreur Sous Linux ---------- Affichage 1 Elt 1: Camus 1 Elt 2: Rilke 2 Elt 3: Le Clezio 3 Elt 4: 4 Elt 5: 5 Affichage 2 Elt 1: Camus 1 Elt 2: Rilke 2 Affichage 3 Elt 1: Camus 1 Elt 2: Rilke 2 Elt 3: Le Clezio 3 Elt 4: Rilke 2 Segmentation fault (core dumped) Sous Windows ------------ $ demo01exo2.exe Affichage 1 Elt 1: Camus 1 lt 2: Rilke 2 lt 3: Le Clezio 3 Elt 4: 4 Elt 5: 5 Affichage 2 Elt 1: Camus 1 Elt 2: Rilke 2 Affichage 3 Elt 1: Camus 1 Elt 2: Rilke 2 Elt 3: Le Clezio 3 Elt 4: Rilke 2 Affichage 4 Elt 1: Camus 1 Elt 2: Rilke 2 Elt 3: Le Clezio 3 Elt 4: Rilke 2 (puis fin affichage) Dans le cas de windows nous n'avons pas reçu le message "segmentation fault" pourtant on peut remarquer que l'affichage est eronné! Le programme n'a pas affiché le 5e élément! Le programme a rencontré une adresse "inconnue" ou qui correspond à une fin d'un programme, il a arrêté l'exécution de ce dernier sans vous donner une chance de vous rendre compte qu'il y a bien une erreur. Moralité -------- Les choses qui vous semblent inutiles, peuvent s'avérer très dangereux. LA SIMPLICTÉ ET LES IDÉES CLAIRES! Prendre la peine d'analyser sa démarche et la remettre en cause s'il le faut, même si le résultat affiché en sortie semble à priori correct. Ne compter pas sur un compilateur donné, ni sur une plateforme donnée pour vous aider dans le codage de votre programme. Ils peuvent vous envoyer sur une mauvaise piste! */