From b299017c8c49c92f535aed9ad29adac475bd03f6 Mon Sep 17 00:00:00 2001 From: Pradheep Unnikrishnan <pradheep.unnikrishnan@etu.unistra.fr> Date: Mon, 18 Mar 2024 07:17:00 +0100 Subject: [PATCH] Ajout d'information sur README.md + modification des erreurs dans le fichier main.c --- .../code_modifie/sans_organisation/README.md | 22 ++++++++++++++----- .../code_modifie/sans_organisation/main.c | 15 +++++++++---- .../code_modifie/sans_organisation/makefile | 4 ++-- 3 files changed, 30 insertions(+), 11 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 f5359e7..04d8573 100644 --- a/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/README.md +++ b/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/README.md @@ -19,26 +19,38 @@ Avant de commencer le débogage et l'analyse de la mémoire du programme, nous a * 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 quatre scénarios différents : +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 -- Parmis ces quatres situations, seul le cas (b) devrait fonctionner correctement. Néanmoins les cas (a) et (c) donnent également des résulats contre l'attente d'erreurs. Le cas (d) réagit comme attendu, en signalant une erreur due à l'absence des deux arguments requis. -* Nous pouvons également commenter une déclaration double de 'tableau t', cette rebondance sera mis en commentaire. -* Une autre erreur pertinente est l'omission de la libération de mémoire allouée par free. +- (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 + ### 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 #### 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. +* 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) 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 2a18a84..a339602 100755 --- a/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/main.c +++ b/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/main.c @@ -26,10 +26,11 @@ void remplir(int m) void bulle(int k) { int i = 0; - for (i = 0; i <= k; i++) + for (i = 0; i < k; i++) //Pour éviter d'accéder hors du tableau, la boucle dans bulle ne doit pas permettre que 'i + 1' dépasse k. Donc i < k dans la condition du boucle for. { - if (t.tab[i + 1] > t.tab[i]) - { // echange de t[i] et t[i+1] + // Condition pour un tri décroissant, pour un tri croissant inversé la condition t.tab[i] > t.tab[i + 1]) + if (t.tab[i + 1] > t.tab[i]) + { int tmp = t.tab[i + 1]; t.tab[i + 1] = t.tab[i]; t.tab[i] = tmp; @@ -71,8 +72,12 @@ int main(int argc, char **argv) int m = atoi(argv[2]); // lecture du 2eme argument - t.tab = 0; // initialisation du pointeur + t.tab = NULL; // initialisation du pointeur t.tab = (int *)malloc(t.taille * sizeof(int)); // allocation du tableau + if(t.tab == NULL) { + fprintf(stderr, "Erreur d'allocation de la mémoire\n"); + exit(EXIT_FAILURE); + } remplir(m); // remplissage aléatoire du tableau @@ -84,5 +89,7 @@ int main(int argc, char **argv) printf("tableau trié :\n"); affiche(); + // 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 4795d94..2d4c878 100644 --- a/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/makefile +++ b/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/makefile @@ -1,4 +1,4 @@ -all: main run clean +all: main run main: main.c @echo "\n\033[31m--------------COMPILATION DU PROGRAMME -------------------------------------\033[0m\n" @@ -7,7 +7,7 @@ main: main.c run: @echo "\n\033[31m--------------ÉXÉCUTION DU PROGRAMME ---------------------------------------\033[0m\n" - ./main 5 10 + ./main 3 5 @echo "\n\033[32mProgramme éxécuté avec succès\033[0m" clean: -- GitLab