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 :

Analyser du code C/C++: d�tecter les struct, class et fonctions


Sujet :

C++

  1. #1
    Membre �clair� Avatar de Rodrigue
    Inscrit en
    Ao�t 2002
    Messages
    487
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2002
    Messages : 487
    Par d�faut Analyser du code C/C++: d�tecter les struct, class et fonctions
    Bonjour,

    Je souhaiterais analyser du code C/C++. Dans un premier temps, je souhaiterais d�tecter toutes les fonctions d�clar�es dans plusieurs fichiers ainsi que les classes et les structures. Connaissez-vous un projet �quivalent assez simple � comprendre en open-source (ex.: doxygen)?

    Comment vous y prendriez-vous?

  2. #2
    Membre exp�riment�

    Inscrit en
    Mai 2005
    Messages
    132
    D�tails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 132
    Par d�faut
    Salut,

    ca depond de system, essaye BoUML, StarUML ou Umbrella.

    Fredy

  3. #3
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Qu'entends-tu par "analyser" ?
    Je partirai sur ctags personnellement.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  4. #4
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Citation Envoy� par Luc Hermitte Voir le message
    Qu'entends-tu par "analyser" ?
    Je partirai sur ctags personnellement.
    Ou cscope.

    Je ne connais pas de front-end C++ facilement utilisable (ca ferait d'ailleurs un beau projet)

  5. #5
    Expert confirm�

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par d�faut
    Note qu'a cause du pr�processeur, un bete analyse du code peut passer a cot� de d�clarations si le code utilise des macros etc...
    On trouve des exemples de code int�ressants dans les exemples de boost : un pr�processeur complet, un "extracteur" de d�clarations de classes, ...

  6. #6
    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
    Je crois savoir que Eclipe CDT et Code::Blocks utilisent tout deux ctags pour impl�menter leur auto-completion, �a fait d�ja un point de d�part.

  7. #7
    Membre �clair� Avatar de Rodrigue
    Inscrit en
    Ao�t 2002
    Messages
    487
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2002
    Messages : 487
    Par d�faut
    Merci pour vos r�ponses, je vais regarder ces diff�rents projets

    Qu'entends-tu par "analyser" ?
    Je voudrais parser du code C ou C++ sous la forme d'un fichier XML dans un "pseudo-langage" (les imbriquements repr�senteraient une structure de type arbre).

    Un code de ce type:
    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
     
    int Add(int A, int B); //déclaration de fonction
     
    int g1=0, g2; /*variable globale
    avec un commentaire sur plusieurs lignes */
     
    struct test {
    float a;
    double b;
    std::string c;
    };
     
    /**
     * Fonction principale
     **/
     
    int main(int argc, char* argv[])
    {
       int i, j;
       test k;
       bool isOk = true;
     
       k.a = 3.14;
     
       //...
     
       if(isOk)
       {
            //...
       } else {
           //...
       }   
    }
     
    int Add(int A, int B)
    {
       return A + B;
    }

    devrait devenir (dans ce genre l�, je l'ai fait vite fait ):
    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
    <FUNCTION_DECL>
       <NAME>Add</NAME>
       <RETURN_TYPE>int</RETURN_TYPE>
       <PARAMS>
          <P1>
          	<NAME>A</NAME>
          	<TYPE>int</TYPE>
          </P1>
          <P2>
          	<NAME>B</NAME>
          	<TYPE>int</TYPE>
          </P2>
       </PARAMS>
    </FUNCTION_DECL>
     
    <GLOBAL_VAR>
    int g1=0, g2; /*variable globale
    avec un commentaire sur plusieurs lignes */
    </GLOBAL_VAR>
     
    <STRUCTURE>
    struct test {
    float a;
    double b;
    std::string c;
    };
    </STRUCTURE>
     
    /**
     * Fonction principale
     **/
     
     <FUNCTION>
    int main(int argc, char* argv[])
    {
       int i, j;
       test k;
       bool isOk = true;
     
       k.a = 3.14;
     
       //...
     
       if(isOk)
       {
            //...
       } else {
           //...
       }   
    }
    </FUNCTION>
     
    <FUNCTION>
    int Add(int A, int B)
    {
       return A + B;
    }
    </FUNCTION>
    Remarquez que j'ai fort d�taill� le premier bloc. Dans un premier, je me contenterais tr�s bien de r�cup�rer la structure globale d'un fichier source

    Merci beaucoup pour votre aide! J'esp�re que vous voyez mieux ce que je souhaite r�aliser... si vous avez des questions, n'h�sitez surtout pas � me les poser

  8. #8
    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
    Je sans que Doxygen (ou un module) est capable de g�n�rer du xml, ce serait peut-�tre une piste � explorer.
    En tous cas je ne peux que te conseiller de r�utiliser l'un des (rares) programmes qui sont capables de te macher le travail, faire son propre compilo C++ rel�ve de la d�mence

  9. #9
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    Si tu veux vraiment tout faire � la main, il faut que tu r�fl�chisse � ce qui peut se trouver, et dans quel ordre, dans un fichier de code source (dans le fichier d'en-t�te, d'abord, puis dans le fichier d'impl�mentation )

    Ainsi, tu te rendra compte que tu peux trouver:
    • Des commandes pr�processeurs (lignes commen�ant par #
    • des commentaire, uni et multi lignes (commen�ant par // ou commencant par /* et terminant par */
    • des mots cl�s (class, struct, friend)
    • des indicateurs sur l'accessibilit� des �l�ments (private, protected, public)
    • des blocs (commencant par { et terminant par })
    • des listes d'arguments (commencant par ( et terminant par ) )
    • des tailles de tableau (commencant par [ et terminant par ] )
    • des sp�cificateurs de classe de stockage (extern, static, register,...)
    • des qualificateurs constant/volatile (const et volatile)
    • une repr�sentation de l'utilisation de m�moire (r�f�rence, pointeur, pointeur de pointeur)
    • des "fins d'instructions" (";")
    • des identifiants
    • ...

    Tu remarquera que les mots cl�s ont une signification pr�cise et que tous ces �l�ments se trouvent g�n�ralement dans un ordre pr�cis, mais que certains sont incompatible entre eux:
    • tu ne peux pas d�clarer une variable sous la forme de Type& Mavar[10]
    • Une d�claration de variable prend une synthaxe du genre de <S C Spec> <C V Qual> Type<utilisation memoire> nom <taille>
    • une d�claration de fonction prend une synthaxe du genre de <inline><S C Spec | virtualite> <C V Qual> Type_de_retour<utilisation m�moire> Nom(<liste d'arguments>)<throw(<liste d'erreur>)> <C V Qual>;
    • une d�claration de classe prend la forme de class NomDeClass <: <visibilit�> classe mere> <, <visibilit�> classe_mere> (plusieurs fois possible) >{
    • Un indicateur de visibilit� s'applique jusqu'� ce qu'un autre indicateur soit plac�
    • tous les �l�ment "facultatifs" ont une valeur par d�faut, qui peut varier en fonction des circonstances (par exemple: la visibilit� par d�faut d'une structure est publique, alors qu'elle est priv�e pour les classes)
    • ...


    Ce ne sont, bien sur, que quelques exemples des choses auxquelles tu dois �tre attentif

    A partir de l� tu pourras commencer � te dire que ton fichier, ce n'est qu'un arbre N-aire, dont la racine est... le fichier.

    La racine peut contenir une collection d'objets parmis
    • un instruction preprocesseurs
    • une d�claration de variables (libre)
    • une d�claration de fonctions (libre)
    • une espace de nommage
    • une (pr�)d�claration de classe ou de structure
    Un espace de nomage peut contenir une collection d'objets exactement identique � celle qui peut etre contenue par la racine.

    une d�claration de classe peut contenir
    • une collection d'h�ritage
    • une collection d'objet parmis
      • une visibilit� (private, protected, public)
      • une instruction pr� processeur

    une signification de visibilit� peut contenir une collection d'objets parmis
    • une d�claration de classe ou de structure
    • une d�claration ou une d�finition de fonction
    • une instruction preprocesseur
    • une d�claration d'amitie
    • une d�claration de variable

    Enfin, il y a les feuilles et les autres noeuds:
    • Une fonction peut �tre une feuille (si ce n'est que la d�claration) ou un noeud (si c'est aussi la d�finition)
    • une d�claration d'amiti� est une feuille
    • une d�claration de variable est une feuille
    Une fois que tu auras tout cela, tu disposera de l'ensemble de ce qui t'es n�cessaire pour cr�er ton fichier XML...

    Aucune liste n'est exhaustive, certaines choses manquent et c'est � toi de les trouver (o� serait le plaisir, sinon )... Mais une simple "observation" de diff�rents codes sources devrait te permettre d'y arriver
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  10. #10
    Expert confirm�

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par d�faut
    Il y a GCC XML mais le projet n'avance plus et est bas� sur GCC 3.x. C'est pas du bete parsing, c'est une r�elle compilation du programme, avec inclusion des en-tetes etc... Le code doit etre compilable avec GCC. En fait, au lieu de te sortir un code objet, il te sort un XML (tres verbeux). C'est pas super utilisable en fait, mais rien ne t'�chappe.

  11. #11
    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
    Je ne connais pas de front-end C++ facilement utilisable (ca ferait d'ailleurs un beau projet)
    C'est le but du projet clang.

  12. #12
    Membre �clair� Avatar de Rodrigue
    Inscrit en
    Ao�t 2002
    Messages
    487
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2002
    Messages : 487
    Par d�faut
    Merci beaucoup pour vos r�ponses! Je vois que le sujet est int�ressant...

    Je pr�cise que je ne souhaite pas d�tecter d'erreur dans le code... mais seulement rep�rer des patterns bien d�termin�s

    Pour ce faire, j'utilise boost::regex. J'ai d�j� r�cup�r� l'exemple qui permet de d�tecter les classes dans un fichier (le pattern ne fonctionne pas lorsqu'on met un commentaire entre le nom de la classe est l'accolade): class NOM /* comment */ {.
    J'ai �galement �crit une petite expression r�guli�re pour d�tecter les directives pr�processeurs...

    J'essaye maintenant de d�tecter les commentaires multilignes (c'est pas gagn�). J'ai essay� avec ce pattern mais �a ne fonctionne pas:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    "//\*(([[:punct:]]|[[:alnum:]]|[[:blank:]])*)\*//"
    J'ai du mal avec le d�doublement des caract�res ...

  13. #13
    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 Aurelien.Regat-Barrel Voir le message
    Il y a GCC XML mais le projet n'avance plus et est bas� sur GCC 3.x. C'est pas du bete parsing, c'est une r�elle compilation du programme, avec inclusion des en-tetes etc... Le code doit etre compilable avec GCC. En fait, au lieu de te sortir un code objet, il te sort un XML (tres verbeux). C'est pas super utilisable en fait, mais rien ne t'�chappe.
    GCC XML est utilis� par exemple pour Cable-SWIG, Boost.Python, et sans doute d'autres pour la g�n�ration automatique de code/wrappers.
    Apparemment, il avancerai un peu r�guli�rement (je vois des mails dans ce sens sur c++-sig), mais comme tu le sous-entend aussi, on n'en entend pas trop parler

  14. #14
    Membre exp�riment� Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    D�tails du profil
    Informations personnelles :
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Par d�faut
    Bonjour, ce post me rappelle un cas auquel j'ai du faire face r�cemment.
    Je devais parser des headers a la recherche d'enums pour en r�cup�rer chaque item.
    Et je me suis vite aper�u que les syntaxes pouvaient �tre diverses.
    J'ai arrang� tout ca a l'aide de regExp.
    Donc attention aux commentaires vicieusement mals plac�s, aux multiples facettes de d�claration, instanciation que le c++ autorise!

    Sinon j'ai utilis� Doxygen, et il permet un grand choix de fichiers de sortie.
    A essayer absolument !

  15. #15
    Membre �clair� Avatar de Rodrigue
    Inscrit en
    Ao�t 2002
    Messages
    487
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2002
    Messages : 487
    Par d�faut
    Merci pour vos r�ponses. Je vais ouvrir un autre post pour mes probl�mes d'expression r�guli�re

    lun4t1k>
    Je connais d�j� Doxygen mais je souhaiterais trouver les structures moi-m�me (on s'occupe comme on peut )

  16. #16
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    D�tails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par d�faut
    Salut,

    Citation Envoy� par Rodrigue Voir le message
    (...)je souhaiterais trouver les structures moi-m�me
    Si tu te limites � un sous ensemble des constructions valides du C++ c'est peut-�tre faisable au prix de pas mal de cheveux en moins (fais des tests unitaires au moins sinon c'est m�me pas la peine de te lancer l�-dedans).
    Mais par exemple en C++ on peut faire :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class C
    {
      class D
      {
        void f()
        {
          class E {};
        }
      };
    };
    Et ce n'est qu'un exemple simple...
    Il y a aussi le coup classique des d�clarations de fonctions qui ressemblent en tous points � des initialisations de variables (et inversement), les m�thodes qui sont dans deux classes de m�me nom mais dans des namespaces diff�rents qu'il faut diff�rencier, etc..

    Enfin j'imagine que �a d�pend du but final.
    Dans tous les cas : bon courage !

    MAT.

Discussions similaires

  1. R�ponses: 10
    Dernier message: 17/01/2012, 17h10
  2. R�ponses: 22
    Dernier message: 29/05/2011, 20h56
  3. R�ponses: 2
    Dernier message: 18/06/2010, 19h12
  4. R�ponses: 3
    Dernier message: 04/07/2009, 14h46

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