alexandre d. salcianu and martin c. rinard. idea método para analizar la pureza de programas java...
Post on 24-Jan-2016
214 Views
Preview:
TRANSCRIPT
PURITY AND SIDE EFFECT ANALYSIS FOR JAVA PROGRAMS
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 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.
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.
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
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”
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”.
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
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.
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.
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
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
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
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;}
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);}
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
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
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
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
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
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)
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
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
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
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
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
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
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
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}
Ejemplo: List.add
e P6
this P5
next
data
I1
L1head
headA = {P5, P6, L1}Wm = {<P5, head>}E = {}
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.
Descanso??????
top related