1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper...

28
1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University

Transcript of 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper...

Page 1: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

1

A Dependently TypedAssembly Language

Hongwei XiUniversity of Cincinnati

and

Robert HarperCarnegie Mellon University

Page 2: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

2

Talk Overview

MotivationDTAL, a dependently typed assembly language

An introductory example Theoretical development Practical application

Conclusion

Page 3: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

3

Compilation Certification

Transfer source-language guarantees to object-languages of interests Eliminate the “closed world” assumption

by making the transferred properties independently verifiable

Source program

e

Target code

|e|

compilation

| . |

Page 4: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

4

Type-directed compilation

e --------------> |e| e: -----------> |e|:||

At target level: Use types to enforce program properties

of interests (e.g., memory safety) Use type-checking to verify enforced

properties

Page 5: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

5

Proof-carrying code (PCC)

Both type safety and memory safety are expressed by first-order logic

assertions about program variables, and are checked by a verification condition

generator (VCG) and a theorem prover

Object code is certified by an explicit representation of the proof

Page 6: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

6

Typed assembly language

(TAL)

Type safety is expressed by type annotations, and is checked by a type-checker

Memory safety is ensured by making critical instructions such as array subscripting atomicObject code requires no additional certification

Page 7: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

7

DTAL

DTAL is designed to allow for more fine-grained control over memory safety, supporting array bound check elimination efficient representation of sum types

The design of DTAL draws on ideas from DML as the general framework in particular, the separation of type indices

from values, linked by “singleton” types

Page 8: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

8

Xanadu

Xanadu is an imperative programming language with C/Java-like syntaxThe type system of Xanadu supports a DML-style dependent typesXanadu is currently used as a source language for generating DTAL code

Page 9: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

9

A copy function in Xanadu

{m:nat,n:nat | m <= n}unit copy(int src[m], int dst[n]) { var: int i, len;; len = arraysize (src); [a:nat] (i: int(a)) /* loop invariant */ for (i = 0; i < len; i = i + 1) { dst[i] = src[i]; }}

Page 10: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

10

A copy function in DTAL

copy: {m:nat,n:nat | m <= n} [r1: int array(m), r2: int array(n)] arraysize r3, r1 mov r4, 0loop: {m:nat,n:nat, i:nat | m <= n} [r1: int array(m), r2: int array(n), r3:int(m), r4:int(i)] sub r5, r4, r3 bgte r5, finish load r5, r1(r4) store r2(r4), r5 add r4, r4, 1 jmp loopfinish: [] halt

Page 11: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

11

Integer Constraint Domain

We use a for index variables and i for integersindex expressions

x, y ::= a | i | x + y | x – y | x * y | x/ y | …index propositions

P, Q ::= x < y | x <= y | x > y | x >= y | x = y | x <> y | P Q | P Q

index sorts ::= int | {a : | P }index variable contexts ::= . | , a: | , Pindex constraints ::= P | P | a:

Page 12: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

12

Limitations

Currently, we only handle linear constraints The constraint solver first checks the

linearity of each constraint It then uses an approach to integer

programming based on the simplex method to solve constraints

E.g., a:nat. b:nat. a * b >= 0 is rejected

Page 13: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

13

Instructions in DTAL

values v ::= i | l | rtypes ::= | | top | int | array(x)instructions ins ::=

aop r1, r2, v | bop r, v | mov r, v |load r1, r2(v) | store r1(v), r2 |newarray[] r1, r2, r3 | jmp v | halt |arraysize r1, r2

instruction sequences I ::=jmp v | halt | ins; I

Page 14: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

14

Programs in DTAL

regfile types R ::= {r1:1, ..., rnr:nr}

state types ::= state(.R)blocks B ::= .(R, I)label mappings ::= {l1: 1, ..., ln:

n}

programs P ::= l1:B1;...; ln:Bn

Page 15: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

15

A typing rule

;;R |- r2: array(x) ;;R |- v: int(y) |= 0 <= y < x ;;R[r1:] |- I

-------------------------------------------- ;;R |- load r1, r2(v); I

Page 16: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

16

Another typing rule

;;R |- v: state(’’R’) |- : ’ ; |- : ’ ;;R |= R’[][]

-------------------------------------------- ;;R |- jmp v; I

Page 17: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

17

Entailment relation (I)

H |= hc : means that hc, a constant or a heap address, has type under the heap mapping H

The following rule (heap-array) is for typing arrays

H (h) = (hc1, ..., hcn) H |= hc1 : H |= hcn : --------------------------------------------------- H |= h : array(n)

Page 18: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

18

Entailment relation (II)

We use R for register file

The entailment relation (H,R) |= R means that for each register ri, H |= R (i): R(i)

Page 19: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

19

A potential problem

H (h) = (0, 0), R (1) = R (2) = h R(1) = int array(2), R(2) = nat array(2)

Note that (H, R ) |= R

If we now store a negative integer into the array pointed by r1, then the type of r2 is invalidated

Page 20: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

20

Regularity condition

A derivation of (H, R ) |= R isregular if each heap address is associated with

at most one type, and whenever the rule (heap-array) is

applied, the type must equal the type associated with h

Regular derivations are preserved under execution

Page 21: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

21

Soundness Theorem

Let P = (l1:B1;...; ln:Bn) and = (P). Assume |- P[well-typed] is derivable. Then the execution of P either terminates normally or continues forever.

Page 22: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

22

Extension with sum types

choose(i; 0, ..., n-1) stands for a type which much be one of ’s, determined by the value of i0 + ... + n-1 is represented as[a:nat | a < n] (int(a) choose (a; 0, ..., n-1))

Page 23: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

23

Generating DTAL code

For a proof of concept, we have built a compiler from Xanadu to DTAL The types for labels in DTAL code are

constructed from the type annotations in Xanadu programs

Currently, there is no formalization of the compiler

Page 24: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

24

DTAL vs. TPCC

DTAL requires a constraint solver for handling linear constraints in TBC; but TPCC requires noneWith source language support, DTAL can handle cases that could be difficult for TPCC, which uses a synthesis approach to array bound check elimination

Page 25: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

25

Some Related Work

Here is a list of some closely related work Dependent types in practical

programming (Xi & Pfenning) Typed assembly language (TAL)

(Morrisett et al) Proof-carrying code (Necula & Lee) TILT compiler (the Fox project at CMU) Flint compiler (Zhong Shao et al)

Page 26: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

26

End of the Talk

Thank You! Questions?

Page 27: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

27

Another typing rule

typing judgment: ;;R |- I

;;R |- r2:int(x) ;;R |- v:int(y) ;;R[r1:int(x+y)] |- I

----------------------------------------- ;;R |- add r1, r2, v; I

Page 28: 1 A Dependently Typed Assembly Language Hongwei Xi University of Cincinnati and Robert Harper Carnegie Mellon University.

28

A copy function in DML

fun copy (src, dst) =let fun loop (i, len) = if i < len then update (dst, i, sub (src, i)) else () withtype {i:nat | i <= m} int(i) * int(m) -> unitin loop (0, length src)end

withtype {m:nat,n:nat | m <= n} ‘a array(m) * ‘a array(n) -> unit

(* length: {n:nat} ‘a array(n) -> int(n) *)