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++ Discussion :

Problème de "stack smashing detected"


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Problème de "stack smashing detected"
    Bonjour à tous.

    J'ai un problème assez inexpliqué, le programme s'arrete abruptement
    sur un stack smashing detected.
    M'étant renseigné, j'ai compris que ce terme signifie qu'on a écrasé une zone
    en mémoire qu'on n'aurait pas du...
    Par contre pas moyen de comprendre pourquoi mon code persiste à le faire.

    L'idée du code : Lire dans un fichier en mode binaire, deux structures
    contenant des champs de type int et short (il s'agit de fichier bitmap
    et des structures INFOHEADER et FILEHEADER, mais ca n'a pas d'importance ici).
    Pour ca pas de problème, j'ai fait un essai et ca marchait très bien !
    Mais mon code était plus du C que du C++.
    J'ai donc voulu obtenir un code plus propre, plus objet, en créant une classe BmpEnTete. Elle contient deux attributs, de type struct INFOHEADER et struct FILEHEADER. J'ai créer un constructeur qui prend en paramètre un nom de fichier, et j'ai mis dedans exactement le code que j'avais pour la lecture et qui MARCHAIT.
    Et maintenant ca foire...
    J'ai isolé le problème avec des cout, le constructeur s'exécute bien jusqu'a
    la dernière ligne, et dès qu'on "revient" dans le main, crack !

    Je ne sais pas si cela a une importance, je suis sous Linux-Ubuntu.

    Quelqu'un a une idée qui lui saute au visage ?


    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
     
    #pragma pack( push,1 ) // OBLIGATOIRE ! Empeche le compilateur d'aligner
    #include <fstream>
    #include <iostream>
    #include <cstdlib>
    #include <string>
     
    using namespace std;
     
     
    /* LA STRUCTURE DU PREMIER EN-TETE */
     
    struct BMPFILEHEADER 
    {
    	short bfType; 
    	int bfSize ;		
    	short bfReserved1 ;
    	short bfReserved2 ;
            int * bfOffBits ;
     
    };
     
     
    /* LA STRUCTURE DU SECOND EN-TETE */
    struct BMPINFOHEADER
    {
     
    	int biSize;
    	int biWidth;
    	int biHeigth;
    	short biPlanes;
    	short biBitCount;
    	int biCompression;
    	int biSizeImage;
    	int biXpelsPerMeter;
    	int biYpelsPerMeter;
    	int biClrUsed;
    	int biClrImportant;
    };
     
     
     
     
     
     
     
    class BmpEnTete
    {
    	private:
    		BMPFILEHEADER fh;
    		BMPINFOHEADER ih;
     
    	public:
     
    		BmpEnTete() {} ;		// Par défaut
     
     
    		BmpEnTete(char * nom_fichier, bool & succes) {	// A partir d'un nom de fichier
     
    			ifstream FileIn;
    			succes = true;
     
    			FileIn.open(nom_fichier, ios_base::binary);
     
    			if ( FileIn.is_open() ) {
    				FileIn.read( reinterpret_cast<char*>(&fh), sizeof(BMPFILEHEADER) );
     
    				FileIn.read( reinterpret_cast<char*>(&ih), sizeof(BMPINFOHEADER) );
     
    				/* Le nombre de caractère lus par la derniere opération est-t-il correct ? */
    				succes = ( FileIn.gcount()  == sizeof(BMPINFOHEADER) ); // Bien passé ? 
     
    				FileIn.close();
     
    			} else succes = false;
    			cout << "fin constructueur" << endl;
     
    			return;
    		}
     
     
     
    		short get_bfType() {
    			return fh.bfType;
    		}
     
    		int get_bfSize() {
    			return fh.bfSize;
    		}
     
    };
     
     
    int main(int argc, char * argv[])
    {
     
      int taille;
      bool succes;
     
      	BmpEnTete en_tete(argv[1], succes);
     
    	cout << "apres construction" << endl;
     
    	if (succes) {
    		taille = en_tete.get_bfSize();
      		cout << "taille du fichier : " << taille << endl;
    	}
      	else 	cout << "l'ouverture du fichier a échouée" ;
     
      return EXIT_SUCCESS;
    }
    Voila. Ca écrit bien "fin constructeur", puis stack truc...
    Je précise que même en commentant les lignes FileIn.read... (et le .gcount()), enfin en gros en ne gardant que l'ouverture/fermeture du fichier l'erreur reste la même. Ce n'est donc aucunement un problème lié à la lecture même dans le fichier.

  2. #2
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    D'après le code envoyé il n'y a pas de à la fin de ton fichier... Aussi il me paraitrait plus logique de placer le après les includes de tes fichiers. Je ne vois pas d'autre problème si ça ne vient pas de là...
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  3. #3
    screetch
    Invité(e)
    Par défaut
    Et si tu commentes tout le code ?
    et sais tu si ca passe par la premiere ou la deuxieme branche du if ? (le fichier a t'il ete trouvé ?)
    que vaut argv[1] ?

  4. #4
    screetch
    Invité(e)
    Par défaut
    ah oui le pragma push est global et ca ce n'est pas bon du tout! il faut le mettre seulement pour tes structures sinon tu fais de meme avec les structures de la stl

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Ca marche !
    J'étais loin de penser à ça...
    Ca marche très bien ! BitMaps gare à vous !
    Merci beaucoup !

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    AU passage, je rappelle que les BITMAPFILEHEADER sont censées être en pack 2, pas 1...

    Quant aux BITMAPINFOHEADER, elles ne sont pas packed du tout.
    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.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Pour la structure BITMAPFILEHEADER je suis daccord pour le pack 2 plutot que 1, elle ne contient en effet que des int ou des short.
    Par contre pour la structure INFOHEADER que veux tu dire par pas packed du tout ? Cette structure contient également des short et des int, mais ils sont tous alignés sur le disque. Si je veux pouvoir faire des transferts disque<->mémoire directement, je dois donc bien l'aligner sur 2 non ? Je constate que ca marche en tout cas.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Elle n'est pas entourée de pragma pack() dans les fichiers d'en-tête, donc je suppose qu'elle est alignée naturellement sur ce qui doit être 32 bits.

    On constate d'ailleurs que les deux seuls WORD sont l'un à côté de l'autre, entourés de valeurs 32 bits partout. On peut donc supposer qu'il n'y a aucun padding dans cette structure, même avec un alignement sur 32 bits.
    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.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Effectivement cela revient sans doute au même.
    Dans quels fichiers d'en-tête l'as tu aperçu ? Parce que je bosse sur les bmp en bas niveau pour un projet scolaire, et pour l'instant j'ai tout tapé en partant de rien. Je serais heureux de consulter un code extérieur.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    J'ai trouvé ces structures dans le wingdi.h du SDK Microsoft (mais elles doivent être pareilles dans celui de MinGW, à part les #pragma pack remplaçés par des __attribute__((packed)) sur les structures elles-mêmes).
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. stack smashing detected?
    Par sayanmehdi dans le forum C
    Réponses: 1
    Dernier message: 15/06/2010, 14h09
  2. stack smashing detected lors d'une lecture de fichier
    Par Dave62 dans le forum Débuter
    Réponses: 5
    Dernier message: 06/11/2009, 13h50
  3. Probléme * stack smashing detected *
    Par Mat262 dans le forum Débuter
    Réponses: 13
    Dernier message: 23/12/2008, 21h34
  4. stack smashing detected et sscanf
    Par vinzzzz dans le forum Bibliothèque standard
    Réponses: 34
    Dernier message: 03/12/2007, 16h50
  5. "stack smashing detected" encore...
    Par incal dans le forum Débuter
    Réponses: 11
    Dernier message: 01/10/2007, 17h53

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