Sortie de LLVM et Clang 8.0
Le compilateur C++ finalise son implémentation de WebAssembly et ajoute des sécurités pour la faille Spectre

Le , par dourouc05

67PARTAGES

12  0 
LLVM est une brique logicielle pour la création de compilateurs. Ses développeurs parlent d'une collection de modules réutilisables pour les compilateurs et outils liés. Clang est probablement le compilateur issu de LLVM le plus connu ; prévu pour C, C++ et Objective-C, il s'est distingué de GCC, au début, pour sa rapidité de compilation et la qualité de ses messages d'erreur. Au fil du temps, LLVM est devenu un terrain d'exploration pour la recherche en informatique (théorie des langages et de la compilation) et le développement de nouveaux compilateurs.

La version 8.0 est sortie il y a peu. Celle-ci marque notamment le port WebAssembly comme mature. Elle est donc disponible par défaut. WebAssembly permet d'utiliser n'importe quel langage de programmation à l'intérieur d'un navigateur Web, à l'aide d'une procédure de compilation vers un format binaire aussi dénommé WebAssembly. Le format de fichier intermédiaire et son ABI sont considérés comme stables, même si du versionnage est prévu dans les structures de données (pour ajouter, plus tard, la possibilité de renvoyer des structures depuis une fonction — dès que WebAssembly le permettra — ainsi que le multifil, implémenté par exemple depuis fin 2018 par Chrome).

La sécurité est aussi prise au sérieux avec cette nouvelle version. Clang 8.0 ajoute une sécurité contre la faille Spectre sur les processeurs x86, le durcissement des chargements spéculatifs (SLH, speculative load hardening). Elle ne peut être activée qu'au niveau d'une fonction, par exemple parce qu'elle traite des données particulièrement sensibles (comme une clé privée), car l'impact en termes de performance est assez prononcé. Spectre est aussi présente sur les plateformes ARM. L'architecture ARM 8.5 propose l'instruction BTI (branch target identification) pour marquer les cibles valides lors d'un branchement indirect (saut vers une instruction dont l'adresse est variable plutôt que fixe) et LLVM peut l'émettre : si le programme demande un branchement vers une zone qui n'est pas autorisée, le processeur n'effectue aucun branchement et lance une exception (à charge du système d'exploitation de la gérer).

Entre sécurité et défauts difficiles à reproduire, Clang propose une option pour initialiser automatiquement les variables qui ne le sont pas : si on tente de lire leur contenu, on fait face à un comportement indéfini (par les normes C et C++). Dans le pire des cas, des données sensibles pourraient fuiter par ce biais. L'option en question est -ftrivial-auto-var-init=pattern.

L'optimisation des programmes peut fortement bénéficier de mesures effectuées lors d'une réelle utilisation, afin de déterminer les parties du code qui doivent être le plus optimisées (par exemple, en mesurant la probabilité d'un branchement, on peut s'arranger pour que le cas le plus courant dispose de tout le code à exécuter dans les caches du processeur). Cependant, si on effectue une refactorisation du code, même légère, le profil enregistré n'est plus vraiment utile. Clang propose d'utiliser un fichier de renommages pour continuer à utiliser les données précédentes, malgré le renommage.

Du côté d'OpenMP, une norme prévue pour faciliter la conversion de code pour qu'il s'exécute en parallèle, une série de fonctionnalités de la version 5.0 de la norme ont été implémentées. Le moteur d'exécution sur cartes graphiques NVIDIA (à travers CUDA) a aussi été retravaillé pour une meilleure performance.

Sources : LLVM 8.0.0 Release Notes,

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


 
Contacter le responsable de la rubrique C++

Partenaire : Hébergement Web