Este es el uso coloquial más común del término. Un uso secundario es el análisis de punteros , que es el nombre colectivo tanto para el análisis de puntos a , definido como se describió anteriormente, como para el análisis de alias . El análisis de puntos a y el análisis de alias son problemas estrechamente relacionados, pero no siempre equivalentes.
Ejemplo
Considere el siguiente programa en C:
int * id ( int * p ) { devolver p ; } void main ( void ) { int x ; int y ; int * u = id ( & x ); int * v = id ( & y ); }
Un análisis de punteros calcula una asignación de expresiones de punteros a un conjunto de sitios de asignación de objetos a los que pueden apuntar. Para el programa anterior, un análisis idealizado y totalmente preciso calcularía los siguientes resultados:
(Donde X::Yrepresenta la asignación de pila que contiene la variable local Yen la función X).
Sin embargo, un análisis insensible al contexto como el algoritmo de Andersen o Steensgaard perdería precisión al analizar las llamadas a idy calcularía el siguiente resultado:
Introducción
Como forma de análisis estático, se puede demostrar que el análisis de punteros totalmente preciso es indecidible . [1] La mayoría de los enfoques son sólidos , pero varían ampliamente en rendimiento y precisión. Muchas decisiones de diseño afectan tanto la precisión como el rendimiento de un análisis; a menudo (pero no siempre) una precisión menor produce un rendimiento mayor. Estas opciones incluyen: [2] [3]
Sensibilidad de campo (también conocida como sensibilidad de estructura ): un análisis puede tratar cada campo de una estructura u objeto por separado o fusionarlos.
Sensibilidad de matriz : un análisis de punteros sensible a matrices modela cada índice de una matriz por separado. Otras opciones incluyen modelar solo la primera entrada por separado y el resto juntas, o fusionar todas las entradas de la matriz.
Sensibilidad al contexto o polivarianza : los análisis de punteros pueden calificar la información de los puntos con un resumen del flujo de control que conduce a cada punto del programa.
Sensibilidad del flujo : un análisis puede modelar el impacto del flujo de control intraprocedimental en puntos de referencia.
Modelado de montón : las asignaciones en tiempo de ejecución se pueden abstraer mediante:
sus sitios de asignación (la declaración o instrucción que realiza la asignación, por ejemplo, una llamada a mallocun constructor de objetos),
una única asignación (esto se llama insensibilidad al montón ).
Clonación de montón : los análisis sensibles al contexto y al montón pueden calificar aún más cada sitio de asignación mediante un resumen del flujo de control que conduce a la instrucción o declaración que realiza la asignación.
Restricciones de subconjunto o restricciones de igualdad : al propagar hechos de puntos, diferentes declaraciones de programa pueden inducir diferentes restricciones en los conjuntos de puntos de una variable. Las restricciones de igualdad (como las que se usan en el algoritmo de Steensgaard ) se pueden rastrear con una estructura de datos de búsqueda de unión , lo que genera un alto rendimiento a expensas de la precisión de un análisis basado en restricciones de subconjunto (por ejemplo, el algoritmo de Andersen).
Algoritmos insensibles al contexto y al flujo
Los algoritmos de análisis de punteros se utilizan para convertir los usos de punteros sin procesar recopilados (asignaciones de un puntero a otro o asignación de un puntero para apuntar a otro) en un gráfico útil de lo que cada puntero puede apuntar. [4]
El algoritmo de Steensgaard y el algoritmo de Andersen son algoritmos comunes que no son sensibles al contexto ni al flujo para el análisis de punteros. Se utilizan a menudo en compiladores y tienen implementaciones en SVF [5]
y LLVM .
Enfoques insensibles al flujo
Muchos enfoques para el análisis de punteros insensibles al flujo pueden entenderse como formas de interpretación abstracta , donde las asignaciones de montón se abstraen por su sitio de asignación (es decir, una ubicación de programa). [6]
En Datalog se especifican muchos algoritmos insensibles al flujo , incluidos aquellos en el marco de análisis Soot para Java. [7]
Los algoritmos sensibles al contexto y al flujo logran una mayor precisión, generalmente a costa de cierto rendimiento, al analizar cada procedimiento varias veces, una vez por contexto . [8] La mayoría de los análisis utilizan un enfoque de "cadena de contexto", donde los contextos consisten en una lista de entradas (las opciones comunes de entrada de contexto incluyen sitios de llamada, sitios de asignación y tipos). [9] Para garantizar la terminación (y, de manera más general, la escalabilidad), dichos análisis generalmente utilizan un enfoque de limitación k , donde el contexto tiene un tamaño máximo fijo y los elementos agregados menos recientemente se eliminan según sea necesario. [10] Tres variantes comunes de análisis sensibles al contexto e insensibles al flujo son: [11]
Sensibilidad del sitio de llamada
Sensibilidad del objeto
Sensibilidad de tipo
Sensibilidad del sitio de llamada
En la sensibilidad del sitio de llamada, el conjunto de puntos de cada variable (el conjunto de asignaciones de montón abstractas a las que cada variable podría apuntar) se califica además mediante un contexto que consiste en una lista de sitios de llamada en el programa. Estos contextos abstraen el flujo de control del programa.
El siguiente programa demuestra cómo la sensibilidad del sitio de llamada puede lograr una mayor precisión que un análisis insensible al flujo y al contexto.
int * id ( int * p ) { devolver p ; } void main ( void ) { int x ; int y ; int * u = id ( & x ); // principal.3 int * v = id ( & y ); // principal.4 }
Para este programa, un análisis insensible al contexto concluiría (de manera sólida pero imprecisa) que p puede apuntar a la asignación que contiene x o a la de y , por lo que u y v pueden tener alias, y ambos podrían apuntar a cualquiera de las asignaciones:
Un análisis sensible al sitio de llamada analizaría id dos veces, una para main.3y otra para main.4, y los hechos que apuntan a p serían calificados por el sitio de llamada, lo que permite que el análisis deduzca que cuando main retorna, u solo puede apuntar a la asignación que contiene x y v solo puede apuntar a la asignación que contiene y :
Sensibilidad del objeto
En un análisis sensible a objetos, el conjunto de puntos a los que apunta cada variable se califica mediante la asignación de montón abstracto del objeto receptor de la llamada al método. A diferencia de la sensibilidad al sitio de la llamada, la sensibilidad a objetos no es sintáctica ni local : las entradas de contexto se derivan durante el análisis de puntos a los que apunta. [12]
Sensibilidad de tipo
La sensibilidad de tipo es una variante de la sensibilidad de objeto donde el sitio de asignación del objeto receptor se reemplaza por la clase/tipo que contiene el método que contiene el sitio de asignación del objeto receptor. [13] Esto da como resultado estrictamente menos contextos de los que se usarían en un análisis sensible a objetos, lo que generalmente significa un mejor rendimiento.
Referencias
^ Reps, Thomas (1 de enero de 2000). "Indecidibilidad del análisis de dependencia de datos sensible al contexto". ACM Transactions on Programming Languages and Systems . 22 (1): 162–186. doi : 10.1145/345099.345137 . ISSN 0164-0925. S2CID 2956433.
^ Barbara G. Ryder (2003). "Dimensiones de precisión en el análisis de referencia de lenguajes de programación orientados a objetos". Construcción de compiladores, 12.ª conferencia internacional, CC 2003 celebrada como parte de las conferencias europeas conjuntas sobre teoría y práctica del software, ETAPS 2003 Varsovia, Polonia, 7-11 de abril de 2003 Actas . págs. 126-137. doi : 10.1007/3-540-36579-6_10 .
^ (posterior)Error de harv: no hay destino: CITEREFHind ( ayuda )
^ Zyrianov, Vlas; Newman, Christian D.; Guarnera, Drew T.; Collard, Michael L.; Maletic, Jonathan I. (2019). "srcPtr: Un marco para implementar enfoques de análisis de puntero estático" (PDF) . ICPC '19: Actas de la 27.ª Conferencia Internacional IEEE sobre Comprensión de Programas . Montreal, Canadá: IEEE.
^ Sui, Yulei; Xue, Jingling (2016). "SVF: análisis de flujo de valor estático interprocedimental en LLVM" (PDF) . CC'16: Actas de la 25.ª conferencia internacional sobre construcción de compiladores . ACM.
^ Smaragdakis, Yannis; Bravenboer, Martin; Lhoták, Ondrej (26 de enero de 2011). "Seleccione bien sus contextos". Actas del 38.º simposio anual ACM SIGPLAN-SIGACT sobre principios de lenguajes de programación . POPL '11. Austin, Texas, EE. UU.: Association for Computing Machinery. págs. 17–30. doi :10.1145/1926385.1926390. ISBN978-1-4503-0490-0.S2CID6451826 .
^ Antoniadis, Tony; Triantafyllou, Konstantinos; Smaragdakis, Yannis (18 de junio de 2017). "Transferencia de doop a Soufflé". Actas del 6.º Taller internacional ACM SIGPLAN sobre el estado del arte en análisis de programas . SOAP 2017. Barcelona, España: Association for Computing Machinery. págs. 25–30. doi :10.1145/3088515.3088522. ISBN .978-1-4503-5072-3. Número de identificación del sujeto 3074689.
^ (Smaragdakis y Balatsouras, pág.29)error de harv: sin destino: CITEREFSmaragdakisBalatsouras ( ayuda )
^ Thiessen, Rei; Lhoták, Ondřej (14 de junio de 2017). "Transformaciones de contexto para análisis de punteros". Avisos ACM SIGPLAN . 52 (6): 263–277. doi :10.1145/3140587.3062359. ISSN 0362-1340.
^ (Li y otros, págs. 1:4)error de harv: sin destino: CITEREFLiTanMøllerSmaragdakis ( ayuda )
^ (Smaragdakis y Balatsouras)error de harv: sin destino: CITEREFSmaragdakisBalatsouras ( ayuda )
^ (Smaragdakis y Balatsouras, pág.37)error de harv: sin destino: CITEREFSmaragdakisBalatsouras ( ayuda )
^ (Smaragdakis y Balatsouras, pág.39)error de harv: sin destino: CITEREFSmaragdakisBalatsouras ( ayuda )
Bibliografía
Zyrianov, Vlas; Newman, Christian D.; Guarnera, Drew T.; Collard, Michael L.; Maletic, Jonathan I. (2019). "srcPtr: Un marco para implementar enfoques de análisis de puntero estático" (PDF) . ICPC '19: Actas de la 27.ª Conferencia Internacional IEEE sobre Comprensión de Programas . Montreal, Canadá: IEEE.
Smaragdakis, Yannis; Balatsouras, George (2015). "Análisis de punteros" (PDF) . Fundamentos y tendencias en lenguajes de programación . 2 (1): 1–69. doi :10.1561/2500000014. S2CID 207179267 . Consultado el 30 de mayo de 2019 .
Li, Yue; Tan/, Tian; Møller, Anders; Smaragdakis, Yannis (18 de mayo de 2020). "Un enfoque basado en principios para la sensibilidad al contexto selectivo para el análisis de punteros". ACM Transactions on Programming Languages and Systems . 42 (2): 10:1–10:40. doi :10.1145/3381915. ISSN 0164-0925. S2CID 214812357.
Michael Hind (2001). "Análisis de punteros: ¿aún no hemos resuelto este problema?" (PDF) . PASTE '01: Actas del taller ACM SIGPLAN-SIGSOFT de 2001 sobre análisis de programas para herramientas de software e ingeniería . ACM. págs. 54–61. ISBN 1-58113-413-4.
Steensgaard, Bjarne (1996). "Análisis de puntos en tiempo casi lineal" (PDF) . POPL '96: Actas del 23.º simposio ACM SIGPLAN-SIGACT sobre Principios de lenguajes de programación . Nueva York, NY, EE. UU.: ACM. pp. 32–41. doi :10.1145/237721.237727. ISBN .0-89791-769-3.
Andersen, Lars Ole (1994). Análisis de programas y especialización para el lenguaje de programación C (PDF) (tesis doctoral).