Microsoft rend open source Checked C, une version du langage C
Qui permet aux développeurs d'écrire des programmes C plus sécurisés et fiables

Le , par Michael Guilloux

0PARTAGES

11  0 
Une bonne partie du système logiciel existant, qu’il s’agisse des systèmes d'exploitation, des navigateurs, des bases de données ou encore des interprètes de langage de programmation, repose sur le langage C ou sur C++, qui lui-même est basé sur C.

Mais comme l’explique Microsoft dans un billet de blog, il y a certains types d'erreurs de programmation tels que les dépassements de mémoire tampon que les programmeurs peuvent faire pendant qu’ils écrivent des programmes C ou C++ ; lesquelles erreurs pouvant conduire à des failles de sécurité ou des problèmes de fiabilité du logiciel.

Pour s’attaquer à ce problème et pour permettre aux développeurs d’écrire des programmes C plus sécurisés et plus fiables, Microsoft a donc commencé le développement de Checked C. Il s’agit d’une extension du langage C qui permettra aux développeurs d'ajouter un contrôle statique et dynamique à leurs programmes. Cela, dans le but de détecter ou éviter les erreurs de programmation courantes telles que les dépassements de mémoire tampon entre autres. Checked C pourra donc être utilisé avec des programmes en cours d’exécution ou pendant qu'ils sont en cours d'écriture.

Microsoft Research rend maintenant son projet open source pour permettre aux chercheurs et aux développeurs de contribuer à la spécification et à l'implémentation du compilateur sur GitHub.

Ce qu’il est important de noter, c’est que Checked C devrait être compatible avec les programmes C existants, dans la mesure où les changements introduits par le langage open source n’invalident pas le code C existant. Microsoft souligne en effet que les programmes C existants « peuvent être modifiés de manière incrémentielle d’une manière rétrocompatible pour avoir ce contrôle » offert par Checked C. Ainsi, les développeurs n’auront pas besoin de convertir tout leur programme en même temps. Selon leur choix, ils pourront convertir leur code fichier par fichier ou fonction par fonction. Cela en soi donne un grand avantage à Checked C qui pourrait inciter les développeurs à l’adopter une fois qu’il sera officiellement disponible.

En ce qui concerne la chaine d’outils pour accompagner Checked C, il faut noter que Microsoft travaille également sur l’implémentation d’une version de LLVM/clang modifiée pour supporter l’extension open source du langage C. Checked C et sa spécification sont disponibles sur GitHub.

Sources : Microsoft Research, Dépôt Checked C, Dépôt LLVM pour Checked C, Dépôt clang pour Checked C

Et vous ?

Que pensez-vous de ce nouveau projet open source de Microsoft ?

Une erreur dans cette actualité ? Signalez-le nous !

Avatar de MagnusMoi
Membre confirmé https://www.developpez.com
Le 16/06/2016 à 16:47
Autant j'aime bien Microsoft, autant là où est l'intérêt ?

Si tu fait du C et que tu as peur des dépassements mémoires, ou de mal gérer la mémoire :
=> tu te fais ta structure pour stocker un pointeur et la taille allouée
=> tu te crées une liste global d'instance de cette structure
=> tu te crées une fonction "find" sur une liste de cette structure pour trouver l'index d'un pointeur
=> tu te crées une fonction "getsizeof" appelant celle "find" pour obtenir la taille alloué à un pointeur
=> tu te crées une fonction "Mon_malloc" appelant malloc et stockant le pointeur dans une instance de structure, elle même mise dans la liste globale
=> tu te crées une fonction "Is_alloc" appelant ta fonction "find" sur la liste global, retournant 0 ou 1
=> tu te crées une fonction "Mon_free" appelant ta fonction "find" sur la liste global, et qui si il trouve le pointeur, le retire (retire la structure le contenant) de la liste globale, puis le détruit avec "free"
=> tu te crées une fonction "clear_all" appelant qui supprime tous les pointeurs de la liste global (évidemment, on ne l'utilise que en fin de programme !!!)
Du coup quand tu alloues ou veux vérifier un pointeur pas de soucie !
Est-ce long à coder et mettre en place ?
nope !
Et puis-je le mettre dans une bibliothèque ?
Yep !

So what ?

Just do it yourself !
Avatar de Ph. Marechal
Nouveau membre du Club https://www.developpez.com
Le 16/06/2016 à 23:44
Autant C est beau que Microsoft est laid
Au risque de me faire ésharpé !
Avatar de Guntha
Membre éprouvé https://www.developpez.com
Le 17/06/2016 à 10:00
Citation Envoyé par MagnusMoi Voir le message
Autant j'aime bien Microsoft, autant là où est l'intérêt ?

Si tu fait du C et que tu as peur des dépassements mémoires, ou de mal gérer la mémoire :
=> tu te fais ta structure pour stocker un pointeur et la taille allouée
=> tu te crées une liste global d'instance de cette structure
=> tu te crées une fonction "find" sur une liste de cette structure pour trouver l'index d'un pointeur
=> tu te crées une fonction "getsizeof" appelant celle "find" pour obtenir la taille alloué à un pointeur
=> tu te crées une fonction "Mon_malloc" appelant malloc et stockant le pointeur dans une instance de structure, elle même mise dans la liste globale
=> tu te crées une fonction "Is_alloc" appelant ta fonction "find" sur la liste global, retournant 0 ou 1
=> tu te crées une fonction "Mon_free" appelant ta fonction "find" sur la liste global, et qui si il trouve le pointeur, le retire (retire la structure le contenant) de la liste globale, puis le détruit avec "free"
=> tu te crées une fonction "clear_all" appelant qui supprime tous les pointeurs de la liste global (évidemment, on ne l'utilise que en fin de programme !!!)
Du coup quand tu alloues ou veux vérifier un pointeur pas de soucie !
Est-ce long à coder et mettre en place ?
nope !
Et puis-je le mettre dans une bibliothèque ?
Yep !

So what ?

Just do it yourself !
Ça, ça détecte les fuites, mais pas les corruptions, qui dans certains cas pourraient être détectées facilement à la compilation (genre dans le cas d'un tableau de taille statique; Java le fait d'ailleurs).
Avatar de Uther
Expert éminent sénior https://www.developpez.com
Le 17/06/2016 à 10:27
Citation Envoyé par MagnusMoi Voir le message
So what ?

Just do it yourself !
Si c’était aussi simple que ça ça fait longtemps que les erreur mémoires en C auraient disparu, si on veut vraiment sécuriser le C il faut faire bien plus. Y'a qu'a voir tous les mécanismes qu'a du introduire le langage Rust pour arriver a faire ça sans Garbage Collector.
Je suis curieux de voir comment Microsoft compte s'y prendre en restant sur une base aussi peut adaptée à la sécurité que le C. J'ai pas encore lu les specs (saleté de format Latex), mais j'ai l'impression que ça va être bien loin de ce que propose Rust.

Citation Envoyé par Ph. Marechal Voir le message
Autant C est beau
On va dire que l'amour est aveugle alors.
Avatar de Ph. Marechal
Nouveau membre du Club https://www.developpez.com
Le 17/06/2016 à 12:50
"...il y a certains types d'erreurs de programmation tels que les dépassements de mémoire tampon que les programmeurs peuvent faire pendant qu’ils écrivent des programmes C..." : autant apprendre à bien utiliser C ainsi qu'un bon compilateur / débogueur, c'est une tâche passionnante que d'apprendre à corriger ses erreurs !
Chaque multinationale veut créer son propre petit langage / framework ou autre machine virtuelle, curieusement elles utilisent C pour ce faire
C est un langage magnifique par ses performances et la liberté qu'il offre et valgrind est un vieux copain.
Avatar de Uther
Expert éminent sénior https://www.developpez.com
Le 17/06/2016 à 14:02
Citation Envoyé par Ph. Marechal Voir le message
"...il y a certains types d'erreurs de programmation tels que les dépassements de mémoire tampon que les programmeurs peuvent faire pendant qu’ils écrivent des programmes C..." : autant apprendre à bien utiliser C ainsi qu'un bon compilateur / débogueur, c'est une tâche passionnante que d'apprendre à corriger ses erreurs !
C'est peut-être passionnant a déboguer pour toi, mais c'est surtout un risque de comportements anormaux, ou même de failles de sécurité, si ça n'est pas détecté. Et dire "Y'a qu'a bien faire", c'est bien beau, mais tant que les humains seront faillibles, ça n'est clairement pas la solution.
C'est quelque chose qui peux parfois être très vicieux et même les meilleurs peuvent se faire avoir.

Citation Envoyé par Ph. Marechal Voir le message
Chaque multinationale veut créer son propre petit langage / framework ou autre machine virtuelle, curieusement elles utilisent C pour ce faire
Ce n'est plus systématique.
Par exemple le compilateur Go est maintenant entièrement écrit en Go. Le compilateur Rust était en OCaml avant d'être réécrit en Rust avec une base LLVM (en C++)

Citation Envoyé par Ph. Marechal Voir le message
C est un langage magnifique par ses performances et la liberté qu'il offre et valgrind est un vieux copain.
C'est tout le problème du C. Il est tellement omniprésent qu'il est systématiquement utilisé pour le bas niveau malgré ses défauts, parce que la plupart des gens qui font du bas niveau ne connaissent que ça, ce qui entretient son omniprésence.
Du coup plutôt que d’empêcher les erreurs en amont, on accumule les outils permettant de limiter la casse.
Avatar de Grogro
Membre extrêmement actif https://www.developpez.com
Le 21/06/2016 à 10:05
Pour un développeur java qui n'a pas touché au C depuis la L2 de fac (et encore, une fac de physique ), et qui n'a pas la moindre idée des problématiques de gestion de la mémoire, vous pouvez résumer les difficultés du C ?
Avatar de Médinoc
Expert éminent sénior https://www.developpez.com
Le 21/06/2016 à 11:07
Et pendant ce temps-là, on attend toujours C99, sans parler de C11...
Avatar de Uther
Expert éminent sénior https://www.developpez.com
Le 21/06/2016 à 21:50
Citation Envoyé par Grogro Voir le message
Pour un développeur java qui n'a pas touché au C depuis la L2 de fac (et encore, une fac de physique ), et qui n'a pas la moindre idée des problématiques de gestion de la mémoire, vous pouvez résumer les difficultés du C ?
Ca va être dur de faire un cours de sécurité en un message mais le principaux problèmes qui me viennent en tête sont:
  • Le dépassement de mémoire : En gros dans un tableau de taille 10, on essaie d'écrire le 11eme élément. On va donc écrire dans une zone mémoire située après le tableau qui n'a rien a voir et qui si ça ne plante pas va probablement provoquer des comportement incohérents du programme qui peuvent mener a une faille de sécurité.
  • L'utilisation après libération : Quand on a besoin de mémoire on la réserve et on obtient un pointeur vers la zone mémoire. Une fois libérée cette mémoire peut-être ré-allouée ailleurs. Donc si on continue à utiliser l'ancien pointeur on va avoir deux pointeurs qui pointent vers une même zone pour faire des choses qui n'ont rien à voir. La encore le programme devient imprévisible et des faille sont souvent a la clé
  • La double libération. Quand on essaie de libérer une zone mémoire déjà libérée, on a au mieux un plantage mais il peut se passer tout un tas de chose bizarres. Par exemple on peut désallouer la zone mémoire qui avait été ré-allouée entre temps, provoquant une utilisation après libération à l'autre bout du programme.
  • Les comportements non définis. De nombreux points de la spécification du C sont volontairement non définis et laissent le compilateur libre de faire ce qu'il veux. Il vaut mieux les éviter au risque de se retrouver avec des comportements imprévisibles suivant les envies d'optimisation du compilateur.

Certaines de ces erreurs peuvent te paraître grossières quand on les explique simplement, mais je te garantis que dans les programmes complexes, il est bien plus facile qu'on ne le croit de les faire sans que ce soit évident a détecter.
Avatar de Christian Olivier
Chroniqueur Actualités https://www.developpez.com
Le 10/09/2018 à 14:18
Microsoft publie un document décrivant les progrès réalisés dans le cadre du projet Checked C
Visant à rendre le développement sous C plus sûr

Une bonne partie de l’environnement logiciel existant (navigateurs, bases de données, interprètes de langage de programmation ou systèmes d’exploitation pour ne citer que ceux-là) repose toujours sur le C, un langage de programmation qui a fait son apparition dans les années 70 et qui est à la base de nombreux autres langages tels que le C++ et le C #.

En 2016, Microsoft a lancé une initiative qui, à terme, devait permettre de rendre le développement sous C plus fiable et plus sûr. Baptisé Checked C, cette initiative visait l’introduction d’une nouvelle extension du langage C qui serait rétro compatible et intègrerait des outils de vérifications et des garde-fous afin de limiter la survenue d’erreurs durant les phases de développement et l’apparition ultérieure de bogues et/ou de vulnérabilités au sein des logiciels codés en C.

Microsoft a récemment publié un document décrivant les progrès réalisés par ses équipes dans le cadre de son projet visant à rendre le développement sous C plus fiable et plus sûr. Il sera présenté lors de la conférence sur le développent et la cybersécurité de l’IEEE (IEEE SecDev) qui sera organisé du 30 septembre au 2 octobre 2018 à Cambridge, aux États-Unis.

Ce document confirme que Checked C permettra aux développeurs d’ajouter un contrôle statique et dynamique à leurs programmes pour les aider à déceler plus rapidement ou à éviter les erreurs de programmation courantes telles que le « ;buffer overflow ;» (les dépassements de mémoire tampon) ou les erreurs de conversion de type d’objets.

Il révèle ainsi qu’afin de garantir un meilleur contrôle sur les pointeurs, Checked C utilise une forme de pointeur vérifié, dont les accès peuvent être vérifiés statiquement ou dynamiquement. Checked C a été conçu comme une extension du compilateur Clang/LLVM et devrait introduire les notions de « ;checked region ;» et « ;bounds-safe interfaces ;». Signalons au passage que les programmes codés en C pourront être convertis vers Checked C de manière progressive, fonction par fonction, grâce à la conversion incrémentielle.

Checked C proposera aussi des outils permettant de procéder à des vérifications durant l’écriture du code source, avant que celui-ci ne soit compilé et exécuté.

Source : Checked C (PDF)

Et vous ?

Qu’en pensez-vous ?
Contacter le responsable de la rubrique Accueil

Partenaire : Hébergement Web