guaranteeing memory safety in rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-neu.pdf2013/07/17...

59
Guaranteeing memory safety in Rust Nicholas D. Matsakis Mozilla Research 1 Thursday, July 18, 13

Upload: others

Post on 02-Oct-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Guaranteeing memory safety in Rust

Nicholas D. MatsakisMozilla Research

1

Thursday, July 18, 13

Page 2: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Hashtable in C / C++

template<class K, class V>struct Hashtable { Bucket<K,V> *buckets; unsigned num_buckets;}

template<class K, class V>struct Bucket { bool occupied; K key; V value;}

. . .

2

Thursday, July 18, 13

Page 3: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

template<class K, class V>void insert( Hashtable<K,V> *table, K key, V value){ if (table full) { table->buckets = realloc(table->buckets, ...); } unsigned index = find_bucket(table, &key); table->buckets[index].key = key; table->buckets[index].value = value; table->buckets[index].occupied = true;}

Insertion

Grow arrays as necessary

Initialize the bucket3

Thursday, July 18, 13

Page 4: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Assumptionstemplate<class K, class V>void insert( Hashtable<K,V> *table, K key, V value){ if (table full) { table->buckets = realloc(table->buckets, ...); } unsigned index = find_bucket(table, &key); table->buckets[index].key = key; table->buckets[index].value = value; table->buckets[index].occupied = true;}

Buckets array is unaliased

Never access bucket if occupied is false4

Thursday, July 18, 13

Page 5: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Living on the edge

5

Violating either of these assumptionscan lead to a crash

=>

Crashes lead to exploits.

Thursday, July 18, 13

Page 6: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Privacy?

6

Q: Doesn’t privacy solve this?

A: Not really.

Thursday, July 18, 13

Page 7: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Table lookup

template<class K, class V>V* find( Hashtable<K,V> *table, K *key){ unsigned index = find_bucket(table, &key);

if (!table->buckets[index].occupied) return NULL;

return &table->buckets[index].value;}

7

Find the correct bucket.

Bucket initialized?

Return pointer into the bucket array!

Thursday, July 18, 13

Page 8: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Vulnerability

8

Hashtable<K,V>* table = ...;

V *value = find(table, ...);

insert(table, ...);

use(value);

Create alias

Resize bucket array

Dangling pointer

Thursday, July 18, 13

Page 9: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

A problem for everyone

9

e.g., Java’s ConcurrentModificationException

Q: Doesn’t garbage collection solve this?

A: Not really.

Thursday, July 18, 13

Page 10: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Iteration holds pointers

10

for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) std::cout << ' ' << *it;

encapsulates a pointer

(for-each hashtable (lambda (x) ...))

if hashtable is mutable, same problem

Thursday, July 18, 13

Page 11: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Implications

11

During iteration, the buckets array is aliased.

+

Insertion can resize the array.

=>

Insertion during iteration can allow aforeign website to take over your computer.

(e.g., Bug 810718)

Thursday, July 18, 13

Page 12: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Enter: Rust

12

Think: C++ meets ML/Haskell meets Erlang(meets Cyclone, ML Kit, and many others)

Thursday, July 18, 13

Page 13: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Credit where credit is due

13

Rust is the product of a community too numerous to list here.

https://github.com/mozilla/rust/blob/master/AUTHORS.txt

Thursday, July 18, 13

Page 14: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

14

– Traits (type classes)

– Ownership (affine types)

– Algebraic data types

– Lifetimes (regions)

– Actor-style concurrency

1

2

What Rust has...

Thursday, July 18, 13

Page 15: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

15

– Null pointers

– Dangling pointers

– Segmentation faults

– Data races

– Mandatory GC

What Rust doesn’t have...

Thursday, July 18, 13

Page 16: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Why optional GC?

16

1. Efficiency and predictability

• Avoid unpredictable latency• Particularly on mobile

2. Memory disjoint tasks

• If you can send memory, you can free it.

Thursday, July 18, 13

Page 17: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Preview: Freezing

17

let mut table: Hashtable<K,V> = ...;

{ let value = table.find(...);

table.insert(...);

match value { ... }}

table.insert(...);

Create hashtable

Find “freezes” hashtable for scope of value

Illegal, hashtable frozen

OK, value is out of scope

Thursday, July 18, 13

Page 18: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

18

struct Hashtable<K,V> { buckets: ~[Option<Bucket<K,V>>]}

struct Bucket<K,V> { key: K, value: V}

~[T]: Owned pointerto an array

Hashtable in Rust

Thursday, July 18, 13

Page 19: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

19

~[Option<Bucket<K,V>>]Option<T>: I guess you’ve seen this before

~[T]: Owned pointer to an array

What’s in a type

Thursday, July 18, 13

Page 20: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

What is ownership?

20

In Rust, ownership means:

The Right To Free Memory

Control over aliasing

Thursday, July 18, 13

Page 21: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

21

Ownership is implicit in C/C++

memcpy(void *dest, const void *src, uintptr_t count);

Some pointers are temporary:

V* find(Hashtable<K,V> *table, K *key);

Some pointers are not:

struct Hashtable { Bucket<K,V> *buckets; ...}

void *realloc(void *, ...);void free(void *);

Thursday, July 18, 13

Page 22: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Ownership is explicit in Rust

22

Temporary pointers are designated &T

Owned pointers are designated ~T

Managed pointers are designated @T

Thursday, July 18, 13

Page 23: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Owned pointers

23

{ let x: ~int = ~22; …}

Owned pointers never alias one another and are automatically freed:

Allocate owned integer

x freed automatically here

Thursday, July 18, 13

Page 24: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Owned pointers are moved

24

fn move_from() { let x: ~int = ~22;

move_to(x);

printf(“%d”, *x); // Error: x was moved}

fn move_to(y: ~int) { ...}

Owned pointers are moved from place to place.

Moves x into callee’s stack frame

x no longer accessible

Freed by callee

Thursday, July 18, 13

Page 25: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Moving into a data structure

25

let b = ~[];

let table = Hashtable { buckets: b};

b[0] = ...; // Errortable.buckets[0] = ...; // OK

Owned pointers can also be owned by a data structure.

Create a fresh array

Move it into the hashtable

Only accessible via table

Thursday, July 18, 13

Page 26: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

discriminant

26

buckets

keyvalue

length

Option<Bucket<K,V>>

Hashtable<K,V>

~[Option<Bucket<K,V>>]

Bucket<K,V>

. . .

Bounds checks

Unaliased

None vs Some

Data if Some, like a C union

Thursday, July 18, 13

Page 27: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

27

Insertion, first attemptfn insert<K,V>( mut table: ~Hashtable<K,V>, key: K, value: V) -> ~Hashtable<K,V>{ if (table full) { table.buckets = resize_buckets(table.buckets); }

let index = find_bucket(table, &key); table.buckets[index] = Some(Bucket {key: key, value: value}); return table;}

Take ownership of a hashtable

Safe because of ownership

Update buckets array

Give table back to the caller.

Thursday, July 18, 13

Page 28: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

28

Mutability in Rust

let x = 22;x += 1; // Error

let mut x = 22;x += 1; // OK

fn update(x: int) { x += 1; // Error}

fn update(mut x: int) { x += 1; // OK}

Local variables must be declared as mutable

Parameters too

Thursday, July 18, 13

Page 29: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

If X is mutable, everything owned by X is mutable too

29

buckets

. . . . . .[0] [i] [n]

Mutability and ownershiptablemutmut

mutmutmut

Thursday, July 18, 13

Page 30: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

30

Inherited mutabilityfn insert<K,V>( mut table: ~Hashtable<K,V>, key: K, value: V) -> ~Hashtable<K,V>{ if (table full) { table.buckets = resize_buckets(table.buckets); }

let index = find_bucket(table, &key); table.buckets[index] = Some(Bucket {key: key, value: value}); table}

table is mutable

table.buckets is mutable

table.buckets[index] is mutable

Thursday, July 18, 13

Page 31: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Ownership is explicit in Rust

31

Temporary pointers are designated &T

Owned pointers are designated ~T

Managed pointers are designated @T

Thursday, July 18, 13

Page 32: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

32

Borrowing

fn insert<K,V>( table: &mut Hashtable<K,V>, key: K, value: V){ if (table full) { resize_buckets(&mut table.buckets); }

let index = find_bucket(&*table, &key); table.buckets[index] = Some(Bucket {key: key, value: value});}

Mutable borrowed pointer as input

Mutable borrow

Immutable borrows

Thursday, July 18, 13

Page 33: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Borrowed pointer to a mutable hashtable

33

buckets

. . . . . .[0] [i] [n]

Borrowingtable

mut

mut mut mut

Hashtable owns its array, thus mutability is inherited

mut

Thursday, July 18, 13

Page 34: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Mutability and uniqueness

34

&mut T Borrowed pointer to mutable data

Type system guarantees uniqueness: no other mutable pointer to the same data.

Linearly tracked.

Thursday, July 18, 13

Page 35: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Mutable borrows

35

let mut x = 5;

{ let y = &mut x; x += 1; // Error: borrowed *y += 1; // OK}

x += 1; // OK

x is borrowed for the lifetime of y

Mutable borrows prevent owner from writing.

Mutable local variable

Borrow has expired, y out of scope

Thursday, July 18, 13

Page 36: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Lifetimes

36

let mut x = 5;

{ let y = &mut x; x += 1; // Error: borrowed *y += 1; // OK}

x += 1; // OK

‘a

‘b‘c‘d‘e

y : &’b mut int

Thursday, July 18, 13

Page 37: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Lifetime parameters

37

fn insert<K,V>( table: &mut Hashtable<K,V>, key: K, value: V){ ...}

fn insert<‘a,K,V>( table: &‘a mut Hashtable<K,V>, key: K, value: V){ ...}

For any lifetime ‘a specified by caller...

Thursday, July 18, 13

Page 38: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Mutable borrows require

38

1. Data must be mutable

let mut x = 5;let y = &mut x;

OK

mut x: 5

y

mut

let x = 5;let y = &mut x;

ILLEGAL

x: 5

y

mut

Thursday, July 18, 13

Page 39: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Mutable borrows require

39

2. Data must live long enough

{ let mut x = 5; let y = &mut x;}

mut x: 5

y

mut

y

let y;{ let mut x = 5; y = &mut x;}*y += 1;

ILLEGAL

mut x: 5mut

OK

Thursday, July 18, 13

Page 40: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Mutable borrows require

40

3. Data must be uniquely referenced

let mut x = 5;let y = &mut x;

OK

mut x: 5

y

mut

let mut x = ~5;let y = &mut *x;

OK

mut x

ymut

5

Unusable while y is in scope

Thursday, July 18, 13

Page 41: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Mutable borrows require

41

3. Data must be uniquely referenced (cont’d)

let mut x = ~5;let y = &mut *x;let z = &mut *y;

OK

mut x

y

z

mut

5 Unusable while z is in scope

Only safe because &mut unique

Negative examples to come!

Thursday, July 18, 13

Page 42: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Immutable borrowed pointers

42

&T Borrowed pointer to immutable data

May be aliased Stronger than C++ const, nobody can modify it

Thursday, July 18, 13

Page 43: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Immutable borrows

43

let x = 5;{ let y = &x; print(x);}

Original can still be read

Immutable borrows do not restrict owner from reading.

But there are other restrictions...

Thursday, July 18, 13

Page 44: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Freezing

44

let mut x = 5;{ let y = &x; x += 1; // Error}x += 1; // OK

Frozen for lifetime of y

x declared as mutable

y out of scope, unfrozen

Thursday, July 18, 13

Page 45: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Immutable borrows require

45

1. Data must live long enough

{ let x = 5; let y = &x;}

let y;{ let x = 5; y = &x;}print(*y);

OK ILLEGAL

Same as with &mut

Thursday, July 18, 13

Page 46: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Immutable borrows require

46

2. Mutable data must be uniquely referenced.

let mut x = 5;let y = &x;

let mut x = ~5;let y = &*x;

OK OK

let mut x = ~5;let y = &mut *x;let z = &*y;

OKSame as with &mut

Thursday, July 18, 13

Page 47: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

An illegal case...

47

let mut x = ~5;let y = &mut *x;let z : & &mut int = &y;let a = &mut **z;

mut x

y

z

a

5

ILLEGAL

Path to borrowed data not guaranteed

to be unique

Thursday, July 18, 13

Page 48: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

An illegal case (cont’d)

48

let mut x = ~5;let y = &mut *x;let z : & &mut int = &y;let z2 = z;let a = &mut **z;

mut x

y

z

z2

a

5

*a and **z2 access the same data!

Thursday, July 18, 13

Page 49: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Let’s put it all together

49

Remember find()?

Returns a pointer into the hashtable.

Goal: Ensure that hashtable is notmodified while this pointer is live.

Thursday, July 18, 13

Page 50: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Lifetime parameters in find

50

fn find<‘a,K,V>( table: &‘a Hashtable<K,V>, key: &K) -> Option<&’a V>{ ...}

Thursday, July 18, 13

Page 51: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Lifetime parameters in find

51

fn find<‘a,K,V>( table: &‘a Hashtable<K,V>, key: &K) -> Option<&’a V>{ ...}

Given: pointer with lifetime ‘a to an immutable hashtable

Yields: (optional) pointer with lifetime ‘a to an immutable value V

In other words, the value returned is valid as long as:1. the hashtable is valid2. the hashtable is not mutated

Thursday, July 18, 13

Page 52: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

52

Find

fn find<‘a,K,V>( table: &‘a Hashtable<K,V>, key: &K) -> Option<&’a V>{ let index = find_bucket(table, &key); match table.buckets[index] { None => None, Some(ref bucket) => Some(&bucket.value) }}

Search for index...

Creates a pointer into value being matched

Thursday, July 18, 13

Page 53: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

53

discriminant

buckets

keyvalue

length

table

. . .

ref bucket

&table.buckets[index]

&bucket.value

table: &’a Hashtable<K,V>=> Immutable with lifetime ‘a

*

*

*

*

(*) Must be freezable with lifetime at least ‘a

table.buckets

Thursday, July 18, 13

Page 54: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Voila

54

let mut table: Hashtable<K,V> = ...;

{ let value = find(&table, ...);

insert(&mut table, ...);

match value { ... }}

insert(&mut table, ...);

Frozen for lifetime of value

Error, frozen.

OK, value out of scope.

Thursday, July 18, 13

Page 55: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

But wait, there’s more...

55

fn compute(input: &[T], output: &mut [T]) { if output.len() >= threshold { let (left, right) = output.split(); parallel::do([ || compute(input, left), || compute(input, right)]); } else { ... }}

Divide����������� ������������������  buffer����������� ������������������  into����������� ������������������  two����������� ������������������  disjoint����������� ������������������  halves

Immutable,����������� ������������������  safe����������� ������������������  to����������� ������������������  share.Mutable,����������� ������������������  but����������� ������������������  disjoint.����������� ������������������  Safe.

Thursday, July 18, 13

Page 56: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Recap #1

56

Owned pointers are moved, not freely aliased.

⇒Safe to free.

Safe to sendto another thread.

Safe to resize.

Thursday, July 18, 13

Page 57: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Recap #2

57

Borrowing limits the owner for the lifetime of the borrow.

⇒Borrowed values cannot be

moved or sent between tasks.

Mutable borrowed values can be temporarily frozen.

Thursday, July 18, 13

Page 58: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

Recap #3

58

Mutable borrowed pointers are unique.

⇒Allows reborrowing, resizing, and possibly parallelism beyond

actors (wip).

Thursday, July 18, 13

Page 59: Guaranteeing memory safety in Rustsmallcultfollowing.com/babysteps/pubs/2013.07.17-NEU.pdf2013/07/17  · Ownership is explicit in Rust 31 Temporary pointers are designated &T Owned

More information?

59

Nicholas [email protected]

rust-lang.org

smallcultfollowing.com/babysteps

Thursday, July 18, 13