From ed5002472d28258f34db0c56bda18a716f40b892 Mon Sep 17 00:00:00 2001 From: Mylloon Date: Sat, 25 Dec 2021 13:44:40 +0100 Subject: [PATCH] Use Buffer + fixing overflow issue --- arbre.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/arbre.c b/arbre.c index d6e68f1..4ab172e 100644 --- a/arbre.c +++ b/arbre.c @@ -114,14 +114,19 @@ void enteteVersFichier(Entete *enteteListe, int nombreLettresDansFichier, int lo void huffmanVersFichier(FILE *entree, FILE *sortie, Entete *enteteListe, int nombreLettresDansFichier) { int buffer = 0, tailleBufferActuelle = 0, sizeOfInt = sizeof(int) * 8; // *8 car "long unsigned int" d'après GCC - char lettre = 'a'; // initalisation pour éviter un warning - while (lettre != EOF) { + char lettre = 'a'; // initialisation pour éviter un warning + while (lettre != EOF) { // on parcours le fichier lettre = fgetc(entree); Entete entete = recuperationLettre(lettre, enteteListe, nombreLettresDansFichier); // rappel: entete représente une liste de caractères if (tailleBufferActuelle + entete.longueur >= sizeOfInt) { // écriture dans le fichier // Modification du buffer int aAjouter = sizeOfInt - tailleBufferActuelle; - buffer <<= aAjouter; + if (aAjouter < 32) + buffer <<= aAjouter; // décalage vers la gauche + else { // évite un overflow (https://gcc.gnu.org/onlinedocs/gcc/Static-Analyzer-Options.html#index-Wanalyzer-shift-count-overflow) + printf("Déplacement de bits trop important (aAjouter >=32 [=%d])", aAjouter); + exit(1); + } // Ajout de la lettre int tmp = entete.code >> (entete.longueur - aAjouter); @@ -133,6 +138,10 @@ void huffmanVersFichier(FILE *entree, FILE *sortie, Entete *enteteListe, int nom buffer = 0, tailleBufferActuelle = 0; // reset du buffer } + // Mise à jour du buffer + tailleBufferActuelle += entete.longueur; + buffer <<= entete.longueur; // décalage vers la gauche + buffer |= entete.code; } if (tailleBufferActuelle > 0) { buffer <<= sizeOfInt - tailleBufferActuelle; // décalage vers la gauche