Skip to content

Commit 4cc36ee

Browse files
committed
merge central traits into standard
1 parent a39dbc5 commit 4cc36ee

File tree

6 files changed

+175
-144
lines changed

6 files changed

+175
-144
lines changed

src/en/SUMMARY.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
- [Integer operations](integer.md)
1616
- [Error handling](errors.md)
1717
<!-- - [Type system](typesystem.md) -->
18-
- [Central traits](central_traits.md)
1918
- [Unsafe Rust](unsafe.md)
2019
- [Generalities](unsafe/generalities.md)
2120
- [Memory management](unsafe/memory.md)

src/en/central_traits.md

Lines changed: 0 additions & 68 deletions
This file was deleted.

src/en/standard.md

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
---
2+
references:
3+
- type: web
4+
title: Specialization
5+
url: https://github.com/rust-lang/rfcs/blob/master/text/1210-impl-specialization.md
6+
id: RFC-1210
7+
---
8+
19
# Standard library
210

311
## `Send` and `Sync` traits
@@ -242,3 +250,80 @@ and lexicographical comparison is needed. Any manual implementation of
242250
standard comparison traits SHOULD be documented and justified.
243251

244252
</div>
253+
254+
## `Drop` trait, the destructor
255+
256+
Types implement the trait `std::ops::Drop` to perform some operations when the
257+
memory associated with a value of this type is to be reclaimed. `Drop` is the
258+
Rust equivalent of a destructor in C++ or a finalizer in Java.
259+
260+
<div class="note">
261+
262+
Implementing this trait changes the execution semantics of the language.
263+
Indeed, unlike the classical behavior of traits [^1], the execution of the same
264+
code will differ depending on whether this trait is implemented or not.
265+
266+
[^1]: Except for the use of negative trait bounds, which is allowed for example
267+
by [@RFC-1210], but is not yet implemented for the current version of Rust (1.91.0).
268+
269+
</div>
270+
271+
Dropping is done recursively from the outer value to the inner values.
272+
When a value goes out of scope (or is explicitly dropped with `std::mem::drop`),
273+
the value is dropped in two steps. The first step happens only if the type of
274+
this value implements `Drop`. It consists in calling the `drop` method on it.
275+
The second step consists in repeating the dropping process recursively on any
276+
field the value contains. Note that a `Drop` implementation is
277+
**only responsible for the outer value**.
278+
279+
First and foremost, implementing `Drop` should not be systematic.
280+
It is only needed if the type requires some destructor logic. In fact, `Drop` is
281+
typically used to release external resources (network connections, files, etc.)
282+
or to release memory (e.g. in smart pointers such as `Box` or `Rc`).
283+
As a result, `Drop` trait implementations are likely to contain `unsafe` code
284+
blocks as well as other security-critical operations.
285+
286+
<div class="reco" id="LANG-DROP" type="Rule" title="Justify `Drop` implementation">
287+
288+
In a Rust secure development, the implementation of the `std::ops::Drop` trait
289+
MUST be justified and documented.
290+
291+
</div>
292+
293+
Second, Rust type system only ensures memory safety and, from the type system's
294+
standpoint, missing drops is allowed. In fact, several things may lead to
295+
missing drops, such as:
296+
297+
- a reference cycle (for instance, with `Rc` or `Arc`),
298+
- an explicit call to `std::mem::forget` (or `core::mem::forget`) (see paragraph
299+
on [`forget` and memory leaks](unsafe/memory.md#forget-and-memory-leaks)),
300+
- a panic during drop,
301+
- program aborts (and panics when abort-on-panic is on).
302+
303+
304+
And missing drops may lead to exposing sensitive data or to lock limited
305+
resources leading to availability issues.
306+
307+
<div class="reco" id="LANG-DROP-NO-PANIC" type="Rule" title="Do not panic in `Drop` implementation">
308+
309+
In a Rust secure development, the implementation of the `std::ops::Drop` trait
310+
MUST not panic.
311+
312+
</div>
313+
314+
Beside panics, secure-critical drop should be protected.
315+
316+
<div class="reco" id="LANG-DROP-NO-CYCLE" type="Rule" title="Do not allow cycles of reference-counted `Drop`">
317+
318+
A value whose type implements `Drop` MUST NOT be embedded directly or indirectly
319+
in a cycle of reference-counted references.
320+
321+
</div>
322+
323+
<div class="reco" id="LANG-DROP-SEC" type="Rule" title="Do not rely only on `Drop` to ensure security">
324+
325+
Ensuring security operations at the end of some treatment (such as key erasure
326+
at the end of a cryptographic encryption) MUST NOT rely only on the `Drop`
327+
trait implementation.
328+
329+
</div>

src/fr/SUMMARY.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
- [Gestion des entiers](integer.md)
1616
- [Gestion des erreurs](errors.md)
1717
<!-- - [Système de types](typesystem.md) -->
18-
- [Traits centraux](central_traits.md)
1918
- [Unsafe Rust](unsafe.md)
2019
- [Généralités](unsafe/generalities.md)
2120
- [Gestion de la mémoire](unsafe/memory.md)

src/fr/central_traits.md

Lines changed: 0 additions & 74 deletions
This file was deleted.

src/fr/standard.md

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
---
2+
references:
3+
- type: web
4+
title: Specialization
5+
url: https://github.com/rust-lang/rfcs/blob/master/text/1210-impl-specialization.md
6+
id: RFC-1210
7+
---
8+
19
# Bibliothèque standard
210

311
## Les traits `Send` et `Sync`
@@ -260,3 +268,85 @@ sont nécessaires. Toute implémentation manuelle d'un trait de comparaison
260268
standard DEVRAIT être justifiée et documentée.
261269

262270
</div>
271+
272+
## Trait `Drop` : le destructeur
273+
274+
Les types implémentent le trait `std::ops::Drop` dans le but d'effectuer
275+
certaines opérations lorsque la mémoire associée à une valeur est réclamée.
276+
`Drop` est l'équivalent Rust d'un destructeur en C++ ou un finaliseur en Java.
277+
278+
<div class="note">
279+
280+
Implémenter ce traits modifie la sémantique d'exécution du langage. En effet,
281+
contrairement au fonctionnement classique des traits [^1], l'exécution d'un même code
282+
se verra différente avec et sans cette implémentation.
283+
284+
[^1]: excepté l'usage de contraintes négatives de type, permis par exemple par la [@RFC-1210],
285+
pas encore implémentée pour la version actuelle de Rust (1.91.0)
286+
287+
</div>
288+
289+
`Drop` agit récursivement, depuis la valeur externe vers les valeurs imbriquées.
290+
Lorsqu'une valeur sort du scope (ou est explicitement relâchée avec
291+
`std::mem::drop`), elle est relâchée en deux étapes. La première étape a lieu
292+
uniquement si le type de la valeur en question implémente le trait `Drop` et
293+
consiste en l'appel de la méthode `drop`. La seconde étape consiste en la
294+
répétition de processus de *drop* récursivement sur tous les champs que contient
295+
la valeur. Il est à noter que l'implémentation de `Drop` est
296+
*responsable uniquement de la valeur extérieure*.
297+
298+
Tout d'abord, l'implémentation de `Drop` ne doit pas être systématique. Elle est
299+
nécessaire uniquement lorsque le type requiert un traitement logique à la
300+
destruction. `Drop` est typiquement utilisé dans le cas du relâchement des
301+
ressources externes (connexions réseau, fichier, etc.) ou de ressources mémoire
302+
complexes (*smart pointers* comme les `Box` ou les `Rc` par exemple). Au
303+
final, il est probable que l'implémentation du trait `Drop` contienne des blocs
304+
`unsafe` ainsi que d'autres opérations critiques du point de vue de la sécurité.
305+
306+
<div class="reco" id="LANG-DROP" type="Règle" title="Justification de l'implémentation du trait `Drop`">
307+
308+
Dans un développement sécurisé en Rust, l'implémentation du trait
309+
`std::ops::Drop` DOIT être justifiée et documentée.
310+
311+
</div>
312+
313+
Ensuite, le système de types de Rust assure seulement la sûreté mémoire et,
314+
du point de vue du typage, des `drop`s peuvent tout à fait être manqués.
315+
Plusieurs situations peuvent mener à manquer des `drop`s, comme :
316+
317+
- un cycle dans la référence (par exemple avec `Rc` ou `Arc`) ;
318+
- un appel explicite à `std::mem::forget` (ou `core::mem::forget`) (voir
319+
paragraphe à propos de [`forget` et des fuites de mémoire](unsafe/memory.md#forget-and-memory-leaks)) ;
320+
- un `panic` dans un `drop` ;
321+
- un arrêt du programme (et un `panic` lorsque `abort-on-panic` est activé).
322+
323+
Les `drop`s manqués peuvent mener à l'exposition de données sensibles ou bien
324+
encore à l'épuisement de ressources limitées et par là même à des problèmes
325+
d'indisponibilité.
326+
327+
<div class="reco" id="LANG-DROP-NO-PANIC" type="Règle" title="Absence de `panic` dans l'implémentation de `Drop`">
328+
329+
Dans un développement sécurisé en Rust, l'implémentation du trait
330+
`std::ops::Drop` NE DOIT PAS causer de `panic`.
331+
332+
</div>
333+
334+
En plus des `panic`s, les `drop`s contenant du code critique doivent être
335+
protégés.
336+
337+
<div class="reco" id="LANG-DROP-NO-CYCLE" type="Règle" title="Absence de cycles de références avec valeurs `Drop`ables">
338+
339+
Les valeurs dont le type implémente `Drop` NE DOIVENT PAS être incluses,
340+
directement ou indirectement, dans un cycle de références à compteurs.
341+
342+
</div>
343+
344+
<!-- -->
345+
346+
<div class="reco" id="LANG-DROP-SEC" type="Règle" title="Sécurité assurée par d'autres mécanismes en plus du trait `Drop`">
347+
348+
Certaines opérations liées à la sécurité d'une application à la fin d'un
349+
traitement (comme l'effacement de secrets cryptographiques par exemple) NE DOIVENT PAS
350+
reposer uniquement sur l'implémentation du trait `Drop`.
351+
352+
</div>

0 commit comments

Comments
 (0)