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 : Point d'arret déclenché par Windows


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 23
    Par défaut Problème : Point d'arret déclenché par Windows
    Bonjour,
    J'ai créé un programme sous VC++ 9 (MFC) et lorsque je compile j'ai une erreur avec windows qui me créé un point d'arret (débur et release)

    Voici l'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Windows a déclenché un point d'arrêt dans GestionReseau.exe.
     
    Cela peut être dû à une défaillance du tas qui indique un bogue dans GestionReseau.exe ou l'une des DLL chargées.
     
    Cela peut également être dû à l'appui sur la touche F12 lorsque GestionReseau.exe a le focus
     
    La fenêtre Sortie peut contenir des informations de diagnostic supplémentaires.
    L'erreur me renvoie vers cette partie de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #ifdef _WIN64
        return HeapAlloc(_crtheap, 0, size ? size : 1);
    #else  /* _WIN64 */
        if (__active_heap == __SYSTEM_HEAP) {
            return HeapAlloc(_crtheap, 0, size ? size : 1); //Erreur à cette ligne
        } else
        if ( __active_heap == __V6_HEAP ) {
            if (pvReturn = V6_HeapAlloc(size)) {
                return pvReturn;
            }
        }
    Cette partie de code ce trouve dans malloc.c des lib Windows

    Je vous transmet aussi mon code, l'erreur se fait à l'execution de la fonction RasSetEntryProperties apartenant à raslib32.lib: (dernières lignes)

    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
    DWORD dwDevInfo = 280 /* 128 */, 
    	dwError = 0; 
    	TCHAR szError[100]; 
    	RASENTRY RasEntry; 
    	RASDIALPARAMS RasDialParams; 
     
    	// Validate the format of a connection entry name 
    	// 
    	if (dwError = RasValidateEntryName(NULL, lpszName)) 
    	{ 
    		wsprintf(szError, _T("Nom de connexion déjà existant ou incorrect : ")_T(" Error %ld"),dwError); 
    		MessageBox(NULL,szError,_T("Creation Connexion"),MB_OK | MB_ICONWARNING); 
    		return dwError; 
    	} 
     
    	DWORD dwBufferSize = 0;
    	//RasGetEntryProperties(NULL, _T(""), NULL, &dwBufferSize, NULL, NULL) ;
     
    	// initialize the RASENTRY structure 
    	// 
    	memset(&RasEntry,0,sizeof(RASENTRY)); 
     
    	DWORD dwSize = sizeof(RasEntry);
     
    	// Retrieve the entry properties 
    	if (dwError = RasGetEntryProperties(NULL, _T(""), NULL, &dwSize, NULL, NULL))
    	{ 
    		wsprintf(szError, _T("Unable to read default entry properties.")_T(" Error %ld"),dwError); 
    		//MessageBox(NULL,szError,_T("Create Entry"),MB_OK | MB_ICONWARNING); 
    		//return dwError; 
    	}
     
     
     
    	// Fill the RASENTRY structure 
    	//
    	memset(&RasEntry, 0, dwSize);
    	_tcscpy(RasEntry.szLocalPhoneNumber, StringToChar(IP)); 
    	_tcscpy(RasEntry.szDeviceType, RASDT_Vpn); 
     
    	RasEntry.dwRedialCount = 30000;
    	RasEntry.dwRedialPause = 1;
    	RasEntry.dwSize = dwSize;
    	RasEntry.dwfOptions = RASEO_RequireMsEncryptedPw | RASEO_RequireDataEncryption | RASEO_ModemLights | RASEO_ShowDialingProgress;
    	strcpy(RasEntry.szDeviceName,lpszDeviceName);
    	RasEntry.dwAlternateOffset=(DWORD) 1; 
    	RasEntry.dwfNetProtocols = (DWORD) 4;
    	RasEntry.dwFramingProtocol=RASFP_Ppp; 
    	RasEntry.dwVpnStrategy=VS_PptpFirst;
     
     
    	// Create a new phone-book entry. 
    	if (dwError = RasSetEntryProperties(NULL, lpszName, &RasEntry,dwSize, 0, 0))
    	{ 
    		wsprintf(szError, _T("Unable to create the phone-book entry.")_T(" Error %ld"),dwError); 
    		//MessageBox(NULL,szError,_T("Create Entry"),MB_OK | MB_ICONWARNING); 
    		//LocalFree(lpDevCfg); 
    		//return dwError; 
    	}
    Merci d'avance

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    A vue de nez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memset(&RasEntry, 0, dwSize);
    Puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(RasEntry.szDeviceName,lpszDeviceName);
    Ceci m'interpelle
    Comment est défini RasEntry.szDeviceName ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 23
    Par défaut
    lpszDeviceName est un paramètre que je passe un char*

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DWORD WINAPI CNetwork::CreateRasEntry(CString IP, LPCSTR lpszName, LPWSTR lpszLogin, LPWSTR lpszPassword, LPCSTR lpszDeviceName) 
    { 
    	//PDEVCFG pDevCfg; 
    	DWORD dwDevInfo = 280 /* 128 */, 
    	dwError = 0; 
           ......

  4. #4
    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
    Mauvaise réponse.
    3DArchi te demande si RASENTRY::szDeviceName est un pointeur ou un tableau...
    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.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 23
    Par défaut
    http://msdn.microsoft.com/en-us/library/aa920252.aspx

    J'ai trouvé le pb a ma solution l'allocation mémoire de ma fonction etait mauvaise.

    RasSetEntryProperties(NULL, lpszName, &RasEntry, sizeof(RasEntry), 0, 0

    Le probleme venait du fait que j'avais calculer la taille de RasEntry puis fait des modification dessus ce qui avait changer la taille.

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Cependant, cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(RasEntry.szDeviceName,lpszDeviceName);
    reste inquiétante. Tu ne vérifies pas que szDeviceName peut contenir lpszDeviceName. Source potentielle de bug.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 23
    Par défaut
    RasEntry.szDeviceName ne prend que un LPCSTR qui est le type de lpszDeviceName.

    Je doit mal comprendre votre reponse

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Dans la doc que tu as mis en lien, je lis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TCHAR szDeviceName[ RAS_MaxDeviceName + 1 ]
    Cela veut dire que quand tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(RasEntry.szDeviceName,lpszDeviceName);
    Si strlen(lpszDeviceName)>RAS_MaxDeviceName, tu va écrire dans une zone où tu n'as pas le droit. Et tu ne fais aucune vérification par rapport à ça. C'est pour ça que je trouve le code dangereux.

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 479
    Par défaut
    Je dirais même FAUX.
    la fonction "strcpy_s" est faite pour ça.

  10. #10
    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
    Sauf que strcpy_s() n'empêchera pas un plantage, elle le garantira.

    Donc, ne pas l'utiliser sans une vérification explicite.

    Ou sinon, tronquer automatiquement en utilisant correctement strncat() à la place.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char *mystrncpy(char *dest, size_t cchDestSize, char const *src)
    {
    	if(cchDestSize==0)
    		return dest;
    	dest[0] = '\0'
    	strncat(dest, src, cchDestSize-1);
    	return dest;
    }
    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.

Discussions similaires

  1. Réponses: 0
    Dernier message: 29/10/2011, 11h27
  2. Problème de fichiers cryptés par Windows
    Par shkyo dans le forum Windows XP
    Réponses: 4
    Dernier message: 06/12/2008, 22h47
  3. Problème de point d'arret qui réapparait
    Par colorid dans le forum EDI
    Réponses: 1
    Dernier message: 29/10/2007, 18h12
  4. Problème de détection de carte tv par windows
    Par matbrun87 dans le forum Périphériques
    Réponses: 3
    Dernier message: 11/07/2006, 13h25
  5. Réponses: 4
    Dernier message: 23/07/2003, 13h07

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