Salut à tous.
Je réfléchis en ce moment sur une sorte de successeur spirituel de coccinelle pour le C++. Si vous ne connaissez pas, coccinelle est un logiciel qui permet de faire du pattern matching avancé sur du code C et opérer des transformations suite à ces détections.
Par exemple, le snippet ci dessous va détecter le pattern kmalloc + test de nulité + mise à zéro via memset (les … signifient n'importe quel chemin d'execution possible), puis remplacer kmalloc par par kzalloc et supprimer l'appel à memset.
1 2 3 4 5 6 7 8 9 10 11 12 | @test @ expression S,F; identifier x; statement S1; @@ - x = kmalloc(S,F) + x = kzalloc(S,F) ... if(!x) S1 ... - memset(x,0,...); |
L'outil est assez puissant mais je trouve la syntaxe peu agréable à utiliser. Elle ressemble (par choix) beaucoup à celle de patch et l'attention qu'on doit porter à l'écriture des patchs (exemple dans le cas ci dessus, si x
est une expression ou un identifiant, ca ne va pas matcher les mêmes choses).
Je suis en pleine réflexion pour un langage de capture & transformation. Il faudrait qu'il soit capable d'exprimer des propriétés sur le code et aussi les transformations qu'on souhaite y appliquer.
j'ai donc quelques questions pour vous :
- A quel niveau voudriez vous exprimer les fragments à capturer ?
- Quel type de transformation souhaitez vous ?
- Comment voudriez vous exprimer les opérations à réaliser ?
C'est complètement libre, vous pouvez écrire ce que vous voulez.
Pour vous aider, voici une liste de chose que vous pouvez essayer de résoudre
- Passage d'un argument d'une fonction 'Foo::bar' de pointeur à référence + changement de la syntaxe correspondante dans le code de la fonction+ des sites d'appels
- Détection des codes où on utilise un pointeur puis plus loin on le teste pour savoir s'il est nul et vous voulez ramener le test avant la première utilisation.
J'ai un certain nombre d'idées en tête, mais je voudrais avoir le plus de retour possible de la part de gens autre.
Merci ! David.