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 :

Analyse de code C++


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 109
    Par défaut Analyse de code C++
    Bonjoru tout le monde,

    Je suis actuellement sur un projet d'analyse de code C++.
    En gros, il me faut créer une appli en C++ qui recherche l'ensemble des requetes SQL qui peuvent être créer dynamiquement dans une autre appli C++.

    Dans ce contexte j'aimerais trouver une méthode, un outils ou même une idée pour me permettre de rechercher l'ensemble des méthodes qui font appel à une autre méthode, exemple:

    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
    void Toto::Select(char* mesTables, char* mesWhere)
    {
      int     nStatus;                   // statut retour oracle
      char    maRequete[LGMAX_REQUETE];   // requete a executer
      int nbLigne;
    
      strcpy(maRequete, "SELECT nom_des_champs a ramener FROM ");
      strcat(maRequete, mesTables);
      strcat(maRequete, " WHERE ");
      strcat(maRequete, mesWhere);
     
      nStatus = Open(maRequete);
      oErreur.Verifier(__FILE, "SelectRowid", OPE, maRequete, "res", 1, nStatus);
      nStatus = Nombre(nLigne);
      oErreur.Verifier(__FILE, "SelectNombre", SEL, maRequete, "res", 1, nStatus);
      nStatus = Close();
      m_nNbLigne = 0;
     
    }
    Dans cette méthode, on voit qu'il y a un appel à Open, j'aimerais donc qu'en passant en paramètre ( à une méthode ou un outils ) Open, on me ressorte Toto::Select.

    Merci de votre aide je suis assez embêter là.

  2. #2
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Salut, j'ai plusieurs questions car pour moi y apleins de choses confuses.

    1. Quand tu parles d'un projet, tu parles d'un devoir à rendre?
    2. Quand tu parles d'une autre application, tu parles d'une lib externe? Si oui, tu dois en utiliser une en particulier (si il s'agit d'un devoir) ou tu cherches des idées? J'ai pas compris si tu en cherchais une ou si tu cherchais comment l'utiliser.
    3. Quand tu fais "open(requete)", tu voudrais qu'il se passe quoi au juste?
    4. Qu'est ce que tu veux dire quand tu écris "on me ressorte Toto::Select."?

    Petite remarque au passage, tu fais du C++, oublie les char*, strcpy, strcat et compagnie, utilises des std::string .

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 109
    Par défaut
    Ok alors je vais préciser quelques trucs ^^ :

    1. Quand je dis projet c'est un projet d'entreprise, je ne suis plus étudiant.
    2. On me demande de créer une appli complète (un projet) qui me permette d'analyser du code d'une autre application C/C++ (que je ne connais pas du tout).
    3. Je veux rien c'est un exemple de code que je dois analyser.
    4. Je cherche un outils, une méthode, un trucs... qui me permette de ressortir l'ensemble des méthodes qui font appel à une autre dont j'aurai passé le nom en paramètre.

    Donc si j'utilise un outils et que je veux obtenir l'ensemble des méthodes qui utilise la méthode Open, j'obtiendrais Toto::Select.

    Je ne mis connait pas du tout en C/C++ mais j'apprends petit à petit.
    Merci de ton aide

  4. #4
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    868
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 868
    Par défaut
    La fonction "recherche" de quasiment tous les éditeurs de texte ne te convient pas ? Avec la quasi-totalité des IDE actuels tu pourrais t'en sortir assez facilement.

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Linux possede ltrace (et son frere strace) pour tracer les appels a une lib.

    il doit y avoir un équivalent sous windows, mais je n'ai pas cherché

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 109
    Par défaut
    Imperio, je cherche un outils utilisable dans une appli pour pouvoir traiter le résultat directement.

    leternel, je vais regarder ce que je trouve à ce propos, il faudrai pouvoir écrire le résultat dans un fichier pour pouvoir l'analyser ensuite.

  7. #7
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Ah OK je comprends mieux à présent, tu cherches un profiler.
    Regarde une fois GNU gprof:

    http://sourceware.org/binutils/docs-...rof/index.html

    C'est un profiler de code qui te pemet par exemple de savoir combien de fois une fonction est appelée, combien de temps elle a consommé, ... .
    Je crois que tu peux faire un graphe des appels de fonctions, à voir, faudra étudier la doc.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 109
    Par défaut
    Alors un autre trucs que j'ai homis de précisé :

    Je travaille sous Windows.
    Je cherche à récupérer ces informations sans lancer l'appli dont le code est analysé. Il me semble que ce que vous me proposé là permet de travailler pendant l'exécution du code (si je me trompe il faut me le dire).

    Merci pour vos réponses.

  9. #9
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    sans lancer l'application?

    alors oriente-toi soit vers un bon écran et une paire d'yeux neufs, soit vers un analyseur syntaxique customisé.

    Puisque tu as les sources de l'application, wingrep va te servir.
    ltrace permet d'espionner une application pendant son exécution.

  10. #10
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par roulian46 Voir le message
    Ok alors je vais préciser quelques trucs ^^ :

    1. Quand je dis projet c'est un projet d'entreprise, je ne suis plus étudiant.
    2. On me demande de créer une appli complète (un projet) qui me permette d'analyser du code d'une autre application C/C++ (que je ne connais pas du tout).
    3. Je veux rien c'est un exemple de code que je dois analyser.
    4. Je cherche un outils, une méthode, un trucs... qui me permette de ressortir l'ensemble des méthodes qui font appel à une autre dont j'aurai passé le nom en paramètre.

    Donc si j'utilise un outils et que je veux obtenir l'ensemble des méthodes qui utilise la méthode Open, j'obtiendrais Toto::Select.

    Je ne mis connait pas du tout en C/C++ mais j'apprends petit à petit.
    Merci de ton aide
    Ca me fait penser a la fonction recherche de Visual Assist, un plugin de Visual Studio. Tu selectionnes une methode et tu fais find references et il te sort tous les appels a cette methode partout dans ton code.
    Il y a une version demo pour tester.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 109
    Par défaut
    Peut-on lancer cette fonction en mode ligne de commande?

  12. #12
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Non, il faut avoir dans une base de donnees la description du programme, ses options de compilation... Tout ca ne peut etre fait que dans un IDE de maniere propre.
    Tu es sous Windows, donc tu dois avoir un projet Visual Studio ? Tu installes le plugin et tu testes sur le projet

    Ou alors tu te fracasse un outil qui analyse ton code, ecrit toutes les references dans une base de donnees... ca devrait de prendre pas plus de 3 ou 4 ans de faire un outil sur mesure...

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 109
    Par défaut
    Le problème c'est que récupérer les différents appels de méthode est simplement une partie de mon appli, pas le souhait final de mon client sinon ça serait trop facile.
    Il me faut récupérer les appels de méthode pour ensuite analyser ces méthodes et ainsi de suite jusqu'à obtenir une requête SQL complète.

  14. #14
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Alors bon courage, c'est juste un chantier titanesque qui t'attend. On pourrait imaginer passer par des grep, mais tu auras beaucoup de faux positifs.
    Peut-etre que libclang pourra t'aider a verifier si un appel est bien sur un objet du type que tu veux ?

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 109
    Par défaut
    Bon si j'ai bien comrpsi je suis dnas la m...e.
    J'ai trouvé CSCope qui à l'air de faire presque ce que je veux sauf qu'il vérifie pas de quelle classe vient la méthode.
    CàDire que si plusieurs classes on la même méthode, il me les remonte toutes les 2...

  16. #16
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par roulian46 Voir le message
    Bon si j'ai bien comrpsi je suis dnas la m...e.
    J'ai trouvé CSCope qui à l'air de faire presque ce que je veux sauf qu'il vérifie pas de quelle classe vient la méthode.
    CàDire que si plusieurs classes on la même méthode, il me les remonte toutes les 2...
    Normal (grosso modo, c'est un grep), il faut une analyse complete du code pour voir d'ou l'objet vient. C'est front-end de compilateur qu'il faut...

  17. #17
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    J'ai du mal à suivre, tu veux pas faire un profiling du code mais juste parser des fichiers textes (tes fichiers sources)?

    Si c'est le cas, j'irai dans le sens de leternel en disant qu'il va falloir te mettre à lex & yacc.

  18. #18
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Non, il faut avoir dans une base de donnees la description du programme, ses options de compilation... Tout ca ne peut etre fait que dans un IDE de maniere propre.
    Tu es sous Windows, donc tu dois avoir un projet Visual Studio ? Tu installes le plugin et tu testes sur le projet

    Ou alors tu te fracasse un outil qui analyse ton code, ecrit toutes les references dans une base de donnees... ca devrait de prendre pas plus de 3 ou 4 ans de faire un outil sur mesure...
    Il y a peut-être la possibilité d'utiliser LLVM pour construire l'AST du programme, et ensuite récupérer les appels qui vont bien. L'interface de LLVM n'est pas si compliquée que ça, et son utilisation devrait permettre un certain gain de productivité.

    Après, je ne l'ai pas encore utilisé donc je ne vais pas m'avancer sur la difficulté du travail. Ceci dit, les tutoriaux trouvés ici et là sur le web me semblent abordables.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  19. #19
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Il y a peut-être la possibilité d'utiliser LLVM pour construire l'AST du programme, et ensuite récupérer les appels qui vont bien. L'interface de LLVM n'est pas si compliquée que ça, et son utilisation devrait permettre un certain gain de productivité.
    Oui, tu peux tenter ca avec libclang (j'ai par exemple un petit script qui fait de la conversion vers du xml de prototypes, clamg2xml sur github) qui lui expose le parseur C/C++. Normalement, tu peux parcourir l'AST (il n'existe plus dans LLVM), chercher si la methode associee est toto et remonter au type appelant, verifier si c'est bien un tata ou un heritage de tata, recuperer les arguments et faire ca.
    Ca demande pas mal de travail, mieux vaut le faire en Python, je pense, et tu reduis la duree du developpement, clairement.

  20. #20
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    Le métier de développeur C++ ne consiste pas seulement à utiliser/adapter des programmes tout fait. Certes, ce n'est pas toujours judicieux de réinventer la roue, mais quand la roue est carrée, il faut mettre les mains dans le cambouis. Oui, un développeur, ça écrit aussi du code à partir de rien.

    Il est vrai que parser un ficher C++ n'est pas chose aisée, mais on ne te demande pas non plus d'écrire un compilateur (d'ailleurs tu peux aller voir les source de gcc, il est en C++ maintenant : GGC).

    Mon conseil, surtout si tu apprends le C++, écris du code par toi-même. Un parseur de fichier, ce n'est pas la chose la plus intéressante en programmation. Mais ce n'est pas insurmontable non plus. Cela ne devrait pas rebuter un développeur C++, même débutant.

    Citation Envoyé par roulian46 Voir le message
    Le problème c'est que récupérer les différents appels de méthode est simplement une partie de mon appli, pas le souhait final de mon client sinon ça serait trop facile.
    Il me faut récupérer les appels de méthode pour ensuite analyser ces méthodes et ainsi de suite jusqu'à obtenir une requête SQL complète.
    Et puis le client il demandera certainement des choses supplémentaires encore. Si un outil répond exactement au besoin présent et futur de ce client (et en plus open source), tu es le plus chanceux de la terre...

Discussions similaires

  1. Outil d'analyse de code
    Par Bloon dans le forum Outils
    Réponses: 8
    Dernier message: 07/08/2007, 09h04
  2. Analyse de code
    Par ecocentric dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 11/02/2005, 01h09
  3. [WSAD 5 ] - Analyse de code
    Par nicoswiss dans le forum Eclipse Java
    Réponses: 8
    Dernier message: 13/08/2004, 10h21
  4. [ Code ] Analyse de code - Attribut Inutile
    Par geegee dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 19/05/2004, 09h07
  5. Cherche lien info... sur l'analyse du code
    Par Alec6 dans le forum Qualimétrie
    Réponses: 3
    Dernier message: 03/03/2004, 14h44

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