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 :

Stack around the variable was corrupted


Sujet :

C++

  1. #1
    tsp
    tsp est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    Points : 54
    Points
    54
    Par défaut Stack around the variable was corrupted
    Bonjour,
    lors de l'execution d'une fonction d'une dll que j'ai faite, j'obtiens l'erreur suivante :

    Run-Time Check Failure #2 - Stack around the variable 'ncols' was corrupted
    et cette erreur survient à la derniere ligne (sur l'accolade fermante) de la fonction suivante

    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
    bool EnvirDb::TreatHeader()
    {
    	SQLSMALLINT ncols;
    	std::string sHeader;
     
    	// get the column count 
    	this->srRetour = SQLColAttribute(this->hStmt,0,SQL_DESC_COUNT,NULL,0,NULL,&ncols);
    	if (this->srRetour != SQL_SUCCESS && this->srRetour != SQL_SUCCESS_WITH_INFO) 
    	{
    		return false;
    	}
    	sHeader = "";
     
    	// run through the columns
    	for (int i=0; i<ncols; i++) 
    	{
    		if (i != 0) 	
    		{
    			sHeader += (char)254;
    			sHeader += (char)255;
    		}
     
    	        ... // j'ai enlevé tout le code ici car il ne touche pas à ncols
    	}
    	SendMessage(this->Onglet, WM_USER+0, 1, (LPARAM)sHeader.c_str());
     
    	return true;
    }
    la fonction se déroule donc comme il faut mais c'est à sa sortie que j'obtiens l'erreur.

    A noter que ce meme code fonctionne correctement dans un programme C++ non dll.

  2. #2
    tsp
    tsp est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    Points : 54
    Points
    54
    Par défaut
    bon alors j'ai résolu mon probleme en mettant ma variable ncols en static :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static SQLSMALLINT ncols;
    si toutefois quelqu'un a une explication du phénomène, je suis preneur.

  3. #3
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 671
    Points
    10 671
    Billets dans le blog
    3
    Par défaut
    Tu n'as pas résolu l'erreur, tu as fait en sorte qu'elle ne soit plus visible.
    Ce qui se passe c'est que tu as un débordement d'écriture sur la pile. Cela peut être provoqué par une mauvaise utilisation d'une variable locale, sHeader par exemple. Passes-tu quelque part un pointeur sur sHeader ou sur ncols ? (typiquement, GetString( &sHeader )).

  4. #4
    tsp
    tsp est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    Points : 54
    Points
    54
    Par défaut
    effectivement dans la partie de code que j'ai enlevé parce qu'elle prenait trop de place, j'ai cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (!(this->AddInfo(i+1, SQL_DESC_AUTO_UNIQUE_VALUE, &sHeader, 'N'))) return false;
    une 20aine de fois pour différentes info.
    Comment dois je proceder alors ! ! reflechissons reflechissons

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 671
    Points
    10 671
    Billets dans le blog
    3
    Par défaut
    Que fait AddInfo ? Comment est-ce qu'elle manipule la string reçue ?

  6. #6
    tsp
    tsp est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    Points : 54
    Points
    54
    Par défaut
    en fait addinfo concatene un string à sHeader :

    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
    bool EnvirDb::AddInfo(SQLUSMALLINT numcol, SQLUSMALLINT info, std::string* sHeader, char cType)
    {
    	CHAR sTexte[MAX_NAME_LEN];
    	int iEntier;
    	SQLSMALLINT  col_len;
     
    	switch (cType)
    	{
             // pour des info numériques
    		case 'N' :
    			srRetour = SQLColAttribute(this->hStmt,numcol,info,NULL,0,NULL,&iEntier);
    			if (srRetour != SQL_SUCCESS && srRetour != SQL_SUCCESS_WITH_INFO) 
    			{
    				return false;
    			}
    			*sHeader += to_string(iEntier);
    			break;
     
              // pour des info textes
    		case 'T' :
    			srRetour = SQLColAttribute(this->hStmt, numcol, info, (SQLPOINTER)(&sTexte), MAX_NAME_LEN, &col_len, NULL);
    			if (srRetour != SQL_SUCCESS && srRetour != SQL_SUCCESS_WITH_INFO) 
    			{
    				return false;
    			}
    			*sHeader += to_string(sTexte);
    			break;
     
    		default: break;
    	}
     
    // ajoute un separateur apres l'info
    	*sHeader += (char)254;
    	*sHeader += (char)255;
    	return true;
    }

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 671
    Points
    10 671
    Billets dans le blog
    3
    Par défaut
    Je ne vois rien de chaquant dans l'utilisation de sHeader. Tu pourrais utiliser une référence au lieu d'un pointeur. to_string ne modifie pas la chaine reçue ?
    L'erreur que tu rencontres est typiquement produite par une fausse manip sur des buffers de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CHAR sTexte[MAX_NAME_LEN];
    genre tu te trompes dans la taille donnée (plus grande que ce qui est dispo) et la fonction écrit donc plus que MAX_NAME_LEN caractères. Et ça corromp la pile.
    Refait en sorte que le compilateur te provoque l'erreur, puis commente ton code de manière sélective jusqu'à trouver l'appel de fonction qui provoque le problème, et recommence jusqu'à trouve la ligne fautive...
    Vérifie bien toutes les tailles de buffers local etc...

  8. #8
    tsp
    tsp est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    Points : 54
    Points
    54
    Par défaut
    bon alors en fait, j'ai changé mon ncols de place pour le mettre dans une autre fonction et ça me mettait toujours cette erreur à la sortie de la nouvelle fonction. J'ai donc changé mon :

    pour un :

    et oh surprise ça marche.
    Par contre ce que je ne comprends pas trop c'est qu'avec un SQLSMALLINT ça marchait dans un programme C++ qui n'etait pas une DLL.

    Merci.

  9. #9
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 671
    Points
    10 671
    Billets dans le blog
    3
    Par défaut
    NumericAttributePtr
    [Output]
    Pointer to an integer buffer in which to return the value in the FieldIdentifier field of the ColumnNumber row of the IRD, if the field is a numeric descriptor type, such as SQL_DESC_COLUMN_LENGTH. Otherwise, the field is unused.
    il attend un entier de 32 bits = il va écrire 32 bits. Si tu lui donne une variable de 16 bits, il va écrire 16 bits de plus ailleurs, en suivant probablement. Les conséquences de ce débordement sont purement aléatoire. Donc dans ton autre programme, tu as potentiellement un bug.

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

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. Réponses: 1
    Dernier message: 08/02/2009, 11h54
  3. Réponses: 0
    Dernier message: 26/01/2009, 14h30
  4. [WAS 5]Accéder aux variables WAS
    Par thibaut dans le forum Websphere
    Réponses: 1
    Dernier message: 16/08/2006, 07h34
  5. [Génération] The dialect was not set
    Par sylvain_neus dans le forum Hibernate
    Réponses: 8
    Dernier message: 17/03/2004, 10h57

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