alexandre d. salcianu and martin c. rinard. idea método para analizar la pureza de programas java...

31
PURITY AND SIDE EFFECT ANALYSIS FOR JAVA PROGRAMS Alexandre D. Salcianu and Martin C. Rinard

Upload: enrique-gil-valenzuela

Post on 24-Jan-2016

215 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

PURITY AND SIDE EFFECT ANALYSIS FOR JAVA PROGRAMS

Alexandre D. Salcianu and Martin C. Rinard

Page 2: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Idea

Método para analizar la pureza de programas Java (no anotados).

Construido sobre una mejora de “combined pointer and escape analysis method” (Rinard-Whaley)

Chequea si un método es puro, en el sentido de que no cambia ningún objeto existente en el pre-estado.

Page 3: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Para qué?

Cómo input para algunos análisis de programas

Para entender y documentar el programa

Para reducir el trabajo de los model checkers

Los métodos puros se pueden utilizar en especificaciones y aserciones dentro del código.

Page 4: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Mejoras

Se distingue entre objetos existentes en el pre-estado y objetos nuevos (creado por el método)

Además de determinar si un método es puro o no , el análisis obtiene otro tipo de información relacionado con los efectos que produce el método : Parámetros read-only Parámetros Safe Write Effects

Page 5: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Análisis Intraprocedural Para cada método m y cada punto del

programa dentro de m el análisis computa un points-to graph que modela la parte del heap que el método m accede antes de ese punto.

Un points-to graph G es un tupla G = < I,O,L,E >

I = conjunto de ejes internos O = conjunto de ejes externos L = estado abstracto de las variables locales (i.e

L(v) es el conjunto de nodos que la variable local v puede apuntar)

E = conjunto de nodos que escapan “globalmente”

Page 6: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Definición de escape

Un objeto “escapa” si es alcanzable desde afuera del método analizado (ej: desde uno de los parámetros)

En otro caso, el objeto está “capturado”.

Page 7: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Ejemplo: Main.sumX

list P12 L6head

cell

it I2

next

L5

L4data

cell

p

next

data

Círculos sólidos: nodos internosCírculos punteados: nodos externosFlechas sólidas: ejes internosFlechas punteadas: ejes externos

Page 8: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Análisis Intraprocedural Además del points-to graph, para

cada método m el análisis computa un conjunto Wm que contiene los campos abstractos modificados que son visibles externamente.

Un campo abstracto es un campo para un nodo específico, se lo denota como <n,f> donde n es el nodo y f es el campo.

Page 9: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Análisis Intraprocedural

El cálculo del PTG y el Wm se define a partir de una función de transferencia, aplicada a un conjunto reducido de sentencias.

El grafo inicial se compone solo de los parámetros que toma el método, más el parámetro implícito this.

1. if S goto a : se asume que la condición S no produce efectos colaterales => no cambio nada.

Page 10: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Análisis Intraprocedural v1 = v2 : se agrega un eje desde v1 a

todos los nodos apuntados por v2

v = new C : se agrega un nuevo nodo interno y se lo apunta desde v.

En las variables se realizan strong updates

Page 11: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Análisis Intraprocedural

v1 = v2.f: Caso 1: si ningún nodo apuntado por v2

escapa

Caso 2: si algún nodo apuntado por v2 escapa

Page 12: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Análisis Intraprocedural

v1.f = v2: se agrega un eje desde cada nodo apuntado por v1 hacia todos los nodos apuntados por v2.Se agregan a Wm los campos de la forma :

<L(v1) externos , f >

En los campos de variables se realizan weak updates

Page 13: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Ejemplo: Cell Constructor

W = {<P2, data>, <P2,next>}

data

next

this

d

n

P4

P2

P3Cell (Object d, Cell n) { this.data = d; this.next = n;}

Page 14: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Ejemplo: List.add

W {<P5, head>}

e P6

this P5

next

data

I1

L1head

headvoid add(Object e){ this.head = new Cell(e,this.head);}

Page 15: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Ejemplo: ListItr.next

this P10 L3cell

cellnext

L5

L4data

W {<P10, cell>}

Object next(){ Object result = this.cell.data; this.cell = this.cell.next; return result;}

result

Page 16: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Análisis InterproceduralCaso Fácil

Por cada llamada (call) del tipo vR = v0.s(v1, … , vj)

Si s es un método no analizable entonces todos los argumentos (v0,v1, … , vj) pueden ser alcanzados por código desconocido.

Luego el análisis agrega todos los nodos apuntados por v0,v1, … , vj al conjunto E de nodos que escapan globalmente

Además se agrega un eje entre vr y el nodo nglb

Page 17: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Análisis Interprocedural Por cada llamada (call) del tipo

vR = v0.s(v1, … , vj)

el análisis usa el points-to graph G anterior a la llamada y el points-to graph Gcalle (gráfico final del método invocado) para computar un points-to graph posterior a la invocación del método.

Si hay múltiples posibles invocaciones, el análisis las considera a todas y mergea el conjunto de resultados de los points to graph

Page 18: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Análisis Interprocedural

El análisis opera en dos pasos:1. Se computa un mapeo entre los

parameter nodes y los load nodes del método invocado, hacia los nodos que representan en el método llamador.

2. Se usa el mapeo para “proyectar” el PTG del método llamado sobre el PTG anterior a la invocación

Page 19: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Paso 1: Mapping El análisis computa un mapeo, que

relaciona los parámetros y los load nodes del método invocado, con los nodos del método llamador que representan

Page 20: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Paso 2: Merge

1. Se utiliza el mapeo para combinar el grafo anterior a la llamada (G) y el grafo de la llamada (Gcalle), para obtener el grafo posterior a la llamada

2. Se remueven load nodes capturados.3. Se utiliza la información de los campos

modificados del método invocado (Wcalle) para actualizar los campos modificados del método m(Wm) (utilizando el mapeo)

Page 21: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Static float sumX(List list){ float s = 0; Iterator it = list.iterator(); while (it.hasNext()) { Point p = (Point) it.next(); s += p.x } return s;}

Ejemplo: sumX

list P12 L6head

cell

it I2

Page 22: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Ejemplo: sumX

P10 L3cell

cellnext

L5

L4data

list P12 L6head

cell

it I2

Gnext

this

•P10 I2•L3 L6

L5

L4

•L5 L5•L4 L4

next

data

cell

Page 23: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Static float sumX(List list){ float s = 0; Iterator it = list.iterator(); while (it.hasNext()) { Point p = (Point) it.next(); s += p.x } return s;}

Ejemplo: sumX

list P12 L6head

cell

it I2

next

L5

L4data

cell

p

Page 24: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

next

L5

L4data

cell

Ejemplo: sumX

P10 L3cell

cellnext

L5

L4data

list P12 L6head

cell

it I2

p

•P10 I2•L3 L5•L3 L6•L5 L5•L4 L4

Page 25: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

next

L5

L4data

cell

Ejemplo: sumX

P10 L3cell

cellnext

L5

L4data

list P12 L6head

cell

it I2

p

•P10 I2•L3 L5•L3 L6

next

data

•L5 L5•L4 L4

Page 26: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Static float sumX(List list){ float s = 0; Iterator it = list.iterator(); while (it.hasNext()) { Point p = (Point) it.next(); s += p.x } return s;}

Ejemplo: sumX

list P12 L6head

cell

it I2

next

L5

L4data

cell

p

next

data

Page 27: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Pureza del Método

Se computa el conjunto A de nodos que son alcanzables en G, desde nodos parámetros, utilizando ejes externos.

El método m es puro si y sólo si para todo n perteneciente a A:

1. n no escapa globalmente y 2. Ningún campo de n es alterado

Page 28: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Ejemplo: sumX

list P12 L6head

cell

it I2

next

L5

L4data

cell

p

next

data

A = {P12, L6, L4, L5}Wm = {}E = {}

sumX es puro}

Page 29: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Ejemplo: List.add

e P6

this P5

next

data

I1

L1head

headA = {P5, P6, L1}Wm = {<P5, head>}E = {}

Page 30: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Características del Análisis Se realiza sin conocer el contexto en que

se llamó el método (análisis composicional)

Obtiene un único resultado parametrizable El resultado es luego instanciado en cada

lugar que se invoque el método m. Normalmente, el análisis procesa cada

método una única vez. Métodos recursivos requieren varias

pasadas hasta llegar a un punto fijo.

Page 31: Alexandre D. Salcianu and Martin C. Rinard. Idea  Método para analizar la pureza de programas Java (no anotados).  Construido sobre una mejora de “combined

Descanso??????