@@ -127,18 +127,23 @@ Quel est le problème dans ce code?
...
@@ -127,18 +127,23 @@ Quel est le problème dans ce code?
# Sûreté mémoire en Rust
# Sûreté mémoire en Rust
## Ownership (1/2)
- En Rust, la sûreté en mémoire est garantie **à la compilation**.
- Il existe trois façons de posséder des données.
# Owned data
## Owner
- Quand on est **propriétaire** des données, on peut faire ce qu'on veut avec:
- Quand on est **propriétaire** des données, on peut faire ce qu'on veut avec:
1. Les lire.
1. Les lire.
2. Les modifier.
2. Les modifier.
3. Les donner à quelqu'un d'autre.
3. Les donner à quelqu'un d'autre.
## Ownership (2/2)
## Owner (2/2)
](https://upload.wikimedia.org/wikipedia/commons/9/9f/Se%C5%A1ity.JPG){#fig:mem_vec_str width=50%}
](https://upload.wikimedia.org/wikipedia/commons/9/9f/Se%C5%A1ity.JPG){#fig:mem_vec_str width=50%}
## Ownership en pratique (1/3)
## En pratique (1/3)
<pre><codedata-trim="hljs rust"class="lang-rust">
<pre><codedata-trim="hljs rust"class="lang-rust">
fn do_something(_notebook: Vec<&str>) { // _notebook prend l'ownership
fn do_something(_notebook: Vec<&str>) { // _notebook prend l'ownership
...
@@ -161,7 +166,7 @@ fn main() {
...
@@ -161,7 +166,7 @@ fn main() {
Le transfert de l'ownership est complètement décidé à la **compilation**.
Le transfert de l'ownership est complètement décidé à la **compilation**.
## Ownership en pratique (2/3)
## En pratique (2/3)
Ce qui se passe en mémoire:
Ce qui se passe en mémoire:
...
@@ -173,7 +178,7 @@ Ce qui se passe en mémoire:
...
@@ -173,7 +178,7 @@ Ce qui se passe en mémoire:
**`notebook` est détruit à la fin de `do_something` et ne peut plus être réutilisé**
**`notebook` est détruit à la fin de `do_something` et ne peut plus être réutilisé**
## Ownership en pratique (3/3)
## En pratique (3/3)
En C++ une sytaxe similaire a un effet complètement différent
En C++ une sytaxe similaire a un effet complètement différent
...
@@ -195,7 +200,9 @@ void main() {
...
@@ -195,7 +200,9 @@ void main() {
}
}
```
```
## Borrowing
# Shared reference
## Emprunt immutable (1/2)
Mais comment lire (ou modifier) le notebook et le réutiliser ensuite?
Mais comment lire (ou modifier) le notebook et le réutiliser ensuite?
...
@@ -220,7 +227,7 @@ fn main() {
...
@@ -220,7 +227,7 @@ fn main() {
"Un peu" verbeux de faire comme cela.
"Un peu" verbeux de faire comme cela.
## Borrowing
## Emprunt immutable (2/2)
Solution: le propriétaire **prête** ses données.
Solution: le propriétaire **prête** ses données.
...
@@ -244,7 +251,7 @@ fn main() {
...
@@ -244,7 +251,7 @@ fn main() {
}
}
</code></pre>
</code></pre>
## Borrowing en pratique (2/3)
## En pratique (1/2)
Ce qui se passe en mémoire:
Ce qui se passe en mémoire:
...
@@ -252,7 +259,7 @@ Ce qui se passe en mémoire:
...
@@ -252,7 +259,7 @@ Ce qui se passe en mémoire:
### Attention: un emprunt est **immutable** par définition!
### Attention: un emprunt est **immutable** par définition!
## Borrowing en pratique (3/3)
## En pratique (2/2)
### Que se passe-t-il
### Que se passe-t-il
...
@@ -274,7 +281,7 @@ Ce qui se passe en mémoire:
...
@@ -274,7 +281,7 @@ Ce qui se passe en mémoire:
::: {.column width="50%"}
::: {.column width="50%"}
<pre><codedata-trim="hljs rust"class="lang-rust">
<pre><codedata-trim="hljs rust"class="lang-rust">
fn main() {
fn main() {
let mut v = Vec::new(); // par défaut notebook est immutable
let mut v = Vec::new();
v.push("Test.");
v.push("Test.");
let elem = &v[0]; // référence
let elem = &v[0]; // référence
...
@@ -284,7 +291,40 @@ fn main() {
...
@@ -284,7 +291,40 @@ fn main() {
:::
:::
::::::::::::::
::::::::::::::
# Mutable reference
## Emprunt mutable
Le propriétaire **prête** ses données mais l'emprunteur peut les modifier.
1. On crée une **mutable** référence vers les données (on peut les modifier).
2. On peut donner la référence.
3. Quand la référence sort de la portée elle est détruite, mais comme elle possède pas les données l'ownership est rendu aussi.
. . .
<pre><codedata-trim="hljs rust"class="lang-rust">
fn mut_borrow(notebook: &mut Vec<&str>) { // _notebook prend l'ownership de la référence vers un Vec
notebook.push("On peut modifier les données");
// on peut lire les données contenues dans notebook et les modifier
} // la référence est détruite, les données sont rendues à notebook
fn main() {
let mut notebook = Vec::new(); // par défaut notebook est immutable
notebook.push("Il fait beau.");
notebook.push("Les oiseaux chantent.");
mut_borrow(&mut notebook); // on crée une référence et on la passe à borrow
mut_borrow(&mut notebook); // on peut réutiliser notebook