Les fonctionnalités C++ interdites dans Chromium
(chromium.googlesource.com)- Le projet Chromium définit clairement le périmètre d’utilisation et les éléments interdits des fonctionnalités des standards C++ récents afin de préserver la cohérence du code et la sécurité
- De C++11 à C++23, chaque standard distingue les états autorisé, interdit et à examiner (TBD), et la bibliothèque Abseil est soumise aux mêmes critères
- Parmi les fonctionnalités interdites figurent std::shared_ptr, std::function, std::regex, std::filesystem, std::byte, char8_t, modules, etc.
- Parmi les fonctionnalités autorisées figurent concepts, l’opérateur spaceship, designated initializer, std::to_underlying, les algorithmes std::ranges, etc.
- Ce guide s’applique à Chromium et à l’ensemble de ses sous-projets, et sert de référence clé pour garantir la stabilité du code et la compatibilité de build
Politique d’utilisation du C++ moderne dans Chromium
- Chromium n’adopte pas immédiatement les nouveaux standards C++ et les classe en état « initially supported » uniquement une fois que le support de la toolchain est suffisamment assuré
- Les fonctionnalités sont ensuite classées selon les statuts autorisé (allowed), interdit (banned) et à examiner (TBD)
- Les propositions de changement de statut pour une nouvelle fonctionnalité peuvent être soumises via la mailing list cxx@chromium.org
- Deux ans après le support initial, chaque fonctionnalité est déplacée vers la liste des éléments autorisés ou interdits après examen explicite
Fonctionnalités interdites de C++11
- Fonctionnalités du langage : inline namespace, long long, user-defined literals
- Fonctionnalités de bibliothèque :
,,engines,,,, etc.- Les exceptions sont entièrement désactivées, et seul
noexceptest autorisé - À la place de
std::bind,std::function,std::shared_ptr,std::weak_ptr, Chromium utilise base::Bind, base::Callback, base::RefCounted
- Les exceptions sont entièrement désactivées, et seul
Fonctionnalités interdites de C++17
- Les littéraux de caractères UTF-8 (u8) sont interdits en raison de problèmes de compatibilité avec
char8_t - Éléments de bibliothèque interdits :
- fonctions mathématiques spéciales, algorithmes parallèles,
std::any,std::byte,std::filesystem, ressources mémoirestd::pmr, etc. - Les algorithmes parallèles sont interdits en raison de l’absence de prise en charge dans libc++ et de craintes de conflit avec le modèle de threading de Chrome
- fonctions mathématiques spéciales, algorithmes parallèles,
Fonctionnalités autorisées et interdites de C++20
- Fonctionnalités du langage autorisées :
- concepts, consteval, designated initializers, l’opérateur spaceship, [[likely]], la syntaxe d’initialisation de range-for
- Fonctionnalités de bibliothèque autorisées :
,,,,std::erase_if,std::ranges::subrange,std::to_underlying, etc.
- Fonctionnalités interdites :
- char8_t, modules, [[no_unique_address]],
std::bit_cast, ``,std::bind_front,std::ranges::view_interface
- char8_t, modules, [[no_unique_address]],
- À examiner (TBD) : coroutine,
,,std::u8string
Fonctionnalités autorisées et à examiner de C++23
- Fonctionnalités du langage autorisées :
#elifdef,if consteval, static operator - Fonctionnalités de bibliothèque autorisées :
std::byteswap,std::basic_string::contains,std::to_underlying, extensions des algorithmesstd::ranges - Fonctionnalités à examiner :
std::expected,std::mdspan,std::generator,std::stacktrace,std::print,[[assume]],#warning, etc.
Politique pour la bibliothèque Abseil
- Composants Abseil interdits :
absl::any,absl::optional,absl::StatusOr,absl::Span,absl::FunctionRef,absl::Mutex,absl::Time,absl::btree_*, etc.- La plupart sont remplacés par les implémentations du namespace base de Chromium (
base::span,base::expected,base::Bind, etc.)
- À examiner (TBD) :
absl::linked_hash_set,absl::linked_hash_map
Sens général
- Chromium n’accepte pas automatiquement les fonctionnalités du C++ standard et les applique de façon sélective selon des critères de stabilité de build, de sécurité, de performance et de cohérence du code
- La plupart des fonctionnalités interdites le sont à cause de doublons d’implémentation (
base::) ou de problèmes de toolchain et de compatibilité ABI - Ce guide sert de référentiel de gestion de la qualité du code C++ dans l’écosystème Chromium et constitue un document de référence indispensable pour la collaboration open source
3 commentaires
C’est dommage que le C++ continue de s’alourdir pour préserver la rétrocompatibilité...
C’est vraiment un langage immense, comme le disent les avis sur HN, ce C++ ...
Avis Hacker News
Rien de particulièrement frappant, mais l’essentiel revient à dire : « utilisons des bibliothèques internes adaptées à nos usages ».
Le reste paraît assez raisonnable, comme éviter les problèmes de locale. Il y a aussi des options pour lisser les aspérités de la bibliothèque standard, donc cela se comprend.
chrono, donc ils ont créé leur propre type de temps, et ils utilisaient déjà leurs propres conteneurs avant la stabilisation de la STL.Si on lançait un nouveau projet aujourd’hui, la plupart de ces règles n’auraient probablement plus de sens.
char8_test intéressante. Il n’existe quasiment plus d’encodages autres que l’UTF-8, et commechar8_t*n’est pas compatible avecchar*, ils recommandent d’utiliserstd::stringoustd::string_viewpour éviter une prolifération de castings.En lisant les commentaires sur les vieilles bases de code, je me suis souvenu du moment où Chromium est sorti pour la première fois.
C’est toujours frappant de réaliser que cette base de code a commencé il y a déjà 20 ans.
Interdire
<regex>était une bonne décision. On ne pouvait pas vraiment l’utiliser, car il ne gérait pas correctement l’UTF-8. C’est étonnant qu’une conception aussi défaillante ait été standardisée.Il y a des documents plus intéressants dans le répertoire parent.
Le guide de style C++ de Chromium mérite le détour.
Les exceptions sont interdites, mais il y a une exception pour Windows.
Ce n’est donc pas un rejet philosophique des exceptions, mais une interdiction pour des raisons pratiques. Ils disent eux-mêmes qu’ils feraient autrement s’ils recommençaient depuis le début.
[[no_unique_address]], donc j’imagine que j’ai raté la blague.La liste des fonctionnalités interdites est si longue qu’elle semble plus grande que l’ensemble des fonctionnalités du C. C’est écrasant.
Interdire les littéraux
u8"..."est un bon choix. Si le code source est déjà en UTF-8, il n’y a pas besoin de préfixe supplémentaire.C’est le genre de littéral où la solution est arrivée avant le problème.
J’aimerais trouver les alternatives aux fonctionnalités interdites. Par exemple, il est dit que
<filesystem>manque de support pour les tests et présente des failles de sécurité.<filesystem>fait exception.base/files.Les modules sont interdits. J’aurais préféré qu’ils copient simplement le système de modules du langage D.
Cette liste d’interdictions montre que, plus que les fonctionnalités récentes, c’est le contexte qui compte. Dans une petite application, cela passe, mais dans un projet à grande échelle, cela devient risqué.
La portabilité entre différentes plateformes entre aussi en ligne de compte.