IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

sha512 Run-Time Check Failure #2 - Stack around the variable 'mdString' was corrupted.


Sujet :

C++/CLI

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Avatar de lionceau
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 148
    Par défaut sha512 Run-Time Check Failure #2 - Stack around the variable 'mdString' was corrupted.
    Nom : capt.jpg
Affichages : 793
Taille : 47,6 Ko
    Bonjour j'ai un fichier que je veux hash , il compile et fonctionne , j'ai bien un hash mais il se termine avec une erreur compréhensible , avez vous svp une idée ?

    l'erreur :
    Run-Time Check Failure #2 - Stack around the variable 'mdString' was corrupted.

    le .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    #ifndef HASHFILE_H
    #define HASHFILE_H
     
    #include <stdio.h>
    #include <string.h>
    #include <windows.h>
    #include <openssl/sha.h>
    #include <iostream>
    #include <fstream>
    #include <sstream>
     
    #ifndef SIZE_STRING
    #define SIZE_STRING 20
    #endif
     
    namespace ToolLib {\
    
    /////////////////////////////////////////////////////////////////////////////////////////
    //! Manages a HashFile.
    /////////////////////////////////////////////////////////////////////////////////////////
    class HashFile
    {
    public:
       HashFile();
     	HashFile(std::string nameFile, std::string nameHash);
       virtual ~HashFile();
     
       char* generateHash(char* path);
       char* generateHash(std::ifstream myFile);
       char* generateHash();
    //   bool checkHash(std::ifstream myFile, char* myHash);
       bool checkHash(std::string myFile, std::string myHash);
     
       // Getter & Setter
       void setm_File(std::string file);
       std::string getm_File();
       void setm_FileHash(std::string fileHash);
       std::string getm_FileHash();
     
    private:
    	std::string m_File  ;      // name of the file to do the integrity 
    	std::string m_FileHash  ;  // name of the file who contain the hash of m_file
    }; 
    }
    #endif




    la fonction qui lance l erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    char* HashFile::generateHash() 
    {
     
       if( NULL != m_File.c_str() )
       {
          std::ofstream fileHash( m_FileHash.c_str(), ofstream::out|ofstream::trunc );
          std::ifstream file( m_File.c_str() );
          unsigned char digest[SHA512_DIGEST_LENGTH];
          char mdString[(SHA512_DIGEST_LENGTH * 2)+1 ];
          std::stringstream buffer; // variable qui contient tout le fichier
     
    		if( file.is_open() && fileHash.is_open() )
    		{			
    			buffer << file.rdbuf();
    			SHA512_CTX ctx;
    			SHA512_Init( &ctx );
    			SHA512_Update( &ctx, buffer.str().c_str(), strlen(buffer.str().c_str()) );
    			SHA512_Final(digest, &ctx);
     
    			for(int i = 0; i < SHA512_DIGEST_LENGTH; i++)
    			{
                sprintf_s(&mdString[i*2],sizeof(&mdString[i*2]), "%02x", (unsigned int)digest[i]);
    			}
            // mdString="ed f  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaaaaaaaaaaaaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
     
    			fileHash << mdString;
    			printf_s("---SHA512 digest de \"%s\" : %s\n", m_File.c_str(), mdString);
    		}
     
          if( file.is_open() )
    		{
    			file.close();
    		}
     
    		if( fileHash.is_open() )
    		{
    			fileHash.close();
    		}
     
    		//system("pause"); //[test]
    		//effacement du contenu des variables
    		//strcpy_s( mdString, sizeof(mdString), "" );
    		buffer.clear();
     
          printf_s("-SHA512 digest de \"%s\" : %s\n", m_File.c_str(), mdString);
          return mdString;
    	}
    	else
    	{
    		printf_s( "\n\n Merci de mettre comme argument un fichier\n\n" );
          return 0;
    	}
    }


    le main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #include <stdio.h>
    #include <string.h>
    #include <windows.h>
    #include <openssl/sha.h>
    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include "HashFile.h"
     
    using namespace std;
     
     
    int main(int argc, char * argv[])
    {
     
       ToolLib::HashFile * ClassHashFile = new ToolLib::HashFile("test6.txt", "sha512test.txt");
       ClassHashFile->setm_File("test6.txt");
       ClassHashFile->setm_FileHash("sha512test.txt");
       printf_s("Le SHA512 digest de \"%s\" : %s\n", ClassHashFile->getm_File(), ClassHashFile->generateHash());
       delete ClassHashFile;
     
     
       return 0;
    }

    Merci pour vos conseils et aides.


    l

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Avant d'avoir un plantage à l'exécution, le compilateur t'a certainement indiqué des "warnings" à la compilation. Il faut les lire et les corriger.
    L'erreur à l'exécution t'indique qu'à un moment tu as écris dans une zone où tu n'aurais dû. Une écriture dans un buffer a dû déborder.
    En C++, on évite les pointeurs "nus" car ils sont sources de problèmes de corruption mémoire, c'est ce qui se passe ici.

  3. #3
    Membre très actif
    Avatar de lionceau
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 148
    Par défaut
    Bonjour , Merci pour ta réponse , qu'est ce que tu entends par les pointeurs nuls ?
    Tu veux dire que je fasse ceci pour initialiser mdString ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char mdString = malloc([(SHA512_DIGEST_LENGTH * 2)+1 ]*sizeof(char ));

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Citation Envoyé par lionceau Voir le message
    qu'est ce que tu entends par les pointeurs nuls ?
    Tu veux dire que je fasse ceci pour initialiser mdString ?
    char mdString = malloc([(SHA512_DIGEST_LENGTH * 2)+1 ]*sizeof(char ));
    malloc() c'est du C, il n'existe aucune raison de l'utiliser en C++.

    La fonction generateHash() retourne un char*; C'est là le problème. Ce qu'elle retourne doit pointer quelque part. Ou bien ce quelque part existe avant la fonction et on le pointe, ou bien il doit être alloué dynamiquement par new[] (surtout pas avec malloc()). Et dans ce dernier cas se poserait le problème de qui est responsable de la libération par delete[].
    Ton code retourne un pointeur sur mdString[], donc un quelque part détruit à la sortie de la fonction, pas bon du tout. Seconde possibilité, ton malloc(), un peu mieux. Troisième possibilité, faire un new[], c'est du C++ mais il y a risque d'oubli de libérer. Quatrième possibilité, ne pas retourner un simple pointeur char*.
    La mdString, comme son nom l'indique, est une chaîne de caractères. Il faut que la fonction generateHash() retourne une std::string, et donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      std::string mdString(SHA512_DIGEST_LENGTH*2,' ');
      char* bufInStr = const_cast<char*>(mdString.data()); // on peut ecrire dans une string 
      for ( int i = 0 ; i < SHA512_DIGEST_LENGTH ; i++ ) {
          // mais le caractere \0 ne doit jamais etre mis dans une std::string
          // on ne peut donc pas utiliser la fonction C sprintf_s()
          bufInStr[i*2] = "0123456789abcdef"[15 & (digest[i]>>4)];
          bufInStr[i*2+1] = "0123456789abcdef"[15 & digest[i]];
      }
      return mdString;

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu devrais peut-être utiliser &mdString[0] plutôt qu'un const_cast.
    (et en C++98, j'utiliserais plutôt un vecteur de char que je convertirais en string à la fin).
    Edit: En fait, dans le cas présent je ne vois même pas pourquoi j'utiliserais un pointeur plutôt qu'accéder directement aux caractères via l'opérateur crochet; normalement ça devrait être inliné au point de se comporter comme le pointeur...

    PS: Ceci est du C++ normal, pas du C++/CLI.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre très actif
    Avatar de lionceau
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 148
    Par défaut
    Bonjour,

    dalfab > J'ai testé , ca fonctionne , merci .
    J'ai une question :
    A quoi correspond ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bufInStr[i*2] = "0123456789abcdef"[15 & (digest[i]>>4)];

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    J'y suis allé un peu fort dans l'opacité sur cette ligne, si je l'écris en plusieurs, cela devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    const char tabCaractHexa[] = "0123456789abcdef";
    int valeurAConvertir = digest[i];
    int premier = (valeurAConvertir >> 4) & 0xF; // partie 'haute' de l'octet
    int second  = valeurAConvertir & 0xF;        // partie basse -> unité en base 16
    bufInStr[i*2]   = tabCaractHexa[premier];    // conversion 0 à 15 en '0' à 'F'
    bufInStr[i*2+1] = tabCaractHexa[second];     // conversion 0 à 15 en '0' à 'F'
    Il doit y avoir plus simple

Discussions similaires

  1. Stack around the variable 'R12' was corrupted.
    Par Marty MacFly dans le forum Débuter
    Réponses: 5
    Dernier message: 20/06/2011, 09h40
  2. Run-Time Check Failure : Stack corrupted
    Par melleb dans le forum C++
    Réponses: 19
    Dernier message: 10/06/2009, 16h08
  3. Réponses: 1
    Dernier message: 08/02/2009, 11h54
  4. Stack corrupted - Run-Time Check Failure
    Par poukill dans le forum C++
    Réponses: 2
    Dernier message: 16/07/2008, 23h31
  5. Run-Time Check Failure #2
    Par -Mod- dans le forum DirectX
    Réponses: 5
    Dernier message: 10/08/2006, 08h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo