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 à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 23
    Points : 12
    Points
    12
    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
    Points : 13 017
    Points
    13 017
    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 à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 23
    Points : 12
    Points
    12
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Mauvaise réponse.
    3DArchi te demande si RASENTRY::szDeviceName est un pointeur ou un tableau...

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

    Informations forums :
    Inscription : Janvier 2008
    Messages : 23
    Points : 12
    Points
    12
    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
    Points : 13 017
    Points
    13 017
    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 à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 23
    Points : 12
    Points
    12
    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
    Points : 13 017
    Points
    13 017
    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 éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

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

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    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;
    }

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