Coccigrep, un grep sémantique pour le langage C basé sur Coccinelle

Posté par (page perso) . Modéré par patrick_g. Licence CC by-sa
45
2
sept.
2011
C et C++

Lorsque l'on travaille sur un projet C comportant un certain nombre de fichiers et de lignes de code, il arrive fréquemment que l'on se pose des questions comme "Mais où est modifié le champ data de ma structure Packet ?". grep ne suffit pas pour répondre à ce genre de questions car ne comprenant pas C, il ne sait pas, par exemple, que la variable monbopkt est une structure Packet.

coccigrep, basé sur coccinelle qui est un outil très puissant de recherche et de modification automatique de code, est un logiciel libre chargé de répondre à ce genre de questions. Il vient d'être publié en version 1.0rc1, sous licence GPL v3. Il est écrit en Python et s'interface avec les éditeurs Vim et Emacs, ce qui permet de faire les recherches depuis l'éditeur.

Le fonctionnement de coccigrep est simple, vous spécifiez quel type d'opérations vous cherchez sur une structure et ses attributs. Par exemple, si l'on souhaite savoir où est assigné l'attribut datalink de la structure Packet dans les fichiers source*c, il suffit de taper :

# coccigrep  -t Packet -a datalink -o set  source*c
source-af-packet.c:301 (Packet *p):     p->datalink = ptv->datalink;
source-erf-dag.c:525 (Packet *p):     p->datalink = LINKTYPE_ETHERNET;

Tout un ensemble d'opérations est disponible et ce dernier n'est pas fermé. Vous pouvez en effet rajouter vos propres opérations en créant des patchs sémantiques au format coccinelle.

Coccigrep s'appuie sur coccinelle pour effectuer ses recherches dans le code source. Coccinelle est un logiciel développé par l'INRIA, le LIP6 et l'université de Copenhague. Il est régulièrement utilisé pour effectuer des contrôles et des modifications sur le noyau Linux. De nombreux développeurs l'utilisent pour procéder à des modifications importantes de codes lors du changement d'une API par exemple.

  • # Intéressant complément à cscope. Quid du C++ ?

    Posté par . Évalué à 4.

    J'utilise cscope pour faire des recherches dans du code (vaste, ~10MLOC). Mais il ne permet pas de faire des recherches sur des accès à des données !

    Cependant, supporte-t-il C++ ?? Apparemment pas, mais est-ce un projet dans le bugtracker ?

    • [^] # Re: Intéressant complément à cscope. Quid du C++ ?

      Posté par (page perso) . Évalué à 6.

      Les capacités d'analyse syntaxique de coccigrep sont celles de coccinelle. Ce dernier supporte assez mal le C++ mais il semble qu'il y ait tout de même un intérêt dans ce sens et qu'un support du C++ puisse apparaitre. Lorsque cela sera fait, il sera alors possible de faire évoluer coccigrep vers le C++.

  • # Bravo

    Posté par . Évalué à 2.

    On dirait qu'il y en a qui savent mettre leur temps libre à contribution.

    J'en avais rêvé sans trop oser y croire.

    Bravo pour l'idée !
    Bravo pour la réalisation !

    • [^] # Re: Bravo

      Posté par (page perso) . Évalué à 7.

      Merci, cela fait plaisir mais c'est plutôt les gens de Coccinelle qu'il faut remercier. Coccigrep, c'est un peu plus de 1000 lignes de code qui font tourner les 200000 lignes de code de haute volée de Coccinelle ;)

  • # Option -C

    Posté par (page perso) . Évalué à 3.

    L'option -C (concurrency) est perturbante, dans grep j'ai l'habitude qu'elle signifie "context", c'est-à-dire que -C N est un raccourci pour -A N -B N.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.