Pierre Bouvier : Proposition d'amélioration de la gestion des chemins d'accès par la bibliothèque C standard

De Ensiwiki
Aller à : navigation, rechercher
Cornues.png
Titre du projet Towards a better libc primitive for handling path names
Cadre IRL

Labo INRIA Montbonnot
Équipe CONVECS
Encadrants Hubert Garavel


Introduction

Les développeurs C s'appuient sur la bibliothèque standard du langage C (appelée libc), qui est présente dans tous les systèmes d'exploitation majeurs et qui fournit des primitives essentielles pour la gestion de la mémoire, des entrées/sorties, etc.

Dans cette bibliothèque, trois fonctions sont utilisées pour la gestion des chemins d'accès : basename, dirname et realpath. Ces fonctions étant basiques et la gestion des chaînes étant complexe en C, la plupart des opérations usuelles en C demandent d'écrire du code supplémentaire, fastidieux, redondant entre les différents projets et ayant une forte probabilité de posséder des erreurs.

Cet IRL étudie comment on peut améliorer la bibliothèque C standard afin de résoudre les problèmes de ces trois fonctions.

Présentation rapide des trois fonctions étudiées

La fonction char *basename(char *p) extrait le dernier composant du chemin p donné en argument, ie la sous-chaîne qui suit le dernier caractère '/' du chemin p.

La fonction char *dirname(char *p) extrait le chemin privé de son dernier composant, sans caractère '/' terminal.

La fonction char *realpath(const char *p, char *res) donne le chemin absolu, canonique (sans '.', ni '..' superflu) et sans lien symbolique, correspondant à p. Le résultat est écrit dans la chaîne pointée par res ou dans une nouvelle chaîne si res est le pointeur nul. Si le chemin p ne peut être parcouru, realpath retourne un pointeur nul et positionne un errno adéquat.

Liens externes :

Discussion critique de basename, dirname et de realpath

Les définitions de basename, dirname et realpath au sein de la norme les définissant, POSIX, ont été étudiées dans ce projet d'IRL, ainsi que leurs implémentations au sein de douze bibliothèques C standard représentatives de différentes familles de systèmes UNIX.

On a pu constater que six problèmes étaient présent dans ces fonctions et que la stabilité de leurs spécifications et implémentations n'est qu'apparente.

Analyse d'utilisation de ces fonctions étudiées

Le code de GCC, Git et de FreeBSD a été analysé afin de déterminer les usages les plus courants des fonctions basename, dirname et realpath. Sur cette base de 20.3 millions de lignes, 1268 fichiers différents ont été analysés, qui présentaient 5668 occurrences des fonctions considérées, dans 10 langages de programmation.

Au final, une classification des 17 usages les plus fréquents de basename, dirname et realpath a été réalisée.

Extensions proposées dans d'autres langages que le C

Pour aller au delà des problèmes de manipulation de chemin rencontrés avec le langage C, nous avons étudié six autres langages (Go, Java, Python, Rust, Shell et TCL) qui apportent des éléments de réponse à certains problèmes de C, mais ne résolvent pas entièrement les problèmes rencontrés. De plus, aucun des langages ne couvre totalement notre classification des 17 usages fréquents rencontrés. Cela montre que le problème abordé n'est pas évident à résoudre.

Proposition d'une solution

Comme aucun autre langage n'apportait une réponse satisfaisante aux problèmes soulevés, il nous a paru utile et légitime de proposer une nouvelle solution, qui plus est adaptée à ce dernier.

Notre solution consiste en une nouvelle fonction unique qui remplace basename, dirname et realpath et permet d'effectuer des opérations de manipulation de chemins en évitant les manipulations de ces chaînes, qui sont complexes en C. Cette solution repose sur des opérations élémentaires facilement composables, ce qui permet ainsi de satisfaire l'ensemble des usages précédemment cités, tout en résolvant les problèmes soulevés.

Conclusion

J'ai choisi cet IRL car j'ai déjà été confronté à la pénibilité de la manipulation des chemins en C et avais conscience de différents problèmes affectant les fonctions basename, dirname et realpath.

Une analyse des causes des problèmes de ces fonctions a été faite, une étude de ce que proposent les autres langages a été réalisée et, finalement, une solution adaptée au langage C a été proposée. L'objectif de cet IRL était d'analyser l'existant et de proposer une solution.

Nous allons poursuivre ce projet pendant le mois de juin afin d'implémenter la solution proposée.

Remerciements

Auparavant, je ne connaissais réellement que le métier d'ingénieur et n'avait qu'une vision floue de la recherche. Cet IRL m'a permis de découvrir ce monde de mes propres yeux, avec un contact privilégié, Monsieur Garavel.

Je tiens à le remercier pour m'avoir donné la possibilité de participer à ce projet au sein de son équipe, avec un sujet passionnant. Faire ce module avec un encadrant aussi bon, que ce soit sur le plan scientifique et sur le plan humain était une véritable chance.

J'ai également particulièrement apprécié sa disponibilité et son aide tout au long du semestre.