From eac8359733649d7a987416d843fc2aedfbf484ba Mon Sep 17 00:00:00 2001 From: Pradheep Unnikrishnan <pradheep.unnikrishnan@etu.unistra.fr> Date: Tue, 19 Mar 2024 03:30:38 +0100 Subject: [PATCH] =?UTF-8?q?Rectification=20du=20README.md=20=C3=A0=20cause?= =?UTF-8?q?=20d'une=20mauvaise=20compr=C3=A9hension=20du=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../code_modifie/sans_organisation/README.md | 42 ++++++++----------- .../code_modifie/sans_organisation/main.c | 5 ++- .../code_modifie/sans_organisation/makefile | 2 +- 3 files changed, 21 insertions(+), 28 deletions(-) diff --git a/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/README.md b/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/README.md index 04d8573..1ef3db2 100644 --- a/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/README.md +++ b/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/README.md @@ -4,7 +4,7 @@ Dans ce TP, premièrement nous faisons une copie du TP2. Deuxièmement, nous all ## Tables des matières *** 1. Prérequis -2. Préliminaire +2. Travail Préliminaire 3. Débogage et analyse mémoire 4. Documentation 5. Archivage @@ -13,45 +13,37 @@ Dans ce TP, premièrement nous faisons une copie du TP2. Deuxièmement, nous all * Initialisation du dépôt distant tp3-outils-de-developpement-2-techdev-projet-outillage-unnikrishnanpradheep * Donnez l'accès aux proffesseurs référent @.zarella et @benjaminschmitt * Clone du dépôt tp2-compilation-techdev-projet-outillage-unnikrishnanpradheep vers un répertoire nommé TP3_SUITE_TP2_CLONE puis copie des données vers le dépôt distant tp3-outils-de-developpement-2-techdev-projet-outillage-unnikrishnanpradheep -### Préliminaire +### Travail Préliminaire *** Avant de commencer le débogage et l'analyse de la mémoire du programme, nous allons expliquer le fonctionnement du programme, son but, les arguments attendus et quelques erreurs detectées avant l'utilisation de gdb et Valgrind. * Nous possédons un fichier nommé main.c qui contient une structure tableau en plus de cinq fonctions distinctes : alea, remplir, bulle, trier, affiche et main, la fonction principale du programme. Les détails plus approfondis sur chacune des fonctions seront documentés dans le fichier doxyfile. -* Ce programme est conçu afin de réaliser le tri d'un tableau dynamique par ordre décroissante, la taille effective et maximale du tableau sont spécifiées par l'utilisateur et son remplissage s'effectue avec des nombres selectionnés aléatoirements à l'aide de la fonction aléa. -* Les arguments attendus sont la taille effective et la valeur maximale des éléments du tableau respectivement représenté par argc et argv dans la fonction principale main. -* La taille effective du tableau est donnée par la ligne de code : t.taille = atoi(argv[1]); -* La taille maximale du tableau est représenté par la ligne suivant : int m = atoi(argv[2]); -* Nous pouvons également commenter une déclaration double de 'tableau t', cette rebondance sera mis en commentaire. -* Avant d'utiliser Gdb et Valgrind, nous avons effectué quelques tests lors de l'éxécution du programme en changeant le nombre d'élément (argc) et le nombre totale (argv) du tableau dans le fichier makefile. -Nous avons testé l'éxécution du programme main dans six scénarios différents : -- (a) - lorsque argc < 3 et argv > argc Exemple : ./main 2 5 -- (b) - lorsque argc > 3 et argv > argc Exemple : ./main 5 10 -- (c) - lorsque argc > 3 et argv < argc Exemple : ./main 10 5 - (d) - lorsque argc > 3 et argv = argc Exemple : ./main 5 5 -- (d) - sans fournir aucun argument à main Exemple : ./main -- (e) - en fournissant un argument à main Exemple : ./main 10 -- Parmis ces six situations, seul les cas (b) et (d) devraient fonctionner correctement. Néanmoins les cas (a) et (c) donnent également des résulats contre l'attente d'erreurs. Le cas (d) et(e) réagissent comme attendu, en signalant une erreur due à l'absence des trois arguments requis d'après la condition 'if(argc < 3)'. -* Faire une gestion d'erreur si l'allocation mémoire a été bien réussi. -* Une autre erreur pertinente est l'omission de la libération de mémoire allouée par free - +* Ce programme est conçu afin de réaliser le tri d'un tableau dynamique par ordre décroissante; le triage peut-être également fait par ordre croissante en changeant une ligne de commande, cette explication sera donné dans le code en commentaire. Le nombre d'élément du tableau et la valeur maximale que peut prendre un nombre sont spécifiées par l'utilisateur. Le remplissage du tableau s'effectue avec des nombres selectionnés aléatoirements à l'aide de la fonction aléa. Les arguments attendus sont le nombre d'élément dans le tableau et la valeur maximale que puisse prendre un nombre respectivement définit par argc et argv. +L'éxécution du programme attend trois paramètre l'éxécutable et les deux paramètre argc et argv; dans le cas contraire nous avons un message d'erreur indiquant le nombre de paramètre à fournir. +* Le nombre maximale d'élément du tableau est donnée par la ligne de code : t.taille = atoi(argv[1]); +* La valeur maximale d'un nombre est représenté par la ligne suivant : int m = atoi(argv[2]); + +* Détection de certaines erreurs et amélioration à faire avant la procédure du débogage et de l'analyse mémoire. +1. Nous n'avons par libérer la mémoire allouer à l'aide la fonction free, ce qui peut entraîner uen fuite de mémoire. +2. Une déclaration double de 'tableau t', cette rebondance sera mis en commentaire. +3. Faire une gestion d'erreur permettant de savoir si l'allocation mémoire a été bien réussi ### Débogage et analyse mémoire *** - #### Débogage avec l'outil GDB *** * ajout de l'option -g dans la commande gcc tel que : gcc -g -o main main.c Cette option -g ajoute des informations de débogage au fichier exécutable généré, permettant à l'outil GDB d'accéder à des informaions détaillés sur le code source * Lancement de gdb avec : gdb ./main -* Mettre des breakpoints aux lignes désirées : Exemple : break 63 -* Pour éxécuter le programme, nous donnons les trois arguments attendu dans run : run main 5 10 - - +* Mettre des breakpoints aux lignes désirées : Exemple : break bulle +* Pour éxécuter le programme, nous donnons les trois arguments attendu dans run : run main 15 1000 #### Analyse mémoire avec l'outil Valgrind *** * Analyse mémoire avec Valgrind pour des arguments spécifiques: Valgrind ./main 5 10 -* Le résumé de l'utilisation la mémoire (HEAP SUMMARY) nous indique que nous avons deux allocations mémoires pour un free et une fuite de mémoire. +* Le résumé de l'utilisation la mémoire (HEAP SUMMARY) nous indique que nous avons deux allocations mémoires pour un free ce qui entrâine une fuite de mémoire. * Premièrement, nous allons initialisé t.tab à NULL par convention, deuxièmement nous créons une gestion d'erreur pour connaitre si l'allocation mémoire de t.tab a été bien faite où dans le cas contraire nous serions informer par un message d'erreur puis pour terminer nous mettons en place la libération de mémoire par free(t.tab) +### Documentation +*** + diff --git a/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/main.c b/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/main.c index a339602..3429421 100755 --- a/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/main.c +++ b/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/main.c @@ -61,9 +61,10 @@ void affiche() int main(int argc, char **argv) { + if (argc < 3) { - printf("usage : main <nb elems> <max val>\n"); + printf("usage : main <nb elems> <max val>\n"); //la valeur maximale que peut prendre une valeur return 1; } @@ -89,7 +90,7 @@ int main(int argc, char **argv) printf("tableau trié :\n"); affiche(); - // free(t.tab); //libération de la mémoire + free(t.tab); //libération de la mémoire return 0; } \ No newline at end of file diff --git a/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/makefile b/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/makefile index 2d4c878..a617e3e 100644 --- a/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/makefile +++ b/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/makefile @@ -7,7 +7,7 @@ main: main.c run: @echo "\n\033[31m--------------ÉXÉCUTION DU PROGRAMME ---------------------------------------\033[0m\n" - ./main 3 5 + ./main 15 1000 @echo "\n\033[32mProgramme éxécuté avec succès\033[0m" clean: -- GitLab