Qu’est-ce que la rouille non sûre ?
Les garanties de sécurité de la mémoire sont l’un des arguments de vente de Rust ; cependant, Rust n’est pas à l’abri des bogues et des vulnérabilités. Comme le vérificateur d’emprunts de Rust applique le modèle de propriété, il y a un léger compromis dans le temps de compilation lors des vérifications de sécurité.
Rust fournit une fonctionnalité pour contourner les contrôles de sécurité dans une fonction appelée « Unsafe Rust » qui vous permet d’éviter ces contrôles de sécurité à des fins de performance. Unsafe Rust est un outil puissant pour écrire des logiciels de systèmes de bas niveau efficaces avec Rust.
Comprendre Unsafe Rust
Unsafe Rust est un ensemble de fonctionnalités que vous pouvez utiliser pour contourner les garanties de sécurité de Rust en échange d’un plus grand contrôle sur la mémoire. Les caractéristiques non sûres de Rust comprennent les pointeurs bruts, les fonctions non sûres et les traits non sûrs.
L’objectif de unsafe Rust est de fournir aux développeurs la possibilité d’écrire du code système de bas niveau sans sacrifier les performances. Vous pouvez accéder aux ressources mémoire et les manipuler directement et augmenter les performances de votre application avec unsafe Rust.
Unsafe Rust est particulièrement utile pour le développement de systèmes d’exploitation, la programmation de réseaux et le développement de jeux, où les performances sont essentielles. Dans ces contextes, vous aurez besoin d’un contrôle fin sur l’agencement de la mémoire du programme et le comportement du code. Unsafe Rust vous permet d’y parvenir en fournissant des abstractions de bas niveau pour la mise en œuvre d’algorithmes et de structures de données complexes.
Travailler avec Unsafe Rust
Les blocs non sécurisés fournissent les fonctionnalités permettant d’utiliser les caractéristiques non sécurisées de Rust. Vous utiliserez les blocs non sécurisé pour définir des blocs non sûrs contenant du code Rust valide.
Voici comment utiliser un bloc unsafe pour accéder directement à la mémoire afin de modifier une valeur :
Le x est un nombre entier mutable. Dans la variable non sécurisé le pointeur brut vers x attribue une nouvelle valeur à x. Le code dans l’élément non sécurisé est valide mais non sûr, et n’était pas dans un bloc non sûr ; le programme se bloque.
En outre, vous pouvez définir des fonctions non sûres en ajoutant l’élément unsafe avant le mot-clé fn dans vos déclarations de fonctions.
Vous aurez besoin d’un bloc non sécurisé pour appeler des fonctions non sécurisées dans d’autres parties de votre programme.
Marquer les fonctions avec le mot-clé non sûres ne signifie pas que la fonction est intrinsèquement dangereuse. Il indique que la fonction contient du code dont l’utilisation nécessite des précautions supplémentaires.
Les risques associés à l’utilisation de la rouille non sûre
L’utilisation incorrecte de Rust non sécurisé peut entraîner des erreurs de mémoire, des courses de données et d’autres vulnérabilités en matière de sécurité. Il est donc crucial de comprendre les risques tout en suivant les meilleures pratiques associées à unsafe Rust pour écrire un code sûr et performant.
Le principal risque associé à Rust est le potentiel de bogues liés à la mémoire qui peuvent conduire à des plantages, des vulnérabilités de sécurité et des comportements de code non définis.
Les erreurs de mémoire se produisent lorsqu’un programme tente d’accéder à la mémoire de manière anormale ; le programme finit par se bloquer ou se comporter de manière imprévisible.
Les courses aux données se produisent lorsque deux ou plusieurs threads de programme accèdent simultanément au même morceau de mémoire et qu’au moins l’un des threads modifie la valeur en mémoire, provoquant ainsi un comportement inattendu du programme.
Vous pouvez déclencher des débordements de mémoire tampon en utilisant Rust de manière inappropriée. Les débordements de mémoire tampon se produisent lorsqu’un programme écrit des données au-delà de la fin d’une mémoire tampon. Les débordements de mémoire tampon peuvent provoquer un plantage du programme ou permettre à des attaquants d’exécuter un code arbitraire.
Une autre vulnérabilité est l’utilisation après la libération (UAF) qui se produit lorsqu’un programme accède à la mémoire après la désallocation de la valeur. L’UAF peut entraîner un comportement imprévisible du programme et potentiellement introduire des vulnérabilités de sécurité.
En raison de ces vulnérabilités, lorsque l’on travaille avec du Rust non sécurisé, il est essentiel de comprendre en profondeur la propriété de Rust et la façon dont le modèle d’emprunt fonctionne en Rust, tout en suivant les meilleures pratiques.
La gestion de la mémoire en Rust est flexible
Le modèle de propriété de Rust gère la mémoire automatiquement, ce qui réduit le risque de bogues liés à la mémoire. L’emprunt permet à plusieurs variables d’accéder simultanément aux mêmes ressources mémoire sans conflit.
La gestion de la mémoire de Rust offre la flexibilité, la sécurité et la performance nécessaires au développement de logiciels modernes, faisant de Rust un outil puissant pour écrire un code efficace et fiable.
S’abonner à notre lettre d’information
Que signifie unsafe en Rust ?
Le mot-clé unsafe a deux usages : déclarer l’existence de contrats que le compilateur ne peut pas vérifier ( unsafe fn et unsafe trait ), et déclarer qu’un programmeur a vérifié que ces contrats ont été respectés ( unsafe {} et unsafe impl , mais aussi unsafe fn – voir ci-dessous).
Qu’est-ce que le code sûr Rust ?
Safe Rust est le véritable langage de programmation Rust. Si vous n’écrivez que du Safe Rust, vous n’aurez jamais à vous soucier de la sécurité des types ou de la sécurité de la mémoire. Vous n’aurez jamais à supporter un pointeur qui traîne, un use-after-free, ou tout autre type de comportement indéfini (a.k.a. UB).
Est-ce que Rust a une sécurité de type ?
La sécurité de type en Rust Rust est statiquement typé, et il garantit la sécurité de type par des vérifications de type strictes à la compilation et en garantissant la sécurité de la mémoire. Ce n’est pas spécial, car la plupart des langages modernes sont statiquement typés.
Comment désactiver le vérificateur d’emprunts en Rust ?
Vous ne pouvez pas « désactiver le vérificateur d’emprunts » en Rust, et vous ne devriez pas vouloir le faire. Les références de Rust ne sont pas des pointeurs, et le compilateur est libre de décimer le code qui tente d’utiliser les références comme si elles l’étaient.