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 :

c_str() cause d'un BUG?!


Sujet :

C++

  1. #1
    Membre éclairé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par défaut c_str() cause d'un BUG?!
    Voila, je poste car j'ai un problème avec l'utilisation de la fonction c_str()
    J'utilise une DLL que je charge de manière dynamique.

    Si je fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    unsigned int VFS_Controler::OpenVFS(std::string path, std::string mode)
    {
    	path.c_str();
    	path.c_str();
    	return _OpenVFS_Ptr("hhhh", "jjj");
    }
    J'obtiens un joli plantage de windows "Ce programme a rencontrer un problème et doit fermer"...

    Mais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    unsigned int VFS_Controler::OpenVFS(std::string path, std::string mode)
    {
    	path.c_str();
    	return _OpenVFS_Ptr("hhhh", "jjj");
    }
    Mais ceci fonctionne...

    Pour résumer, un appelle à c_str() ca passe, mais plus ça casse.
    Seulement, je ne voit pas la différence entre effectuer deux appelles ou un seul...

    C'est assé embêtent puisque je veut utiliser path et mode comme paramètre de ma fonction :/
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Ca te sert à quoi de faire un appel à c_str() dans le vide sans récupérer le résultat?

  3. #3
    Membre éclairé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par défaut
    Code minimale pour reproduire le bug...
    Que je l'appelle dans le vide, dans la fonction, ou bien que je récupère le résultat pour le passer à la fonction, ca plante toujours (au moment de l'appelle de la fonction celons le débugger)
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    A priori, le bug vient d'ailleurs....
    C'est juste révélé ici à cause d'un coup de malchance.

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Le programme principal et la DLL sont bien compilés avec le même compilateur, les mêmes options de compilation ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre éclairé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par défaut
    Citation Envoyé par JolyLoic
    Le programme principal et la DLL sont bien compilés avec le même compilateur, les mêmes options de compilation ?
    A mon avi il y à très peut de chance que se soit le cas :/
    Les noms de fonction dans la DLL sont décorer sous la forme d'un _, du nom de la fonction puis @<nombre d'octée des paramètres>
    Et je doit me débrouiller avec ça pour faire fonctionner mon programme ^^

    Je pense que quelque chose dans le pointeur de fonction est incorrecte et qu'il doit rester/manquer quelque chose sur la pile après l'appelle de la fonction. (ce qui cause une erreur durant les destruction des std::string ?)

    Bon, voila ce que me sort mon debuguer :

    Sans apelle à c_str()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    0x40479d	mov    0x8(%ebp),%edx
    0x4047a0	movl   $0x4453cc,0x4(%esp)
    0x4047a8	mov    %eax,(%esp)
    0x4047ab	mov    0x4(%edx),%eax
    0x4047ae	call   *%eax
    0x4047b0	leave
    0x4047b1	ret
    Apprès un seul apelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    0x404792	mov    0x8(%ebp),%eax
    0x404795	movl   $0x4453cc,0x4(%esp)
    0x40479d	movl   $0x4453cf,(%esp)
    0x4047a4	mov    0x4(%eax),%eax
    0x4047a7	call   *%eax
    0x4047a9	leave
    0x4047aa	ret
    Après 2 apelle (voire plus)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    0x4047ac	mov    0x8(%ebp),%edx
    0x4047af	mov    %esi,0x4(%esp)
    0x4047b3	mov    %eax,(%esp)
    0x4047b6	mov    0x4(%edx),%eax
    0x4047b9	call   *%eax
    0x4047bb	add    $0x10,%esp
    0x4047be	pop    %ebx
    0x4047bf	pop    %esi
    0x4047c0	pop    %ebp
    0x4047c1	ret
    Pourquoi ces 3 pop qui me semblent être la cause de ce problème?! O_o
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  7. #7
    Membre éclairé

    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Par défaut
    Citation Envoyé par JC_Master
    A mon avi il y à très peut de chance que se soit le cas :/
    Le probleme doit venir de là. L'implementation de std::string (de toute la bibliothèque standard d'ailleurs) peut être differente de compilateur en compilateur, parfois même d'une version à l'autre d'un même compilateur.

    Il suffit que dans le même programme tu ais du code qui touche à une autre implementation de la bibliothèque standard, et c'est le dawa complet. Il faut qu'entre les modules du programme, il y ai une interface le plus bas niveau possible (des char * par exemple).

    Voir C++ Coding Standards par exemple, chapitre 63 : Use sufficiently portable types in a module's interface.

  8. #8
    Membre éclairé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par défaut
    Ok, le problème semble disparaître complètement si je ne compile plus en mode débug mais en realise (J'utilise GCC comme compilo)

    Donc rien à voire avec std::string mais plutôt avec le debugueur ^^' (Si il y a un forum plus adapter, peut-être déplacer le sujet?)

    Edit:
    Citation Envoyé par Aszarsha
    Le probleme doit venir de là. L'implementation de std::string (de toute la bibliothèque standard d'ailleurs) peut être differente de compilateur en compilateur, parfois même d'une version à l'autre d'un même compilateur.

    Il suffit que dans le même programme tu ais du code qui touche à une autre implementation de la bibliothèque standard, et c'est le dawa complet. Il faut qu'entre les modules du programme, il y ai une interface le plus bas niveau possible (des char * par exemple).

    Voir C++ Coding Standards par exemple, chapitre 63 : Use sufficiently portable types in a module's interface.
    Oui mais je l'envoi pas des std::string a ma fonction, j'envoie des const char* et des char*... En plus il ne me semble pas que la DLL emploi la STL.

    En plus il y a aussi un problème du même genre, cette fois l'or de la suppression d'un char** après l'appelle a une des fonctions de la DLL :/

    Je pense que la fonction doit laisser trainer quelque chose sur la pile / prendre quelque chose qui n'y était pas, mais je ne voit pas trop comment savoir comment et encore moins comment corriger le problème.(J'ai vu que le programme compiler en réalise ne plantais plus avec la plus part des fonctions si je changeais le type de retour de uint32_t en uint64_t mais là ce n'est plus vraiment au niveau du c++ :s)
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/08/2008, 11h37
  2. Réponses: 13
    Dernier message: 24/04/2007, 10h50
  3. [insert][bug] cause inconnue
    Par bakonu dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 15/12/2006, 16h02
  4. Recherche fausse select à cause bug ie des div
    Par laurent_h dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 05/05/2006, 00h07
  5. [VB6]Bug dont je ne vois pas la cause.
    Par méphistopheles dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 14/02/2006, 14h22

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