Purity Analysis and Side Effects

Anuncio
Alexandre D. Salcianu and Martin C. Rinard
PURITY AND SIDE EFFECT ANALYSIS
FOR JAVA PROGRAMS
Idea
 Método para analizar la pureza de programas
Java (no anotados).
 Construido sobre una mejora de “combined
pointer and escape analysis method” (RinardWhaley)
 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 p
list
P12
head
L6
data
next
it
I2
cell
L5
next
Círculos sólidos: nodos internos
Círculos punteados: nodos externos
Flechas sólidas: ejes internos
Flechas punteadas: ejes externos
L4
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
this
Cell (Object d, Cell n) {
this.data = d;
this.next = n;
}
d
P4
n
P3
P2
W = {<P2, data>, <P2,next>}
Ejemplo: List.add
this
P5
L1
I1
void add(Object e){
this.head = new Cell(e,this.head);
}
W {<P5, head>}
e
P6
Ejemplo: ListItr.next
this
P10
cell
data
L3
L4
next
result
L5
Object next(){
Object result = this.cell.data;
this.cell = this.cell.next;
return result;
}
W {<P10, cell>}
Análisis Interprocedural
Caso 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)
Ejemplo: sumX
list
P12
it
I2
head
L6
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
head
L6
data
L4
next
it
I2
this
•P10  I2
•L3  L6
•L5  L5
•L4  L4
cell
P10
L5
cell
data
L3
next
Gnext
L5
L4
Ejemplo: sumX
list
P12
head
L6
next
it
I2
cell
L5
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;
}
data
p
L4
Ejemplo: sumX
list
P12
head
L6
p
data
L4
next
it
•P10 I2
•L3  L5
•L3  L6
•L5  L5
•L4  L4
I2
cell
P10
L5
cell
data
L3
next
L5
L4
Ejemplo: sumX
list
P12
head
L6
p
data
L4
next
it
•P10 I2
•L3  L5
•L3  L6
•L5  L5
•L4  L4
I2
cell
P10
L5
cell
next
L3
next
L5
data
L4
Ejemplo: sumX
list
P12
head
L6
data
next
it
I2
cell
L5
next
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;
}
p
L4
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:
n no escapa globalmente y
2. Ningún campo de n es alterado
1.
Ejemplo: sumX
list
P12
head
data
L6
p
L4
next
it
I2
cell
L5
next
A = {P12, L6, L4, L5}
Wm = {}
E = {}
}
 sumX es puro
Ejemplo: List.add
this
A = {P5, P6, L1}
Wm = {<P5, head>}
E = {}
P5
L1
I1
e
P6
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??????
Descargar