La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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.

Presentaciones similares


Presentación del tema: "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."— Transcripción de la presentación:

1 Alexandre D. Salcianu and Martin C. Rinard

2 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.

3 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.

4 Definiciones  Un método es puro si no “muta” ninguna locación existente en el estado correcto anterior a la invocación del método.  Parámetros Read-Only : el método no cambia ningún objeto alcanzable desde el parámetro.  Parámetros Seguros (safe):  parámetros read-only  el método no crea ningún camino externo visible en el heap hacia objetos alcanzables desde el parámetro.

5 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

6 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 = 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”

7 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”.

8 Ejemplo: Main.sumX list P12 L6 head cell it I2 next L5 L4 data cell p next data Círculos sólidos: nodos internos Círculos punteados: nodos externos Flechas sólidas: ejes internos Flechas punteadas: ejes externos

9 Análisis Intraprocedural  Además del points-to graph, para cada método m el análisis computa un conjunto W m 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 donde n es el nodo y f es el campo.

10 Análisis Intraprocedural  El cálculo del PTG y el W m 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.

11 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

12 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

13 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 W m los campos de la forma : En los campos de variables se realizan weak updates

14 Ejemplo: Cell Constructor W = {, } data next this d n P4 P2 P3 Cell (Object d, Cell n) { this.data = d; this.next = n; }

15 Ejemplo: List.add W { } e P6 this P5 next data I1 L1 head void add(Object e){ this.head = new Cell(e,this.head); }

16 Ejemplo: ListItr.next this P10 L3 cell next L5 L4 data W { } Object next(){ Object result = this.cell.data; this.cell = this.cell.next; return result; } result

17 Análisis Interprocedural Caso Fácil  Por cada llamada (call) del tipo v R = v 0.s(v 1, …, v j ) Si s es un método no analizable entonces todos los argumentos (v 0,v 1, …, v j ) pueden ser alcanzados por código desconocido. Luego el análisis agrega todos los nodos apuntados por v 0,v 1, …, v j al conjunto E de nodos que escapan globalmente Además se agrega un eje entre v r y el nodo n glb

18 Análisis Interprocedural  Por cada llamada (call) del tipo v R = v 0.s(v 1, …, v j ) el análisis usa el points-to graph G anterior a la llamada y el points-to graph G calle (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

19 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

20 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

21 Paso 2: Merge 1. Se utiliza el mapeo para combinar el grafo anterior a la llamada (G) y el grafo de la llamada (G calle ), 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 (W calle ) para actualizar los campos modificados del método m(W m ) (utilizando el mapeo)

22 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 L6 head cell it I2

23 Ejemplo: sumX P10 L3 cell next L5 L4 data list P12 L6 head cell it I2 G next this P10  I2 L3  L6 L5L4 L5  L5 L4  L4 next data cell

24 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 L6 head cell it I2 next L5 L4 data cell p

25 next L5 L4 data cell Ejemplo: sumX P10 L3 cell next L5 L4 data list P12 L6 head cell it I2 p P10  I2 L3  L5 L3  L6 L5  L5 L4  L4

26 next L5 L4 data cell Ejemplo: sumX P10 L3 cell next L5 L4 data list P12 L6 head cell it I2 p P10  I2 L3  L5 L3  L6 next data L5  L5 L4  L4

27 next L5 L4 data cell Ejemplo: sumX P10 L3 cell next L5 L4 data list P12 L6 head cell it I2 p P10  I2 L3  L5

28 next L5 L4 data cell Ejemplo: sumX P10 L3 cell next L5 L4 data list P12 L6 head cell it I2 p P10  I2 L3  L5 L3  L6 L4  L4 L5  L5

29 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 L6 head cell it I2 next L5 L4 data cell p next data

30 Análisis de Efectos  Este análisis se realiza sobre el análisis descripto anteriormente.  El análisis propaga efectos intraprocedurales de las siguiente forma: cuando el análisis del método m encuentra una invocación, se utiliza el mapeo de nodos interprocedural para proyectar los efectos del método invocado e incluir esos efectos en el conjunto W m.

31 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

32 Ejemplo: sumX list P12 L6 head cell it I2 next L5 L4 data cell p next data A = {P12, L6, L4, L5} W m = {} E = {}  sumX es puro }

33 Ejemplo: List.add e P6 this P5 next data I1 L1 head A = {P5, P6, L1} W m = { } E = {}

34 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.

35 Parámetros read-Only Para chequear si el parámetro p es read-only:  Considerar el nodo correspondiente n p  Determinar el conjunto S 1 que contiene a n p y todos los load nodes alcanzables desde n p utilizando ejes externos  El parámetro p es read-only si y solo si: 1. No hay ningún campo abstracto perteneciente a W m tal que n pertenece a S 1 2. Ningún nodo de S 1 escapa globalmente

36 Parámetros Safe Para chequear si un p parámetro es safe:  Se computa el conjunto S 1  Se computa el conjunto S 2 de nodos alcanzables desde nodos parámetros y/o desde nodos retornados, utilizando ejes externos o internos.  Para chequear la ausencia de un nuevo camino hacia un objeto alcanzable desde p, basta con chequear que ningún eje interno vaya desde un nodo en S 2 a un nodo en S 1

37 Write effects  Infiere expresiones regulares que describen las locaciones del preestado modificadas por el método que estamos analizando.  Ejemplo: para el método flipAll obtiene la ER: list.head.next*.data.(x|y)

38 Descanso??????


Descargar ppt "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."

Presentaciones similares


Anuncios Google