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 confirm�
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    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 confirm�
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    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 confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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 confirm�
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    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 confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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 confirm�
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    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 confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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 confirm�
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    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 confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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