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 :

Segmentation fault lié à un cast


Sujet :

C++

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 217
    Par défaut Segmentation fault lié à un cast
    Bonjour,

    Je suis en train de peaufiner un crypteur par courbe elliptique en mettant dans celui-ci un ... crackeur . C'est un crackage par force brute (de toute façon on peut pas faire mieux ). Pour améliorer la vitesse de crackage j'ai eu l'idée d'utiliser plusieurs threads ce qui distribue les calculs sur les coeurs du processeur (autant que ça tourne à 100%).

    Le problème, c'est que ça plante: un bel segmentation fault dans les règles de l'art du crash.

    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
     
    template<typename T>
    class InfoPackage
    {
        public:
     
            InfoPackage(){}
            InfoPackage(Cracker<T>* cracker, User<T>* user, User<T>* connectedUser, int offset, int iterateBy):
             m_cracker(cracker),
             m_user(user),
             m_connectedUser(connectedUser),
             m_offset(offset),
             m_iterateBy(iterateBy)
            {}
     
            Cracker<T>* m_cracker;
            User<T>* m_user;
            User<T>* m_connectedUser;
            int m_offset;
            int m_iterateBy;
    };
     
    template<typename T>
    void* CrackKey(void* infos)
    {
        InfoPackage<T> informations = *(static_cast<InfoPackage<T>*>(infos));
        Cracker<T>* cracker = informations.m_cracker;
        std::pair<T,T> point = cracker->m_connections[informations.m_user].m_refPoint;
        std::pair<T,T> researchedPoint = informations.m_user->GetComputedPoint(informations.m_connectedUser);
        EllipticCurve<T> curve = cracker->m_connections[informations.m_user].m_curve;
     
        for(long long i = informations.m_offset;; i+= informations.m_iterateBy)
        {
            cracker->m_mutex.Lock();
            if(cracker->keyA != 0)
            {
                cracker->m_mutex.UnLock();
                break;
            }
     
            if(curve.QuickExponentiation(i, point) == researchedPoint)
            {
                cracker->keyA = i;
                break;
                cracker->m_mutex.UnLock();
                return (void*)0;
            }
        }
    }
    Ce n'est pas du aux boucles mais aux opérations précédentes.

    Voila, si vous pouviez m'aider.
    Merci.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Par défaut
    Aller ,
    Je vais m'engager sur ce post qui me semble de haute volée.

    InfoPackage<T> devrait avoir un constructeur par recopie à cause de
    l'initialisation faite dans le bout de code contenant le static_cast.
    Le static_cast, lorsqu'il ne génère pas d'exception, ne renvoi pas de pointeur NULL.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 217
    Par défaut
    Je ne comprends pas la nécessité d'un constructeur de copie, car je dois conserver un pointeur sur le "Cracker" et les "User" surveillés. Si vous pouviez me donner des explications (et qu'est-ce qu'il doit faire ce constructeur).

    ps: Arf, c'est pas pour moi, mais pour mon grand frère que je fais ça


    second EDIT: après avoir changé le cast dans un autre bout de code (celui gérant les threads win) d'un dynamic_cast vers un static_cast, ça ne plante plus avec le constructeur de copie.

    ps ps : C'est normal que mon processeur (un double core) ne fonctionne qu'à 50% et que seulement deux threads soient détectés par win?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Par défaut
    Citation Envoyé par khazna Voir le message
    Je ne comprends pas la nécessité d'un constructeur de copie, car je dois conserver un pointeur sur le "Cracker" et les "User" surveillés. Si vous pouviez me donner des explications (et qu'est-ce qu'il doit faire ce constructeur).
    Ce constructeur permettra de s'assurer que les données, en particulier les ponsteurs, sont bien copié. La menace ici est d'éviter que les membres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Cracker<T>* m_cracker;
    User<T>* m_user;
    pointent sur un zone de infos qui n'est peut-être pas disponible.


    Citation Envoyé par khazna Voir le message
    second EDIT: après avoir changé le cast dans un autre bout de code (celui gérant les threads win) d'un dynamic_cast vers un static_cast, ça ne plante plus avec le constructeur de copie.
    Bizzard, le dynamic_cast est pourtant plus sûr que le static_cast.

  5. #5
    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
    Il est possible qu'en fait, ça fasse un comportement pire que le plantage, si le "plantage" était une exception levée par dynamic_cast<> ou un déréférencement de pointeur nul...
    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. Pb segmentation fault avec glutinit()
    Par pipistrelle dans le forum GLUT
    Réponses: 2
    Dernier message: 17/11/2004, 23h17
  2. [SDL_Image] Img_Load : segmentation fault ....
    Par Mathieu.J dans le forum OpenGL
    Réponses: 6
    Dernier message: 19/10/2004, 23h52
  3. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/09/2004, 06h05
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

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