You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: src/en/05_memory.md
+66Lines changed: 66 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -178,3 +178,69 @@ impl Drop for ZU32 {
178
178
} // i is freed here
179
179
# }
180
180
```
181
+
182
+
## Cyclic reference counted pointers (`Rc` and `Arc`)
183
+
184
+
Combining [interior mutability](https://doc.rust-lang.org/reference/interior-mutability.html), recurcivity and reference counted pointer into type definitions is unsafe. It can produce memory leaks which can result in DDoS attack or secret leaks.
185
+
186
+
The following example show such a memory leak in safe Rust:
Copy file name to clipboardExpand all lines: src/fr/05_memory.md
+66Lines changed: 66 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -191,3 +191,69 @@ impl Drop for ZU32 {
191
191
} // i est libéré ici
192
192
# }
193
193
```
194
+
195
+
## Cycle dans les références comptées (`Rc` et `Arc`)
196
+
197
+
La **combinaison** de la mutabilité *[intérieure](https://doc.rust-lang.org/reference/interior-mutability.html)*, des références comptées et des types récursifs n'est pas sûre. En effet, elle peut conduire à fuites mémoire, et donc éventuellement à des attaques par déni de service et en des fuites de secrets.
198
+
199
+
L'exemple non-`unsafe` suivant montre, la création d'une fuite mémoire en utilisant la mutabilité intérieure et les références comptées.
200
+
201
+
```rust
202
+
usestd::{cell::Cell, rc::Rc};
203
+
204
+
structLinkedStruct {
205
+
other:Cell<Option<Rc<LinkedStruct>>>,
206
+
}
207
+
208
+
fnmain() {
209
+
println!("Hello, world!");
210
+
leta=Rc::new(LinkedStruct {
211
+
other:Cell::new(None),
212
+
});
213
+
letb=Rc::new(LinkedStruct {
214
+
other:Cell::new(None),
215
+
});
216
+
letaa=a.clone();
217
+
letbb=b.clone();
218
+
a.other.set(Some(bb));
219
+
b.other.set(Some(aa));
220
+
}
221
+
```
222
+
223
+
La fuite peut-être mise en évidence grâce à `valgrind` :
> Éviter de définir des types à la fois récursifs, mutables *intérieurement*, et dont la récursion se base sur l'utilisation des références comptées `Rc` ou `Arc`.
0 commit comments