• No results found

Chapter 3: Recognition

3.4. Exceptions to the general requirements for recognition

3.4.1. Relevance

permite verificar propiedades interesantes sobre la forma de las estructuras de datos manipuladas por programas sobre ´arboles binarios. Para un programa con su precondici´on, el an´alisis calcula autom´aticamente invariantes para cada ciclo y una postcondici´on. Esta sem´antica es una sobreaproximaci´on de la sem´antica operacional sobre un modelo de memoria est´andar, por lo que puede reportar falsos fallos de memoria ymemory leaks. Sin embargo, los experimentos mues-

65

tran un buen nivel de ajuste entre los estados abstractos computados y aquellos esperados seg´un la sem´antica concreta.

Para definir el an´alisis, introdujimos un novedoso predicado linealtreesque describe estructuras de datos no lineales con m´ultiples puntos de entrada y de salida. Este predicado nos da la posibilidad de expresar de forma sencilla las complejas estructuras que normalmente aparecen en los puntos intermedios durante la ejecuci´on de programas. Las buenas propiedades sint´acticas que posee permiten una caracterizaci´on simple de la fase de abstracci´on del an´alisis.

La utilizaci´on del an´alisis est´atico que determina el nivel de relevancia de las variables para la fase de abstracci´on, aunque es una idea muy sencilla, introduce una mejora significativa en cuanto a invariantes de ciclo m´as compactos, sin perjudicar la precisi´on necesaria para obtener postcondiciones relevantes. En algunos casos se consigue una reducci´on dram´atica en la cantidad de f´ormulas que componen un estado abstracto, agilizando el proceso completo del an´alisis, y ayudando a la computaci´on de invariantes comprensibles e intuitivamente correctos. Nos permite adem´as prever un buen comportamiento del an´alisis sobre programas de mayor tama˜no.

Como consideraci´on final, al basar nuestro an´alisis en el trabajo [9], hereda- mos todas las ventajas de la Separation Logic. Nuestras reglas de reescrituras son implicaciones v´alidas cuya verificaci´on sem´antica es muy sencilla, mientras que las reglas de ejecuci´on simb´olica se derivan directamente de las ternas de Hoare. De esta manera el an´alisis resulta intuitivo y su correcci´on f´acilmente comprobable.

Ap´endice

La realizaci´on de este trabajo se llev´o a cabo en dos etapas, en momentos diferentes. En la primera etapa hubo un proceso de aprendizaje sobreSepara- tion Logic y lectura de diferentes art´ıculos basados en ella referidos a distintos shape analysis, ejecuci´on simb´olica, etc. Con este conocimiento se emprendi´o un camino de investigaci´on con la intenci´on de poder describir estructuras de datos no lineales y verificar propiedades sobre algoritmos que las manipulan. Este proceso dio como frutos la realizaci´on del art´ıculo [8], conjuntamente con Renato Cherini y Javier Blanco, y del que se basa la presentaci´on del cap´ıtulo 3. Finalmente, en la segunda etapa se realiz´o una revisi´on de ese art´ıculo y la escritura final de este trabajo. En la actual presentaci´on, se opt´o por cambiar algunas de las reglas de la fase de abstracci´on y se corrigi´o un error referido a la terminaci´on del an´alisis descubierto en la revisi´on del art´ıculo. Estas diferencias se presentan a continuaci´on.

Para empezar, se reemplazaron algunas reglas de la primera etapa de la funci´on de abstracci´on abs por dos reglas m´as simples, AbsPointer y AbsTree, junto con la regla de normalizaci´on de ´arboles sin punteros de salidaDivideTree, presentadas en la definici´on 73. Las otras reglas de esa etapa, las de eliminaci´on de punteros nil y de expresiones iguales en los multiconjuntos de entrada y salida, est´an de igual manera en el trabajo original.

La mayor´ıa de las reglas sustituidas se pueden expresar con la aplicaci´on de las reglas actuales. La reglaAbsTree2del trabajo original:

Π¦Σ`x=y Π¦Σ`Cell(e)∨e=nil para todoeenF

Π¦Σ∗trees.C.(x⊕ D)∗ T.(y⊕ E).F =⇒ Π¦Σ∗ trees.(C ] E).(D ] F) es igual a nuestra nueva regla AbsTree para el caso en que T represente un predicadotrees, teniendo en cuenta que la condici´onCell(e) es igual a nuestra condici´onnoDangling.e, solo que esta ´ultima tambi´en incluye el caso e=nil, por lo que no hace falta explicitarlo aparte. CuandoTrepresenta un predicado de

7→, esta regla se puede expresar usando en primer lugar la reglaAbsPointerpara abstraer el predicado de7→en un predicadotrees, que gracias a la condici´on de que todas las expresiones de F representan punteros a registros v´alidos en un heap disjunto al del predicadoT o sonnil, se puede establecer su condici´on de quey sea distinto a los elementos deF, y en segundo lugar directamente con la reglaAbsTree.

La regla original AbsTree1se puede obtener componiendo las nuevas reglas DivideTreepara separar la variabley del resto de los punteros de entrada deE

en su propio predicadotreesy la reglaAbsTreepara unir este predicadotrees resultante contrees.C.x⊕ D.

Σ= Σ. 0 trees.C.x⊕ D ∗trees.y⊕ E. Π¦Σ`x=y

Π¦Σ =⇒ Π¦Σ0 ∗trees.C.D ∗trees.E.∅

De la misma forma, la regla original AbsArrow1, que no presentamos ac´a, tanto para el caso de abstracci´on del link izquierdo como para el an´alogo caso del derecho, se puede expresar con la combinaci´on de las tres nuevas reglas AbsPointer,DivideTreeyAbsTree.

En general, las reglas en el trabajo original son m´as complejas porque se pretend´ıa asegurar que con su aplicaci´on se redujeran de alguna manera las ex- presiones involucradas en los predicados de7→otrees. As´ı es que en esas reglas siempre hay un enlace de cadena que se abstrae y desaparece. Un posible proble- ma del nuevo conjunto de reglas es que se podr´ıa aplicar la reglaAbsPointersin que ello conlleve a una aplicaci´on de la reglaAbsTree. Esta ´ultima regla es la de mayor importancia en la abstracci´on ya que permite unir estructuras parciales entre s´ı, olvidando informaci´on concreta innecesaria. En el mencionado caso, la abstracci´on de un predicado de7→habr´ıa sido en vano y adem´as podr´ıa generar inconvenientes para continuar con el an´alisis en caso de que se intente acceder a la variable asbtraida. Afortunadamente, esto no sucede gracias al c´alculo del nivel de relevancia de las variables y a la posibilidad de abstraerlas cuando no se va a requerir un dereferenciamiento de las mismas en los comandos posteriores. La ´unica regla del trabajo original que no se puede expresar con el conjunto de reglas nuevas es AbsArrow2, que presentamos a continuaci´on para el caso izquierdo, ya que el derecho es an´alogo:

Σ= Σ. 0 ∗x7→l, v, r∗T.y⊕ C.D Π¦Σ`l=y ∧x∈∈/r⊕ D ∧y∈∈ D/

Π¦Σ =⇒ Π¦Σ0 ∗trees.x⊕ C.r⊕ D

El caso en que T represente un predicado de 7→, se puede abstraer con la regla AbsPointer en un predicado trees ya que tenemos la condici´on de apli- caci´on asegurada con y∈∈ D/ . Por lo tanto, asumiremos que T representa un predicadotrees. En el conjunto de reglas nuevas la combinaci´on de estructuras se da siempre sobre predicados trees, por lo que podr´ıamos intentar abstraer el predicado de puntero x7→l, v, ren un predicadotrees. La condici´ony∈∈ D/ , junto conT.y⊕ C.Dimplica que podemos probar quex6=l (l es igual a y que es un puntero v´alido o es nil). Tambi´en podemos probar x6=r (es implicado porx∈∈/r⊕ D) por lo que efectivamente podemos abstraer el predicado de7→a trees.{|x|}.{|l, r|}. Ahora es cuando se plantea el problema de tener condiciones de aplicaci´on de la nueva reglaAbsTreem´as fuertes de lo que exige la regla ori- ginalAbsArrow2. La condici´on x∈∈ D/ es realmente necesaria para mantener la estructura de ´arbol (sin ciclos) si se pretende combinar los dos predicadostrees, pero no es suficiente. Al perder la informaci´on de que el ´arboltrees.{|x|}.{|l, r|}

en realidad representaba un solo registro apuntado por x, la simple condici´on

x∈∈ D/ ya no alcanza para asegurar que ning´un elemento deDreferencie a alg´un registro del otro ´arbol. Sin embargo, la manera en que usualmente se establece la validez de una condici´on como x∈∈ D/ , sabiendo quexreferencia un registro v´alido, es con los elementos deDreferenciando otros registros o siendo iguales a nil, es decir, siendonoDangling, que es precisamente la condici´on de aplica- ci´on de la reglaAbsTree. Entonces, en los casos pr´acticos generalmente se puede lograr la abstracci´on y as´ı es como con el nuevo conjunto de reglas se pudieron verificar los mismos algoritmos analizados en el trabajo original.

69

En la revisi´on del art´ıculo original para la escritura de este trabajo se descu- bri´o un error referido a la terminaci´on del an´alisis. Para asegurar la terminaci´on en el c´omputo del punto fijo de los invariantes, se usaba (y se sigue usando) que la imagen de la funci´on abs era finita. Sin embargo, esto no era cierto. Hab´ıa algunos detalles menores, como considerar al conjunto de los n´umeros naturales como los valores elementales en la definici´on del estado y como constantes del conjunto de expresiones. Entonces, las reglas de abstracci´on de la segunda y tercera etapa no prohib´ıan que t´erminos de la forma x6=n con x variable de programa con un nivel de relevancia mayor a 0 yncualquier constante num´erica entre los naturales ocurran en lossymbolic heapsde la imagen deabs, por lo que dicha imagen no pod´ıa ser finita. Por otro lado, las condiciones de aplicaci´on de las reglas que eliminaban variables cuantificadas de la parte espacial de un symbolic heap imped´ıan que f´ormulas como:

trees.{|x01|}.{|y01|} ∗ trees.{|x01|}.{|y02|} ∗trees.{|x02|}.{|y10|} ∗trees.{|x02|}.{|y20|}

pudieran ser abstra´ıdas, para cualesquiera variables cuantificadasx01, x02, y01, y02, causando infinitas f´ormulas posibles en la imagen deabs. Esta f´ormula, si bien debe necesariamente ser equivalente aempo a una f´ormula de la forma trees.{|x0|}.{|y0|} ∗trees.{|y0|}.{|x0|}para que sea v´alida, cumple con su objetivo de refutaci´on.

Los casos anteriores motivaron que en este trabajo, por un lado se use el conjuntoZk de los n´umeros enteros entre 0 yk−1 como valores elementales y

constantes de las expresiones, y por el otro se usen las reglasGarbage1-3de la segunda etapa (definici´on 77) como forma efectiva para limitar la proliferaci´on de variables cuantificadas.

Si bien los casos anteriores son medio rebuscados y dif´ıcilmente se puedan ob- tener como resultados de la ejecuci´on de un programa real, un tema importante es que en los multiconjuntos de los predicadostreespodr´ıan ocurrir expresiones una cantidad arbitraria de veces. Ya no hablamos de variables cuantificadas, sino de una misma variable de programa. M´as a´un, el siguiente algoritmo muestra una construcci´on donde se consigue generar un estado abstracto con una canti- dad no acotada desymbolic heapsen la ejecuci´on del ciclo, usando las reglas del trabajo original, de manera que no solo se evidencia la no finitud de la imagen deabs, sino que representa un ejemplo para el que el an´alisis no termina:

whilex6=pdo k:=new(z,0, d); z.2 :=p; x:=z; z:=k od

El programa anterior, partiendo de la precondici´on:

true¦p7→p,0, p∗z7→x,0, d∗ trees.{|x|}.∅

genera, luego de la ejecuci´on del cuerpo del ciclo, f´ormulas como las siguientes:

true¦p7→p,0, p∗ z7→x,0, d∗ trees.{|x|}.{|p|}

true¦p7→p,0, p∗ z7→x,0, d∗ trees.{|x|}.{|p, p|}

donde cada vez hay una mayor cantidad de expresiones pen el multiconjunto de los punteros de salida del ´ultimo predicadotrees.

Vemos a continuaci´on c´omo se van modificando los symbolic heaps en el cuerpo del ciclo, partiendo del segundo ejemplo de arriba con la guardax6=p

{x6=p¦p7→p,0, p∗ z7→x,0, d∗ trees.{|x|}.{|p, p|}} k:=new(z,0, d); {x6=p¦p7→p,0, p∗ k7→z,0, d∗ z7→x,0, d ∗trees.{|x|}.{|p, p|}} z.2 :=p; {x6=p¦p7→p,0, p∗ k7→z,0, d∗ z7→x,0, p∗ trees.{|x|}.{|p, p|}} x:=z; {x06=p¦p7→p,0, p∗ k7→x,0, d∗ x7→x0,0, p ∗trees.{|x0|}.{|p, p|}} z:=k {x06=p¦p7→p,0, p∗ z7→x,0, d ∗x7→x0,0, p∗trees.{|x0|}.{|p, p|}}

En el ´ultimosymbolic heap podemos aplicar la regla del trabajo originalAb- sArrow2(usando quex0 6=ppara establecery∈∈ D/ ) o las nuevas reglasAbsPointer (usando que x0 6=ppara demostrar que x6=x0) y AbsTree para combinar los ´

ultimos dos t´erminos entrees.{|x|}.{|p, p, p|}.

Notar que el ejemplo es de un ciclo infinito que construye dags cada vez mayores. Como no es la intenci´on del trabajo especificar dags, se incluyen en la segunda etapa las reglas Garbage4-5que evitan que ocurran situaciones as´ı. Adem´as en el trabajo se presenta una justificaci´on detallada de la finitud de la imagen deabs.

Bibliograf´ıa

[1] GNU libavl. http://adtinfo.org/index.html.

[2] Josh Berdine, Cristiano Calcagno, Byron Cook, Dino Distefano, Peter W. O’Hearn, and Hongseok Yang. Shape analysis for composite data structu- res. In Werner Damm and Holger Hermanns, editors,CAV, volume 4590 ofLNCS, pages 178–192. Springer, 2007.

[3] Josh Berdine, Cristiano Calcagno, and Peter W. O’Hearn. Symbolic execu- tion with separation logic. InAPLAS, volume 3780 ofLNCS, pages 52–68. Springer, 2005.

[4] Igor Bogudlov, Tal Lev-Ami, Thomas W. Reps, and Mooly Sagiv. Revam- ping TVLA: Making parametric shape analysis competitive. In Werner Damm and Holger Hermanns, editors,CAV, volume 4590 of LNCS, pages 221–225. Springer, 2007.

[5] Cristiano Calcagno, Dino Distefano, Peter W. O’Hearn, and Hongseok Yang. Compositional shape analysis by means of bi-abduction. In Zhong Shao and Benjamin C. Pierce, editors, ACM SIGPLAN-SIGACT 2009 Symposium on Principles of Programming Languages, pages 289–300. ACM, 2009.

[6] Bor-Yuh Evan Chang and Xavier Rival. Relational inductive shape analy- sis. In ACM SIGPLAN-SIGACT 2008 Symposium on Principles of Pro- gramming Languages, pages 247–260. ACM, 2008.

[7] Bor-Yuh Evan Chang, Xavier Rival, and George C. Necula. Shape analysis with structural invariant checkers. In Hanne Riis Nielson and Gilberto Fil´e, editors,SAS, volume 4634 ofLNCS, pages 384–401. Springer, 2007.

[8] Renato Cherini, Lucas Rearte, and Javier Blanco. A shape analysis for non-linear data structures. In International Static Analysis Symposium, pages 201–217. Springer, 2010.

[9] Dino Distefano, Peter W O’hearn, and Hongseok Yang. A local shape analysis based on separation logic. InInternational Conference on Tools and Algorithms for the Construction and Analysis of Systems, pages 287– 302. Springer, 2006.

[10] Jacob Elgaard, Anders Møller, and Michael I. Schwartzbach. Compile-time debugging of C programs working on trees. In Gert Smolka, editor,ESOP, volume 1782 ofLNCS, pages 182–194. Springer-Verlag, 2000.

[11] Alexey Gotsman, Josh Berdine, and Byron Cook. Interprocedural shape analysis with separated heap abstractions. In Kwangkeun Yi, editor,SAS, volume 4134 ofLNCS, pages 240–260. Springer, 2006.

[12] Jesper G. Henriksen, Jakob L. Jensen, Michael E. Jørgensen, Nils Klarlund, Robert Paige, Theis Rauhe, and Anders Sandholm. Mona: Monadic second- order logic in practice. In Ed Brinksma, Rance Cleaveland, Kim Guldstrand Larsen, Tiziana Margaria, and Bernhard Steffen, editors,TACAS, volume 1019 ofLNCS, pages 89–110. Springer, 1995.

[13] Charles Antony Richard Hoare. An axiomatic basis for computer program- ming. Communications of the ACM, 12(10):576–580, 1969.

[14] Bart Jacobs and Frank Piessens. The verifast program verifier. Technical Report CW-520, Department of Computer Science, Katholieke Universiteit Leuven, Belgium, August 2008.

[15] Bart Jacobs, Jan Smans, and Frank Piessens. Verifying the composite pattern using separation logic. In SAVCBS Composite pattern challenge track, 2008.

[16] Jakob L. Jensen, Michael E. Jørgensen, Michael I. Schwartzbach, and Nils Klarlund. Automatic verification of pointer programs using monadic second-order logic. InACM SIGPLAN 1997 Conference on Programming Language Design and Implementation, pages 226–236. ACM, 1997. [17] Oukseh Lee, Hongseok Yang, and Kwangkeun Yi. Automatic verification

of pointer programs using grammar-based shape analysis. In Shmuel Sagiv, editor,ESOP, volume 3444 ofLNCS, pages 124–140. Springer, 2005.

[18] Tal Lev-Ami and Shmuel Sagiv. TVLA: A system for implementing static analyses. In Jens Palsberg, editor,SAS, volume 1824 ofLNCS, pages 280– 301. Springer, 2000.

[19] Alexey Loginov, Thomas W. Reps, and Mooly Sagiv. Automated verifi- cation of the deutsch-schorr-waite tree-traversal algorithm. In Kwangkeun Yi, editor,SAS, volume 4134 ofLNCS, pages 261–279. Springer, 2006.

[20] Anders Møller and Michael I. Schwartzbach. The pointer assertion logic engine. In ACM SIGPLAN 2001 Conference on Programming Language Design and Implementation. ACM, 2001.

[21] Huu Hai Nguyen, Cristina David, Shengchao Qin, and Wei-Ngan Chin. Automated verification of shape and size properties via separation logic. In Byron Cook and Andreas Podelski, editors, VMCAI, volume 4349 of LNCS, pages 251–266. Springer, 2007.

[22] John C. Reynolds. Separation logic: A logic for shared mutable data struc- tures. In 17th IEEE Symposium on Logic in Computer Science, pages 55–74. IEEE Computer Society, 2002.

[23] Shmuel Sagiv, Thomas W. Reps, and Reinhard Wilhelm. Parametric shape analysis via 3-valued logic. ACM Trans. Program. Lang. Syst., 24(3):217– 298, 2002.

BIBLIOGRAF´IA 73

[24] Hongseok Yang.Local reasoning for stateful programs. PhD thesis, Univer- sity of Illinois at Urbana-Champaign, 2001.

[25] Hongseok Yang, Oukseh Lee, Josh Berdine, Cristiano Calcagno, Byron Co- ok, Dino Distefano, and Peter W. O’Hearn. Scalable shape analysis for systems code. In Aarti Gupta and Sharad Malik, editors, CAV, volume 5123 ofLNCS, pages 385–398. Springer, 2008.

Related documents