AccueilđŸ‡«đŸ‡·Chercher

Coccinelle (logiciel)

Le logiciel Coccinelle, un outil de correspondance et transformation en langage C, a Ă©tĂ© rĂ©alisĂ© en 2008 par l’actuelle Ă©quipe de recherche Whisper[1] (Équipe de projet commune entre l’Inria et la Sorbonne UniversitĂ©) pour faciliter les spĂ©cifications et automatisations de l'Ă©volution du noyau Linux. La nouvelle contribution de Coccinelle fut d'autoriser les dĂ©veloppeurs Ă  Ă©crire des rĂšgles de manipulation de code directement dans la structure syntaxique du code, via la gĂ©nĂ©ralisation de syntaxe (en) de patch. Au fil des annĂ©es, l’outil Coccinelle a Ă©tĂ© largement utilisĂ© dans le dĂ©veloppement du noyau Linux, aboutissant Ă  plus de 6000 commits, et a trouvĂ© sa place dans le processus de dĂ©veloppement de Linux.

Coccinelle
Date de premiĂšre version 3 octobre 2010 (coccinelle-0.1)
DĂ©veloppeur Equipe Whisper [1]
DerniĂšre version 1.0.8 [2] (le 25 septembre 2019)
Écrit en Langage C, OCaml et Python
Licence GPLv2
Site web coccinelle.lip6.fr

Caractéristiques de l'outil Coccinelle

Coccinelle
Fig. 1 Moteur de transformation Coccinelle

Coccinelle est un programme de correspondance et un outil de transformation pour le code en C. Il est utilisĂ© pour la dĂ©couverte de bugs dans les Ă©volutions du noyau Linux et dĂ©veloppĂ© par Lawall, Muller et coll. depuis 2008[3]. Coccinelle a Ă©tĂ© Ă  l'origine conçu pour cibler les Ă©volutions collatĂ©rales des pilotes de pĂ©riphĂ©riques Linux, oĂč le but Ă©tait de mettre Ă  jour le code client en rĂ©ponse Ă  un changement de l'interface d'une bibliothĂšque[4]. Coccinelle a aussi Ă©tĂ© largement utilisĂ© pour trouver et fixer des bugs[5] - [6]. L'outil coccinelle est conçu pour ĂȘtre facile Ă  utiliser par les dĂ©veloppeurs de logiciels, sans exiger d’expertise dans l'analyse de programme, la transformation de programme, ou la conception interne de l'outil lui-mĂȘme. À cette fin, l’outil de transformation Coccinelle et les rĂšgles de dĂ©couverte de bug sont exprimĂ©es en utilisant une syntaxe qui est proche de celle d’un patch. Étant donnĂ© que Coccinelle tient compte de la sĂ©mantique du langage C, notamment sa structure de contrĂŽle, Lawall et coll. font rĂ©fĂ©rence Ă  l’outil de transformation Coccinelle ou Ă  la spĂ©cification de recherche de bug comme un patch sĂ©mantique (semantic patch). En 2014, presque 2000 patchs acceptĂ©s dans le noyau Linux ont Ă©tĂ© crĂ©Ă©es en utilisant Coccinelle, y compris environ 700 patchs crĂ©Ă©s par 90 dĂ©veloppeurs n’appartenant pas au groupe de recherche de Coccinelle[7].

Coccinelle est conçu autour d'un langage dĂ©diĂ© (en anglais, domain-specific language ou DSL), SmPL (Semantic Patch Language), pour exprimer des changements en termes d'une forme abstraite de patch, mentionnĂ© comme un patch sĂ©mantique. À la diffĂ©rence d’un patch classique, qui est liĂ© aux lignes et fichiers spĂ©cifiques dans le code source, un patch sĂ©mantique simple peut mettre Ă  jour tous les emplacements appropriĂ©s dans la base de code entiĂšre[8].

La figure 1 montre les Ă©tapes principales exĂ©cutĂ©es par le moteur de Coccinelle. Les points clefs dans sa conception sont les stratĂ©gies pour (i) faire face au prĂ©processeur C (cpp), ĂȘtre capables de prĂ©server le style de code original, (ii) faire l’ abstraction de la syntaxe et des variations de structure de contrĂŽle et (iii) appliquer le code de transformation efficacement. Le rĂ©sultat de correspondance de la formule CTL avec le CFG est une collection de nƓuds oĂč une transformation est requise, le fragment du patch sĂ©mantique qui correspond Ă  ces nƓuds et les liens de mĂ©tavariable. Le moteur propage alors les - et + des annotations sur le patch sĂ©mantique aux tokens (en) correspondants aux nƓuds correspondants du CFG, et ensuite Ă  l’arbre de syntaxe abstraite. Le moteur unparse (en) l’arbre de syntaxe abstraite en supprimant n'importe quel token annotĂ© avec - et en ajoutant les + du patch sĂ©mantique, comme appropriĂ©. N'importe quel mĂ©tavariables dans l’ajout supplĂ©mentaire des + dans le code sont instanciĂ©s selon les liens Ă©tablis par le processus de correspondance CTL[9].

  • Les mĂ©thodes utilisĂ©es par l'outil Coccinelle:
Isomorphisme
Les isomorphismes assimilent sĂ©mantiquement des fragments de code Ă©quivalents, pour extraire des variations dans le style de code, et l'utilisation de logique temporelle pour extraire des variations dans les chemins d'exĂ©cution spĂ©cifiques des pĂ©riphĂ©riques. Le rĂ©sultat de gĂ©nĂ©ricitĂ© implique qu’un simple patch sĂ©mantique de moins de 50 lignes peut suffire pour mettre Ă  jour plus de 500 fichiers[9].
CTL (Logique du temps arborescent (en))
Le patch sĂ©mantique SmPL est compilĂ© dans une formule de logique temporelle (CTL). La correspondance de la formule avec le modĂšle est alors mise en Ɠuvre utilisant une variante d'un modĂšle standard vĂ©rifiant l'algorithme[10]. Tandis que CTL est probablement peu familier Ă  la plupart des mainteneurs de pilote, il sert seulement comme un langage d’ assembleur, que le mainteneur de pilote ne doit pas lire ou comprendre[9].
CFG (Graphe de flot de contrĂŽle)
Padioleau et coll. utilisent des chemins dans le graphe de flux de contrÎle (CFG), comme une approximation du patron d'opérations exécutées au temps d(exécution par un pilote. Ainsi, une séquence de termes dans un patch sémantique SmPL correspond à une séquence de termes du langage C le long d'un chemin dans le CFG[9].
VĂ©rification de modĂšles
Pour raisonner en graphes de flux de contrÎle, Padioleau et coll. ont basé le moteur Coccinelle sur la technologie vérification de modÚles, qui est orienté graphe[10]. Dans cette approche, chaque bloc (en) au plus haut niveau de code source C (par exemple, une fonction (en) ou une macro-définition) est traduit dans un graphique de flux de contrÎle[9].
Stratégie d'adaptation au préprocesseur C (cpp)
Un analyseur syntaxique qui est capable d’adapter beaucoup d'utilisations des directives du prĂ©processeur C. Les commentaires et les espaces blancs (en) sont maintenus oĂč c’est possible dans le code transformĂ© pour prĂ©server la capacitĂ© de comprendre et maintenir le pilote. Parce que les Ă©volutions collatĂ©rales sont justes un pas dans la maintenance en cours d'un pilote de pĂ©riphĂ©rique Linux, le moteur Coccinelle doit gĂ©nĂ©rer un code qui est lisible et dans le style du code source original, y compris l'utilisation de constructions cpp. En outre, une Ă©volution collatĂ©rale peut impliquer des constructions cpp. Donc, Coccinelle fait l'analyse syntaxique du code C, sans Ă©tendre des directives du prĂ©processeur cpp, pour qu'elles soient prĂ©servĂ©s tant dans le processus de transformation que dans le code gĂ©nĂ©rĂ©[9].

Origines du projet Coccinelle

Dans les systĂšmes d’exploitation (OS) modernes, les pilotes des pĂ©riphĂ©riques peuvent constituer 70% du code source[11]. Le code du pilote est lui aussi fortement dĂ©pendant du reste du code source de l’OS, pour ses fonctions ainsi que la structure de donnĂ©es dĂ©finie dans le noyau et les bibliothĂšques de support des pilotes. En consĂ©quence, n’importe quels changements des interfaces du noyau ou des bibliothĂšques de support des pilotes vont probablement dĂ©clencher des modifications dans le code du pĂ©riphĂ©rique pour rĂ©tablir son bon fonctionnement. Yoann Padioleau, Julia Lawall et Gilles Muller font rĂ©fĂ©rence, en octobre 2006, Ă  ces modifications comme des Ă©volutions collatĂ©rales. Elles peuvent entraĂźner des rĂ©organisations de code substantielles, qui prennent du temps et sont sujettes aux erreurs. Le besoin d'Ă©volutions collatĂ©rales peut donc gĂȘner l'Ă©volution de l'OS en pratique. C’est ainsi que Padioleau, Lawall et Muller ont commencĂ© Ă  examiner les problĂšmes rĂ©vĂ©lĂ©s par ces Ă©volutions collatĂ©rales dans le contexte de Linux[12].

En janvier 2007, ils ont proposĂ© un langage de transformation dĂ©claratif, SmPL (Semantic Patch Language), pour exprimer prĂ©cisĂ©ment les Ă©volutions collatĂ©rales des pilotes de pĂ©riphĂ©riques Linux. La communautĂ© des programmeurs Linux est habituĂ©s Ă  l'Ă©change, la lecture et la manipulation de patchs qui fournissent un rapport des changements prĂ©cĂ©demment exĂ©cutĂ©s. Padioleau et coll. ont ainsi axĂ© la syntaxe de SmPL sur la notation de fichier de patch. À la diffĂ©rence des patchs habituels, qui enregistrent les changements dans des fichiers spĂ©cifiques, SmPL peut dĂ©crire les transformations gĂ©nĂ©riques qui s'appliquent aux Ă©volutions collatĂ©rales multiples. Ce fut une premiĂšre Ă©tape dans le projet de dĂ©velopper l’outil de transformation Coccinelle, fournissant une assistance automatisĂ©e pour exĂ©cuter des Ă©volutions collatĂ©rales. Cette assistance comprend le langage SmPL pour spĂ©cifier les Ă©volutions collatĂ©rales et un moteur de transformation pour les appliquer au code des pilotes de pĂ©riphĂ©riques[13]. Le projet de dĂ©veloppement de Coccinelle est soutenu par le Conseil de Recherche danois (Danish Research Council for Technology and Production) des universitĂ©s de Copenhague et Aalborg et l’institut national de recherche en sciences et technologies du numĂ©rique (Inria) en France[14].

Les évolutions collatérales

Le problÚme des évolutions collatérales

L’équipe Whisper a Ă©valuĂ© les divers aspects du besoin d'Ă©volutions collatĂ©rales dans les pilotes de pĂ©riphĂ©riques Linux, utilisant des outils d'extraction de donnĂ©es ad hoc qu’ils ont dĂ©veloppĂ©[4]. Ces rĂ©sultats montrent que les bibliothĂšques de support des pilotes et les fichiers spĂ©cifiques des pĂ©riphĂ©riques qui en dĂ©pendent sont nombreux et leurs relations complexes. Yoann Padioleau, RenĂ© R. Hansen, Julia Lawall et Gilles Muller ont ainsi identifiĂ© en 2006, dans la version 2.6.13 du noyau Linux, 150 bibliothĂšques de support de pilotes et presque 2000 fichiers spĂ©cifiques des pĂ©riphĂ©riques. Un fichier spĂ©cifique de pĂ©riphĂ©rique peut utiliser jusqu'Ă  59 fonctions de bibliothĂšque diffĂ©rentes. PlutĂŽt que de devenir plus stable, cette base de code se dĂ©veloppe de plus en plus rapidement[15]. Ils ont constatĂ© que le nombre d'Ă©volutions dans les Ă©lĂ©ments d'interface croient fortement, avec 300 Ă©volutions probables dans le code de Linux 2.2 et plus de 1200 dans Linux 2.6 jusqu'Ă  Linux 2.6.13. Certaines de ces Ă©volutions dĂ©clenchent des Ă©volutions collatĂ©rales dans presque 400 fichiers. Entre Linux 2.6.9 et Linux 2.6.10, plus de 10 000 lignes de code pĂ©riphĂ©riques spĂ©cifique, affectĂ©es par des Ă©volutions collatĂ©rales, ont Ă©tĂ© trouvĂ©es[16].

Les divers aspects du processus des évolutions collatérales

Avant l’arrivĂ©e de l’outil Coccinelle, ces Ă©volutions suivaient ce procĂ©dĂ© typique : Quand un dĂ©veloppeur fait un changement dans une bibliothĂšque Linux interne qui a un impact sur une API, il met manuellement Ă  jour tout le code spĂ©cifique du pĂ©riphĂ©rique dans l'arborescence source Linux, basĂ© sur sa comprĂ©hension de l'Ă©volution et son approche des pilotes concernĂ©s. Ensuite, les mainteneurs des nombreux pilotes extĂ©rieurs Ă  l'arborescence source de Linux exĂ©cutent l'Ă©volution collatĂ©rale dans leurs propres codes. Ces mainteneurs de pilotes n'ont pas la connaissance immĂ©diate de cette Ă©volution et doivent ainsi dĂ©duire comment elle s'applique Ă  leurs codes depuis n'importe quels commentaires de code disponibles, de mails informels et de patchs souvent volumineuses. Finalement, des utilisateurs motivĂ©s appliquent les Ă©volutions collatĂ©rales pour coder ce qui a Ă©tĂ© omis par le dĂ©veloppeur de bibliothĂšque ou le mainteneur de pilotes. Et ce cas pose problĂšme au mainteneur de pilotes car ces utilisateurs ne peuvent avoir aucune expĂ©rience avec l'Ă©volution collatĂ©rale ou le code des pilotes[17].

Comme Linux est un OS open source, beaucoup de programmeurs diffĂ©rents contribuent Ă  son dĂ©veloppement. En effet, les mainteneurs de pilote ne sont souvent pas des experts du noyau, mais plutĂŽt des experts d’un pĂ©riphĂ©rique donnĂ© ou mĂȘme des utilisateurs ordinaires qui constatent que leur matĂ©riel n'est pas correctement supportĂ©. Parce que les dĂ©veloppeurs qui mettent Ă  jour le noyau et les bibliothĂšques de support des pilotes ne partagent pas souvent de langage commun et une expertise avec le mainteneur de pĂ©riphĂ©rique, la documentation d'Ă©volutions collatĂ©rales complexes est souvent incomplĂšte[12].

Les précédentes tentatives de résolution

La rĂ©utilisation de pilotes de pĂ©riphĂ©riques a Ă©tĂ© tentĂ©e par la restructuration des systĂšmes d'exploitation utilisant une approche de micro-noyau. Goel et Duchamp[18] ont Ă©mulĂ© des pilotes de pĂ©riphĂ©riques de Linux sur un micro-noyau Mach 4.0, avec des rĂ©sultats de performance dĂ©cevants . L’architecture Chorus/MiX[19] a aussi essayĂ© de dĂ©multiplier des pilotes de pĂ©riphĂ©riques existants en les exĂ©cutants comme des entitĂ©s indĂ©pendantes. Cependant, cette solution a fourni une migration moins transparente qu'attendue, et quelques adaptations Ă©taient toujours requises. Une approche semblable avait Ă©tĂ© entreprise dans le systĂšme Minix[20], bien qu’elle soit plus centrĂ©e sur la conception de systĂšmes minimaux pour des objectifs de fiabilitĂ© qu'en rĂ©utilisant du logiciel hĂ©ritĂ©[21].

Semantic patches (SmPL)

SmPL est l’acronyme pour “Semantic Patch Language”, il se prononce “simple” en Français[22].

Les buts de ce nouveau langage

La communautĂ© Linux utilise divers outils pour mieux analyser le langage C. Sparse[23] est une bibliothĂšque qui, comme un compilateur front end, fournit l’accĂšs Ă  l'arbre de syntaxe abstraite et l'information de saisie d'un programme en C. Cette bibliothĂšque a Ă©tĂ© utilisĂ©e pour implĂ©menter quelques analyses statiques ciblant la dĂ©tection de bug, construite sur des annotations supplĂ©mentaires aux dĂ©clarations de variables, dans l'esprit de static et constant. Smatch[24] est un projet semblable qui permet Ă  un dĂ©veloppeur d'Ă©crire des scripts en Perl pour analyser du code en C. Ces deux projets ont Ă©tĂ© inspirĂ©s par le travail d'Engler et coll. sur l’automatisation de la recherche de bug dans les codes de systĂšmes d’exploitation[25]. Ces exemples montrent que la communautĂ© Linux est ouverte Ă  l'utilisation d'outils automatisĂ©s pour amĂ©liorer la qualitĂ© du code, particuliĂšrement quand ces outils sont construits sur les secteurs traditionnels d'expertise des dĂ©veloppeurs Linux[26].

Pour ĂȘtre capable de dĂ©crire gĂ©nĂ©riquement des Ă©volutions collatĂ©rales, en restant cohĂ©rent avec le modĂšle de dĂ©veloppement de code du noyau Linux, Padioleau et coll. ont Ă©tendu la notation de patch pour inclure les aspects de la sĂ©mantique du langage C, et non juste sa syntaxe. Ils font ainsi rĂ©fĂ©rence Ă  des patchs sĂ©mantiques (semantic patches) pour leurs spĂ©cifications. En utilisant ces patchs sĂ©mantiques, ils affinent le modĂšle de patch dĂ©crit ci-dessus. Ainsi seul le dĂ©veloppeur de bibliothĂšque applique manuellement l'Ă©volution collatĂ©rale Ă  quelques fichiers de pilotes, pour obtenir un sens aux changements qui sont exigĂ©s et Ă©crit ensuite des patchs sĂ©mantiques qui peuvent ĂȘtre appliquĂ©es aux fichiers restants et distribuĂ©es Ă  d'autres mainteneurs de pilotes. Le but des patchs sĂ©mantiques est de s'appliquer indĂ©pendamment du style de code, mais ce n'est pas possible en pratique de prĂ©voir toutes les variations possibles. Ainsi, l'outil devrait non seulement appliquer des patchs sĂ©mantiques, mais devrait ĂȘtre aussi capable d'aider le dĂ©veloppeur ou le mainteneur de pilote quand une correspondance exacte de la rĂšgle avec le code source n'est pas possible[27].

Syntaxe de SmPL

En général, le patch sémantique a la forme d'un patch traditionnel[28], consistant en une séquence de rÚgles dont chacune commence par une information de contexte délimitée par une paire de @@ et spécifie ensuite une transformation appliqué dans ce contexte.

Exemple d'un patch sémantique pour mettre à jour des fonctions SCSI proc_info avec l'outil diff :

@@
local function proc_info_func;
identifier buffer, start, offset, length, inout, hostno;
identifier hostptr;
@@
proc_info_func (
+ struct Scsi_Host *hostptr,
char *buffer, char **start, off_t offset,
int length, int hostno, int inout) {
 ...
- struct Scsi_Host *hostptr;
 ...
- hostptr = scsi_host_hn_get(hostno);
 ...
- if (!hostptr) { ... return ...; }
 ...
- scsi_host_put(hostptr);
 ...
 }

Dans le cas d’un patch sĂ©mantique, l'information de contexte ne dĂ©clare pas des numĂ©ros de ligne, mais un groupe de mĂ©tas variables. Un mĂ©ta variable peut correspondre Ă  n'importe quel terme indiquĂ© dans sa dĂ©claration (identificateur, expression, etc), de telle sorte que toutes les rĂ©fĂ©rences Ă  un mĂ©ta variable donnĂ© correspondent au mĂȘme terme. La rĂšgle de transformation est spĂ©cifiĂ©e comme dans un fichier de patch traditionnel, avec un terme ayant la forme du code Ă  ĂȘtre transformĂ©. Ce terme est annotĂ© avec les modificateurs - et + pour indiquer le code qui doit ĂȘtre respectivement supprimĂ© et ajoutĂ©. Les lignes 1-5 du patch sĂ©mantique du code ci-dessus dĂ©clarent une collection de mĂ©tas variables. La plupart de ces mĂ©tas variables sont utilisĂ©es dans la fonction d’ en-tĂȘte aux lignes 6-9 pour spĂ©cifier le nom de la fonction qui sert Ă  transformer et les noms de ses paramĂštres. L’action de spĂ©cifier la fonction d'en-tĂȘte en termes de mĂ©tas variables identifie efficacement la fonction qui sert Ă  transformer en des termes de son prototype. Ce qui est dĂ©fini par la bibliothĂšque SCSI et est ainsi commun Ă  toutes les fonctions proc_info. A noter que quand une dĂ©finition de fonction est transformĂ©e, le prototype correspondant est aussi transformĂ© automatiquement de la mĂȘme maniĂšre ; il n'est donc pas nĂ©cessaire de spĂ©cifier explicitement la transformation d'un prototype de patch sĂ©mantique. Le reste du code spĂ©cifie le dĂ©placement des fragments de code divers dĂ©crits au-dessus du corps de la fonction. Comme le code Ă  supprimer n'est pas nĂ©cessairement contigu, ces fragments sont sĂ©parĂ©s par l'opĂ©rateur SmPL "...", qui correspond Ă  n'importe quel ordre d'instructions. La piĂšce sĂ©mantique spĂ©cifie aussi qu'une ligne devrait ĂȘtre ajoutĂ©e : la dĂ©claration indiquĂ©e Ă  la ligne 11 pour ĂȘtre enlevĂ© du corps de fonction est spĂ©cifiĂ©e pour ĂȘtre ajoutĂ© Ă  la liste de paramĂštre Ă  la ligne 7 par une rĂ©fĂ©rence rĂ©pĂ©tĂ©e au mĂ©ta variable hostptr. En gĂ©nĂ©ral, la rĂšgle s'applique indĂ©pendamment des espacements, des sauts de ligne et des commentaires. De plus, le moteur de transformation est paramĂ©trĂ© par une collection d'isomorphismes spĂ©cifiant les ensembles des Ă©quivalences qui sont prises compte en appliquant la rĂšgle de transformation[29].

L’équipe Whisper commençait Ă  concevoir les prĂ©mices d’une structure, Coccinelle, qui inclut un langage, SmPL dans lequel s’expriment les patchs sĂ©mantiques qui dĂ©crivent des Ă©volutions collatĂ©rales et un outil de transformation pour appliquer ces patchs sĂ©mantiques au code spĂ©cifique des pĂ©riphĂ©riques. Pour s’adapter aux habitudes des dĂ©veloppeurs Linux et fournir une syntaxe lisible, SmPL est basĂ© sur le format de patch standard[30].

Exemple d’autres structures de transformation de programmes

D’autres structures de transformation de programme ont Ă©tĂ© proposĂ©es, s’appuyant sur des langages comme C et Java. CIL (en)[31] et XTC[32] sont essentiellement des analyseurs syntaxiques qui fournissent un support pour mettre en Ɠuvre des parcours d'arbres de syntaxes abstraites. CIL gĂšre aussi le code source du langage C en termes de reprĂ©sentation intermĂ©diaire plus simple. RĂ©Ă©crire des rĂšgles doit ĂȘtre exprimĂ© en termes de cette reprĂ©sentation plutĂŽt qu'en termes de code trouvĂ© dans le pilote appropriĂ©. Stratego (en) est un langage dĂ©diĂ© qui sert Ă  Ă©crire des transformations de programme[33]. Un filtrage par motif correct et des stratĂ©gies de gestion de rĂšgle y sont intĂ©grĂ©s et impliquent que le dĂ©veloppeur peut spĂ©cifier les transformations devant arriver sans encombrer le code avec la mise en Ɠuvre de mĂ©canismes de transformation. NĂ©anmoins, seulement quelques analyses de programme sont fournies. Les autres analyses qui sont exigĂ©es, comme l'analyse de flux de contrĂŽle, doivent ĂȘtre mises en Ɠuvre dans le langage Stratego. D’aprĂšs Padioleau et coll., cela mĂšne Ă  des rĂšgles qui sont trĂšs complexes pour exprimer des Ă©volutions collatĂ©rales mĂȘme simples[26].

Évolutions de l'outil Coccinelle

Introduction des langages de script

L'interface de langage de script a Ă©tĂ© initialement motivĂ©e dans le but d'utiliser Coccinelle pour trouver des bugs[34]. Les bugs qui dĂ©pendent principalement de la structure du code, comme la vulnĂ©rabilitĂ© use-after-free(oubli par un dĂ©veloppeur de rĂ©initialiser un pointeur aprĂšs une libĂ©ration de la mĂ©moire)[35], pourraient ĂȘtre trouvĂ©s; alors que le filtrage par motif des fonctionnalitĂ©s de Coccinelle n'Ă©tait pas suffisant pour dĂ©tecter des bugs comme le dĂ©passement de tampon qui exige le raisonnement des variables d’environnement. Pour permettre le raisonnement de l'information arbitraire, un support a Ă©tĂ© ajoutĂ© en 2008 pour les rĂšgles de langage de script. Le premier langage supportĂ© Ă©tait Python, qui Ă©tait attendu comme familier aux dĂ©veloppeurs Linux. Coccinelle est implĂ©mentĂ© dans OCaml, et le script OCaml a Ă©tĂ© ajoutĂ© en 2010, pour la commoditĂ© des dĂ©veloppeurs Coccinelle. Les scripts ont Ă©tĂ© Ă  l'origine conçus pour filtrer les ensembles de mĂ©tas variables Ă©tablies selon les rĂšgles prĂ©cĂ©dentes.

Le code ci-dessous montre un exemple de suppression d’un point-virgule aprĂšs un en-tĂȘte « if » si l’ expression de sous-suite est dĂ©signĂ©e, suggĂ©rant que la derniĂšre expression soit indentĂ©e pour ĂȘtre dans le branchement « if ». Une rĂšgle de script compare l' indentation des deux expressions (ligne 11) et annule le mĂ©ta variable des environnements de liaisons (ligne 12) dans lequel l’ instruction conditionnelle est alignĂ©e avec ou Ă  droite de l’expression de sous-suite.

@r@                           
expression E; statement S; 
position p1,p2;
@@
if@p1 (E);
    S@p2
@script:python@
p1 << r.p1; p2 << r.p2;
@@
if (p1[0].col >= p2[0].col):
   cocci.include_match(False)
@@
expression E; statement S;
position r.p1;
@@
if@p1 (E)
- ;
S

Finalement, la motivation premiĂšre pour le script, c'est-Ă -dire trouver des bugs comme le dĂ©passement de tampon, n'Ă©tait pas couronnĂ© de succĂšs. En effet, les modĂšles de code Ă©taient petits et gĂ©nĂ©riques et les scĂ©narios implĂ©mentant les analyses exigĂ©es Ă©taient complexes. Cependant, le script a Ă©tĂ© un bond en avant pour l'expressivitĂ© de Coccinelle et des nouvelles fonctionnalitĂ©s de script ont Ă©tĂ© ajoutĂ©es comme de nouveaux besoins ont Ă©mergĂ©. DĂšs le dĂ©but, les bibliothĂšques ont Ă©tĂ© ajoutĂ©es pour produire des messages d'erreur formatĂ©s. En 2009, les scripts initialize et finalize (en) ont Ă©tĂ© introduits pour permettre de dĂ©finir l'Ă©tat global du traitement de tous les fichiers, faciliter la collection de statistiques. En 2010, les scripts sont devenus capables de crĂ©er des nouveaux fragments de code pouvant ĂȘtre stockĂ©s dans des mĂ©tas variables et hĂ©ritĂ©s selon des rĂšgles de sous-suite. En 2016, pour amĂ©liorer la performance et rĂ©duire la taille du patch sĂ©mantique, il est devenu possible d'ajouter du code de script aux dĂ©clarations de mĂ©ta variable, pour dĂ©finir les prĂ©dicats qui annulent les liaisons de mĂ©tas variable au dĂ©but du processus de comparaison. Finalement, le script autorise l'itĂ©ration, qui permet Ă  un patch sĂ©mantique de soumettre de nouveaux jobs au moteur de Coccinelle, pour exĂ©cuter l'analyse Ă  travers de multiples fichiers[36].

OpenSSL

Dans ce projet, Lawall et coll. ont utilisĂ© Coccinelle sur un type de bug qui a Ă©tĂ© prĂ©cĂ©demment mis en Ă©vidence dans le code d'OpenSSL selon le rapport CVE-2008-5077[37] de vulnĂ©rabilitĂ© de sĂ©curitĂ© Ă  la suggestion de Ben Laurie, qui est un expert OpenSSL. Cette vulnĂ©rabilitĂ© est basĂ©e sur l'observation que beaucoup de fonctions dans OpenSSL retournent des entiers faux-positifs pour indiquer les divers types d'erreurs. NĂ©anmoins, le code callsite (en) errorchecking considĂšre souvent seulement le 0 comme une erreur et toute autre valeur comme rĂ©ussie. Ce modĂšle n'existe pas dans Linux et la connaissance spĂ©cifique de OpenSSL est nĂ©cessaire. Lawall et coll. ont dĂ©tectĂ© environ 30 bugs dans un snapshot d'OpenSSL (openssl-1.0.0-stable-snap-20090911). Dans des nombreux cas, ils Ă©taient capables d'utiliser les capacitĂ©s de transformation de programme du moteur Coccinelle pour corriger automatiquement ces bugs. La plupart des patchs de correction de ces bugs ont Ă©tĂ© soumis aux dĂ©veloppeurs OpenSSL et tous ces patchs correctifs ont Ă©tĂ© acceptĂ©s. Le tableau 1 prĂ©sente les rapports donnĂ©s par les rĂšgles du patch sĂ©mantique qui dĂ©tecte des tests directs et le tableau 2 prĂ©sente les rapports donnĂ©s par les rĂšgles du patch sĂ©mantique qui dĂ©tecte des tests sur des valeurs stockĂ©es. Acc. (AcceptĂ©) indique le nombre de bugs pour lesquels les patchs ont Ă©tĂ© soumis et acceptĂ©es par les dĂ©veloppeurs OpenSSL. FP indique le nombre de faux positif. Unk. (Inconnu) indique des rapports dont Lawall et coll. n’étaient pas capables de classifier comme des bugs ou des faux positifs. En gĂ©nĂ©ral, le taux de faux positif est aux alentours de 50 %. Ce taux est haut, mais le nombre complet de rapports est peu Ă©levĂ©. Ils s’attendent Ă  ce que cela puisse ĂȘtre fait plus rapidement par un expert de OpenSSL[38].

Tableau 1
BugsAcc.FPUnk.Files
ASN1_item _ex _d2i00101
BIO_ctrl10001
BIO_write66003
BN_exp11001
CMS_get1_ReceiptRequest22001
ENGINE_ctrl44102
EVP_PKEY_cmp_parameters00101
EVP_PKEY_sign11001
OPENSSL_isservice11203
RAND_bytes43004
RAND_pseudo_bytes20001
UI_ctrl00202
X509_STORE_get_by_subject00021
X509_check_purpose00011
asn1_cb001003
asn1_check_tlen00201
i2a_ASN1_INTEGER11001
i2a_ASN1_OBJECT11001
sk_num00301
TOTAL262020330
Tableau 2
BugsAcc.FPUnk.Files
ASN1_INTEGER_get00202
BIO_ctrl11001
EVP_DigestVerifyFinal11001
EVP_SealInit11001
RAND_bytes11001
SSLStateMachine_read_extract00101
UI_UTIL_read_pw00101
X509_check_purpose00112
asn1_cb00402
asn1_check_tlen00201
asn1_template_noexp_d2i00101
dtls1_retrieve_buffered_fragment00011
get_cert_chain00101
i2b_PVK_bio22002
ocsp_check_issuer00101
TOTAL6614219

Dans un autre projet, Lawall et coll. ont développé un outil, Herodotos[39], qui suit à la trace l'histoire des fragments de code qui correspondent à un patch sémantique donné sur les versions multiples d'un projet de logiciel. Ils ont appliqué Herodotos aux versions OpenSSL 0.9.8a par 0.9.8j, sortis entre 2005 et 2008, et aux semantic pachs définis dans les tableaux 1 et 2, pour obtenir un historique d'erreurs traitant des bugs. Ils ont constaté que presque tous les bugs trouvés ont été présents depuis au moins la version 0.9.8a, avec une poignée introduit à une date ultérieure, en raison d'un certain changement du code ou l'introduction d'un nouveau fichier[38].

Jana et coll. ont aussi cherchĂ© des contrĂŽles d'erreur dans OpenSSL avec leur outil EPEx, en s’assurant en plus que l'erreur soit correctement traitĂ©e. Cela leur a permis de trouver une classe significativement plus grande de traitements des erreurs. Aussi, avec leur approche, ils ont un taux peu Ă©levĂ© de faux positif[40].

CERT C Secure Coding Standard

Olesen et coll. ont adaptĂ© l’outil Coccinelle dans un outil, Clang, pour analyser et certifier des programmes en C, en accord avec le CERT C Secure Coding Standard et le standard MISRA (the Motor Industry Software Reliability Association) C. Ils soutiennent qu'un tel outil doit ĂȘtre fortement adaptable et customisable Ă  chaque projet de logiciel aussi bien qu'aux rĂšgles de certification exigĂ©es par une norme donnĂ©e[41].

Recherche de vulnérabilités sur Android

Lu et coll. ont expĂ©rimentĂ© le langage SmPL de Coccinelle pour Ă©valuer les diffĂ©rentes Ă©ditions d'Android. Ils ciblent principalement trois types d’utilisations dĂ©fectueuses des pointeurs.

Memory not released (Mémoire (en) non libérée)
Si la mémoire dynamique pointée par le pointeur n'est pas libérée aprÚs utilisation, alors il y a une fuite de mémoire.
Null pointer reference (Référence de pointeur nul (en))
Si un pointeur ne se dĂ©clare pas avant qu'il soit utilisĂ© ou un pointeur nul est utilisĂ© comme un objet, il y aura quelques fautes d’utilisations des pointeurs qui peuvent ĂȘtre des vulnĂ©rabilitĂ©s.
Usage of float pointer (Utilisation de pointeur avec virgule flottante)
Lorsque la mémoire ciblée par le pointeur est utilisée et libérée, la mémoire ciblée par le pointeur retourne au systÚme d'exploitation. L'indicateur devient une virgule flottante à 1. S'il n'est pas traité correctement, il y aura une faute (en) de référence du pointeur.

Pour leurs expĂ©rimentations, Lu et coll. ont utilisĂ© trois Ă©ditions diffĂ©rentes d'Android, 2.1, 3.0 et 4.0 pour trouver les possibilitĂ©s de fautes dans les codes. Ils ont obtenu 48 fautes avec Android 2.1, dont il y a 9 vulnĂ©rabilitĂ©s confirmĂ©es. La raison des faux positifs est que Coccinelle n'a pas la capacitĂ© de faire l’analyse de flux de donnĂ©es (en) et ne peut pas couper les branchements qui ne sont pas accessibles[42].

Resultat Android 2.1
Type de FauteFauteErreurTotal
NUMNUMNUM
Mémoire non libérée52225
Référence de pointeur nul31124
Utilisation de pointeur avec virgule flottante189
Resultat Android 3.0
Type de FauteFauteErreurTotal
NUMNUMNUM
Mémoire non libérée94951
Référence de pointeur nul21113
Utilisation de pointeur avec virgule flottante21214
Resultat Android 4.0
Type de FauteFauteErreurTotal
NUMNUMNUM
Mémoire non libérée73640
Référence de pointeur nul22123
Utilisation de pointeur avec virgule flottante1910

Évolutions des performances

Une des premiĂšres observations de Lawall et coll. Ă©tait que la performance pourrait ĂȘtre amĂ©liorĂ©e en ne faisant pas l'analyse syntaxique des fichiers qui ne correspondent pas Ă  un patch sĂ©mantique. En effet, beaucoup de patchs sĂ©mantiques contiennent des mots-clĂ©s comme les noms des fonctions d'API qui doivent les assister pour correspondre et cela arrive peu souvent dans le noyau Linux. Coccinelle a initialement utilisĂ© la commande Unix grep pour trouver les fichiers contenant ces mots-clĂ©s, mais avec des lenteurs, Ă©tant donnĂ© la grande taille de code [43].

Le moteur Coccinelle utilise alors grep, ou l'indexation de texte intégral et d'outil de recherche glimpse[44] si cette option a été activée par l'utilisateur, pour identifier les fichiers qui contiennent au moins un de ces mots clefs[45].

Cette deuxiĂšme approche d'utiliser glimpse pour prĂ©parer un index d'avance et ensuite seulement traiter les fichiers indiquĂ©s par l'index. Comme l'index est plus petit que le code source du noyau et est organisĂ© efficacement, l'utilisation de glimpse amĂ©liore considĂ©rablement la performance, particuliĂšrement pour les patchs sĂ©mantiques qui impliquent des fonctions d'API du noyau. NĂ©anmoins, glimpse Ă©tait Ă  l'origine seulement disponible librement aux utilisateurs universitaires, il a dĂ» ĂȘtre manuellement installĂ© et la crĂ©ation d'un index sur chaque mise Ă  jour de noyau est chronophage. En 2010, Coccinelle a Ă©tĂ© complĂ©tĂ© par le support de id-utils[46], qui fait partie de nombreuses distributions Linux et pour lequel la crĂ©ation d'index est beaucoup plus rapide. En 2013, le support pour les utilisateurs qui n'ont pas d'index disponible a Ă©tĂ© rĂ©Ă©crit pour essentiellement rĂ© implĂ©menter la commande grep dans OCaml, rĂ©duisant les appels de systĂšme et de mieux tenir compte des besoins spĂ©cifiques de Coccinelle[43].

Impact sur Linux

Augmentation des commits Coccinelle

Le sous-systĂšme le plus affectĂ© est celui des drivers (pilotes), avec 57 882 lignes supprimĂ©es et 77 306 lignes rajoutĂ©es, suivies par les sous-systĂšmes arch, fs, net, sound, et include, qui sont tous affectĂ©s par des milliers de lignes supprimĂ©es ou rajoutĂ©es. La prĂ©dominance de drivers n'est pas surprenante, Ă©tant donnĂ© qu’ils composent 67 % du code source du noyau Linux 4.15. Le sous-systĂšme drivers a aussi Ă©tĂ© expĂ©rimentĂ© par d'autres outils de dĂ©couverte de bugs et de fiabilitĂ© de code[47] - [48] - [49] - [50] - [51]. Le taux de lignes changĂ©es par Coccinelle pour le sous-systĂšme drivers reste Ă©levĂ©, mais les rĂ©sultats montrent l'applicabilitĂ© de Coccinelle Ă  travers le noyau[52].

Catégories d'utilisateurs

Différents types de développeurs contribuent au noyau Linux, en soumettant des patchs. Parmi ceux qui mentionnent Coccinelle dans leur historiques de commit, Lawall et coll. distinguent six catégories d'utilisateurs Coccinelle :

Les développeurs Coccinelle
Ce sont les membres de l'équipe de développement Coccinelle et des personnes employées par l'équipe pour disséminer Coccinelle.
Les stagiaires Outreachy
Le noyau Linux participe au programme de stage[53] de Outreachy et les stagiaires peuvent utiliser Coccinelle dans le processus d'application ou le programme de stage.
Utilisateur dédié
C'est un développeur qui utilise Coccinelle dans le noyau pour une petite collection de simples changements largement appropriés.
0-day
C'est un service de test automatisĂ© Intel qui construit et dĂ©marre le noyau Linux pour de multiples configurations de noyau, sur chaque commit pour les centaines d’arbres de git. Ce service de test dirige aussi un certain nombre d'outils d'analyse statiques, y compris Coccinelle, sur le rĂ©sultat de chaque commit.
Les mainteneurs de noyau
Ce sont les développeurs de noyau qui reçoivent et commit les patchs, et sont généralement responsables de quelques sous-systÚmes. Lawall et coll. ont identifié les mainteneurs comme les développeurs qui sont nommés dans le fichier MAINTENERS de Linux 4.15 (1170 développeurs).
Les autres contributeurs
Ces contributeurs peuvent ĂȘtre frĂ©quents ou occasionnels[52].

Références

Bibliographie

Recherches sur l’outil Coccinelle

  • (en) Yoann Padioleau, Julia Lawall et Gilles Muller, « Understanding collateral evolution in Linux device drivers », ACM SIGOPS Operating Systems Review, vol. 40, no 4,‎ , p. 59-71 (ISSN 0163-5980, DOI 10.1145/1218063.1217942)
  • (en) Julia Lawall et Gilles Muller, « Coccinelle: 10 years of Automated Evolution in the Linux Kernel », Proceedings of the 2018 USENIX Annual Technical Conference (USENIX ATC ’18),‎ , p. 601-613 (ISBN 9781931971447)
  • (en) Julia Lawall, « Coccinelle: reducing the barriers to modularization in a large C code base », Proceedings of the companion publication of the 13th international conference on Modularity,‎ , p. 5-6 (ISBN 9781450327732, DOI 10.1145/2584469.2584661)
  • (en) Luis R. Rodriguez et Julia Lawall, « Increasing Automation in the Backporting of Linux Drivers Using Coccinelle », 2015 11th European Dependable Computing Conference (EDCC),‎ , p. 132-143 (ISBN 9781467392891, DOI 10.1109/EDCC.2015.23)
  • (en) Julia Lawall, Ben Laurie, RenĂ© Rydhof Hansen, Nicolas Palix et Gilles Muller, « Finding Error Handling Bugs in OpenSSL Using Coccinelle », 2010 European Dependable Computing Conference,‎ , p. 191-196 (ISBN 9781424465941, DOI 10.1109/EDCC.2010.31)
  • (en) Yoann Padioleau, Julia Lawall, RenĂ© Rydhof Hansen et Gilles Muller, « Documenting and automating collateral evolutions in linux device drivers », Proceedings of the 3rd ACM SIGOPS/EuroSys European Conference on computer systems 2008,‎ , p. 247-260 (ISBN 9781605580135, DOI 10.1145/1352592.1352618)
  • (en) Julia Lawall, Julien Brunel, Nicolas Palix, RenĂ© Rydhof Hansen, Henrik Stuart et Gilles Muller, « WYSIWIB: A declarative approach to finding API protocols and bugs in Linux code », 2009 IEEE/IFIP International Conference on Dependable Systems & Networks,‎ , p. 43-52 (ISBN 9781424444229, DOI 10.1109/DSN.2009.5270354)
  • (en) Julia Lawall, Julien Brunel, Nicolas Palix, RenĂ© Rydhof Hansen, Henrik Stuart et Gilles Muller, « WYSIWIB: exploiting fine‐grained program structure in a scriptable API‐usage protocol‐finding process », Software: Practice and Experience, vol. 43, no 1,‎ , p. 67-92 (ISSN 0038-0644, DOI 10.1002/spe.2102)
  • (en) Julien Brunel, Damien Doligez, RenĂ© Rydhof Hansen, Julia Lawall et Gilles Muller, « A foundation for flow-based program matching: using temporal logic and model checking », POPL '09 Proceedings of the 36th annual ACM SIGPLAN-SIGACT symposium on principles of programming languages,‎ , p. 114-126 (ISBN 9781605583792, DOI 10.1145/1480881.1480897)
  • (en) Gilles Muller, Yoann Padioleau, Julia Lawall et RenĂ© Hansen, « Semantic patches considered helpful », ACM SIGOPS Operating Systems Review, vol. 40, no 3,‎ , p. 90-92 (ISSN 0163-5980, DOI 10.1145/1151374.1151392)
  • (en) Julia Lawall, Gilles Muller et Nicolas Palix, « Enforcing the use of API functions in linux code », Proceedings of the 8th workshop on aspects, components, and patterns for infrastructure software,‎ , p. 7-12 (ISBN 9781605584508, DOI 10.1145/1509276.1509279)
  • (en) Henrik Stuart, RenĂ© Rydhof Hansen, Julia Lawall, Jesper Andersen, Yoann Padioleau et Gilles Muller, « Towards easing the diagnosis of bugs in OS code », Proceedings of the 4th workshop on programming languages and operating systems,‎ , p. 1-5 (ISBN 9781595939227, DOI 10.1145/1376789.1376792)
  • (en) Yoann Padioleau, RenĂ© Rydhof Hansen, Julia Lawall et Gilles Muller, « Semantic patches for documenting and automating collateral evolutions in Linux device driver », Proceedings of the 3rd workshop on programming languages and operating systems,‎ , p. 10-es (ISBN 1595935770, DOI 10.1145/1215995.1216005)
  • (en) Nicolas Palix, Julia Lawall et Gilles Muller, « Tracking code patterns over multiple software versions with Herodotos », Proceedings of the 9th International Conference on aspect-oriented software development,‎ , p. 169-180 (ISBN 9781605589589, DOI 10.1145/1739230.1739250)
  • (en) Suman Saha, Julia Lawall et Gilles Muller, « Finding resource-release omission faults in Linux », ACM SIGOPS Operating Systems Review, vol. 45, no 3,‎ , p. 5-9 (ISSN 0163-5980, DOI 10.1145/2094091.2094094)
  • (en) Peter Senna Tschudin, Laurent RĂ©veillĂšre, Lingxiao Jiang, David Lo, Julia Lawall et Gilles Muller, « Understanding the genetic makeup of Linux device drivers », Proceedings of the Seventh Workshop on programming languages and operating systems,‎ , p. 1-6 (ISBN 9781450324601, DOI 10.1145/2525528.2525536)
  • (en) Julia Lawall et David Lo, « An automated approach for finding variable-constant pairing bugs », Proceedings of the IEEE/ACM international conference on automated software engineering,‎ , p. 103-112 (ISBN 9781450301169, DOI 10.1145/1858996.1859014)
  • (en) TegawendĂ© BissyandĂ©, Laurent RĂ©veillĂšre, Julia Lawall et Gilles Muller, « Ahead of time static analysis for automatic generation of debugging interfaces to the Linux kernel », Automated Software Engineering, vol. 23, no 1,‎ , p. 3-41 (ISSN 1573-7535, DOI 10.1007/s10515-014-0152-4)
  • (en) Mads Chr Olesen, RenĂ© Rydhof Hansen, Julia Lawall et Nicolas Palix, « Coccinelle: Tool support for automated CERT C Secure Coding Standard certification », Science of Computer Programming, vol. 91,‎ , p. 141-160 (ISSN 0167-6423, DOI 10.1016/j.scico.2012.10.011)
  • (en) Julia Lawall, RenĂ© Rydhof Hansen, Nicolas Palix et Gilles Muller, « Improving the Security of Infrastructure Software using Coccinelle », ERCIM News, vol. 83,‎ , p. 54 (ISSN 0926-4981)
  • (en) Jesper Andersen, Anh Cuong Nguyen, David Lo, Julia Lawall et Siau-Cheng Khoo, « Semantic patch inference », Proceedings of the 27th IEEE/ACM International Conference on automated software engineering,‎ , p. 382-385 (ISBN 9781450312042)
  • (en) Nicolas Palix, GaĂ«l Thomas, Suman Saha, Christophe CalvĂšs, Julia Lawall et Gilles Muller, « Faults in linux: ten years later », ACM SIGPLAN Notices, vol. 46, no 3,‎ , p. 305-318 (ISSN 1558-1160, DOI 10.1145/1961296.1950401)

Les autres outils de transformation de programmes

  • (en) Sidney Amani, Peter Chubb, Alastair Donaldson, Alexander Legg, Keng Chai Ong, Leonid Ryzhyk et Yanjin Zhu, « Automatic verification of active device drivers », ACM SIGOPS Operating Systems Review, vol. 48, no 1,‎ , p. 106-118 (ISSN 0163-5980, DOI 10.1145/2626401.2626424)
  • (en) Jörg Liebig, Andreas Janker, Florian Garbe, Sven Apel et Christian Lengauer, « Morpheus: variability-aware refactoring in the wild », Proceedings of the 37th International Conference on software engineering, vol. 1,‎ , p. 380-391 (ISBN 9781479919345)
  • (en) M.M Gallardo, C. Joubert, P. Merino et D. SanĂĄn, « A model-extraction approach to verifying concurrent C programs with CADP », Science of Computer Programming, vol. 77, no 3,‎ , p. 375-392 (ISSN 0167-6423, DOI 10.1016/j.scico.2011.10.003)
  • (en) Christos Kartsaklis et Oscar Hernandez, « HERCULES/PL: the pattern language of HERCULES », Proceedings of the 1st Workshop on programming language evolution,‎ , p. 5-10 (ISBN 9781450328876, DOI 10.1145/2717124.2717127)
  • (en) Jonathan Anderson, Robert Watson, David Chisnall, Khilan Gudka, Ilias Marinos et Brooks Davis, « TESLA: temporally enhanced system logic assertions », Proceedings of the Ninth European Conference on computer systems,‎ , p. 1-14 (ISBN 9781450327046, DOI 10.1145/2592798.2592801)
  • (en) Martin Monperrus, « Automatic Software Repair: A Bibliography », ACM Computing Surveys (CSUR), vol. 51, no 1,‎ , p. 1-24 (ISSN 1557-7341, DOI 10.1145/3105906)
  • (en) Jean-RĂ©my Falleri, FlorĂ©al Morandat, Xavier Blanc, Matias Martinez et Martin Monperrus, « Fine-grained and accurate source code differencing », Proceedings of the 29th ACM/IEEE international conference on automated software engineering,‎ , p. 313-324 (ISBN 9781450330138, DOI 10.1145/2642937.2642982)
  • (en) Benjamin Benni, SĂ©bastien Mosser, Naouel Moha et Michel Riveill, « A delta-oriented approach to support the safe reuse of black-box code rewriters », Journal Of Software-Evolution and Process, vol. 31, no 8,‎ , p. 1-18 (ISSN 2047-7473, DOI 10.1002/smr.2208)

Autres sources scientifiques

  • (en) Andreas Ziegler, Valentin Rothberg et Daniel Lohmann, « Analyzing the Impact of Feature Changes in Linux », Proceedings of the Tenth International Workshop on variability modelling of software-intensive systems,‎ , p. 25-32 (ISBN 9781450340199, DOI 10.1145/2866614.2866618)
  • (en) François Armand, Michel Gien, Gilles MaignĂ© et Gregory Mardinian, « Shared device driver model for virtualized mobile handsets », Proceedings of the First Workshop on virtualization in mobile computing,‎ , p. 12-16 (ISBN 9781605583280, DOI 10.1145/1622103.1622104)
  • (en) Michael Abd-El-Malek, Matthew Wachs, James Cipar, Karan Sanghi, Gregory R. Ganger, Garth A. Gibson et Michael K. Reiter, « File system virtual appliances: Portable file system implementations », ACM Transactions on Storage (TOS), vol. 8, no 3,‎ , p. 1-26 (ISSN 1553-3093, DOI 10.1145/2339118.2339120)
  • (en) Kai Lu, Peng-Fei Wang, Gen Li et Xu Zhou, « Untrusted Hardware Causes Double-Fetch Problems in the I/O Memory », Journal of Computer Science and Technology, vol. 33, no 3,‎ , p. 587-602 (ISSN 1000-9000, DOI 10.1007/s11390-018-1842-3)
  • (en) Wanja Hofer, Christoph Elsner, Frank Blendinger, Wolfgang Shröder-Preikschat et Daniel Lohmann, « Toolchain-independent variant management with the Leviathan filesystem », Proceedings of the 2nd International Workshop on feature-oriented software development,‎ , p. 18-24 (ISBN 9781450302081, DOI 10.1145/1868688.1868692)
  • (en) Vitaly Chipounov et George Candea, « Reverse engineering of binary device drivers with RevNIC », Proceedings of the 5th European conference on computer systems,‎ , p. 167-180 (ISBN 9781605585772, DOI 10.1145/1755913.1755932)
  • (en) Jia-Ju Bai, Yu-Ping Wang, Hu-Qiu Liu et Shi-Min Hu, « Mining and checking paired functions in device drivers using characteristic fault injection », Information and Software Technology, vol. 73,‎ , p. 122-133 (ISSN 0950-5849, DOI 10.1016/j.infsof.2016.01.018)
  • (en) Yanjie Zhen, Wei Zhang, Zhenyang Dai, Junjie Mao et Yu Chen, « Is It Possible to Automatically Port Kernel Modules? », Proceedings of the 9th Asia-Pacific Workshop on systems,‎ , p. 1-8 (ISBN 9781450360067, DOI 10.1145/3265723.3265732)
  • (en) Daniel ChavarrĂ­a-Miranda, Ajay Panyala, Wenjing Ma, Adrian Prantl et Sriram Krishnamoorthy, « Global transformations for legacy parallel applications via structural analysis and rewriting », Parallel Computing, vol. 43,‎ , p. 1-26 (ISSN 0167-8191, DOI 10.1016/j.parco.2015.01.001)
  • (en) Yangyang Zhao, Hareton Leung, Yibiao Yang, Yuming Zhou et Baowen Xu, « Towards an understanding of change types in bug fixing code », Information and Software Technology, vol. 86,‎ , p. 37-53 (ISSN 0950-5849, DOI 10.1016/j.infsof.2017.02.003)
  • (en) Hua Yan, Yulei Sui, Shiping Chen et Jingling Xue, « Spatio-temporal context reduction: a pointer-analysis-based static approach for detecting use-after-free vulnerabilities », Proceedings of the 40th International Conference on software engineering,‎ , p. 327-337 (ISBN 9781450356381, DOI 10.1145/3180155.3180178)
  • (en) Hu-Qiu Liu, Yu-Ping Wang, jia-Ju Bai et Shi-Min Hu, « PF-Miner: A practical paired functions mining method for Android kernel in error paths », The Journal of Systems & Software, vol. 121,‎ , p. 234-246 (ISSN 0164-1212, DOI 10.1016/j.jss.2016.02.007)
  • (en) Yu Lu, Shen Yi et Pan Zulie, « Research on Android Vulnerability Mining Technology Based on Control Flow Analysis », 2016 Sixth International Conference on Instrumentation & Measurement, Computer, Communication and Control (IMCCC),‎ , p. 496-499 (ISBN 9781509011957, DOI 10.1109/IMCCC.2016.20)
  • (en) Laurent Burgy, Marc E. Fiuczynski, Marco Yuen et Robert Grimm, « On reconciling patches and aspects », Proceedings of the 8th workshop on aspects, components, and patterns for infrastructure software,‎ , p. 1-6 (ISBN 9781605584508, DOI 10.1145/1509276.1509278)
  • (en) Paul E. McKenney, « Beyond expert-only parallel programming? », Proceedings of the 2012 ACM workshop on relaxing synchronization for multicore and manycore scalability,‎ , p. 25-32 (ISBN 9781450316323, DOI 10.1145/2414729.2414734)
  • (en) A. Chou, J. Yang, B. Chelf, S. Hallem et D. Engler, « An empirical study of operating systems errors », Operating Systems Review (ACM), vol. 35, no 5,‎ , p. 73-88 (ISSN 0163-5980, DOI 10.1145/502059.502042)
  • (en) Michael Godfrey et Qiang Tu, « Evolution in open source software: a case study », Proceedings 2000 International Conference on Software Maintenance,‎ , p. 131-142 (ISBN 0769507530, DOI 10.1109/ICSM.2000.883030)
  • (en) Shantanu Goel et Dan Duchamp, « Linux Device Driver Emulation in Mach », Proceedings of the USENIX 1996 Annual Technical Conference,‎ , p. 65-74
  • (en) François Armand, « Give a Process to your Drivers! », Proceedings of the EurOpen Autumn 1991 Conference,‎
  • (en) Jorrit N. Herder, Herbert Bos et Andrew S. Tanenbaum, « A Lightweight Method for Building Reliable Operating Systems Despite Unreliable Device Drivers », Technical Report IR-CS-018,‎
  • (en) Dawson Engler, Benjamin Chelf, Andy Chou et Seth Hallem, « Checking System Rules Using System-Specific, Programmer-Written Compiler Extensions », Proceedings of the Fourth USENIX Symposium on Operating Systems Design and Implementation (OSDI),‎ , p. 1-16
  • (en) G.C. Necula, S. McPeak, S.P. Rahul et W. Weimer, « CIL: Intermediate language and tools for analysis and transformation of C programs », 11th International Conference on Compiler Construction, Proceedings, vol. 2304,‎ , p. 213-228 (ISSN 0302-9743)
  • (en) E. Visser, « Program transformation with Stratego/XT rules, strategies, tools, and systems in Stratego/XT 0.9 », Lecture Notes in Computer Science (including subseries Lecture Notes in Artificial Intelligence and Lecture Notes in Bioinformatics, vol. 3016,‎ , p. 216-238 (ISBN 3540221190)
  • (en) Suman Jana, Yuan Kang, Samuel Roth et Baishakhi Ray, « Automatically Detecting Error Handling Bugs Using Error Specifications », Proceedings of the 25th USENIX Security Symposium,‎ , p. 345-362 (ISBN 978-1-931971-32-4)
  • (en) Udi Manber et Sun Wu, « GLIMPSE: A Tool to Search Through Entire File Systems », Proceedings of the 1994 Winter USENIX Technical Conference,‎ , p. 1-10
  • (en) Aravind Machiry, Chad Spensky, Jake Corina, Nick Stephens, Christopher Kruegel et Giovanni Vigna, « DR. CHECKER: A soundy analysis for Linux kernel drivers », USENIX Security,‎ , p. 1007-1024 (ISBN 978-1-931971-40-9)
  • (en) Fabrice MĂ©rillon, Laurent RĂ©veillĂšre, Charles Consel, Renaud Marlet et Gilles Muller, « Devil : An IDL for Hardware Programming », Proceedings of the 4th conference on Symposium on Operating System Design & Implementation, vol. 4, no 2,‎
  • (en) Matthew J. Renzelmann, Asim Kadav et Michael M. Swift, « Symdrive: Testing drivers without devices », 10th USENIX Symposium on Operating Systems Design and Implementation (OSDI ’12), vol. 4, no 2,‎ , p. 279-292 (ISBN 978-1-931971-96-6)
  • (en) Leonid Ryzhyk, John Keys, Balachandra Mirla, Arun Raghunath, Mona Vij et Gernot Heiser, « Improved device driver reliability through hardware verification reuse », ACM SIGARCH Computer Architecture News, vol. 47, no 4,‎ , p. 133 (ISSN 0163-5964, DOI 10.1145/1961295.1950383)
  • (en) Michael Swift, Muthukaruppan Annamalai, Brian Bershad et Henry Levy, « Recovering device drivers », ACM Transactions on Computer Systems (TOCS), vol. 24, no 4,‎ , p. 333-360 (ISSN 1557-7333, DOI 10.1145/1189256.1189257)
  • (en) Michael R. A. Huth et Mark D. Ryan, « Logic in Computer Science: Modelling and reasoning about systems », Cambridge University Press,‎ , p. 1-3 (ISBN 0521652006)

Liens externes

Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.