El bisturí es un marco de análisis estático de Python. Proporciona funciones de análisis de programas esenciales para facilitar la implementación de aplicaciones de clientes que se centran en la resolución estáticamente de problemas dedicados.
Instale el bisturí usando PIP con el siguiente comando
pip install python-scalpelLo apreciaremos mucho si puede contribuir a este proyecto. No dude en hacerlo enviando informes de problemas o agregando directamente solicitudes de extracción. Esperamos obtener ayuda para:
Se pueden encontrar guías de usuario detalladas en Python-Scalpel.readthedocs.io.
Nuestro objetivo es proporcionar el bisturí como un marco genérico de análisis estático de Python que incluye tantas funciones como sea posible (por ejemplo, para construir fácilmente el gráfico de flujo de control de interfunciones, para interpretar la relación de importación de diferentes módulos de Python, etc.) para facilitar a los desarrolladores a implementar sus análisis estáticos centrados en problemas dedicados. La siguiente figura representa la arquitectura actual de su diseño.

La documentación API del bisturí está disponible en Python-Scalpel.readthedocs.io.
Lanzamos el código fuente del bisturí con la esperanza de beneficiar a otros. Se le pide amablemente que reconozca el uso de la herramienta citando el siguiente artículo:
@article{li2022scalpel,
title={Scalpel: The Python Static Analysis Framework},
author={Li, Li and Wang, Jiawei and Quan, Haowei},
journal={arXiv preprint arXiv:2202.11840},
year={2022}
}
Se invita a Scalpel a presentarse en Europython 2022. Europython es la conferencia de programación de Python dirigida por voluntarios más antigua y más antigua en el planeta!

Este proyecto se ha inspirado en muchas obras existentes. Si cree que su trabajo aparece en este proyecto pero aún no se ha mencionado, háganoslo saber de alguna manera.
Función 1: Rewriter de código. El módulo de reescritores de código está diseñado como una función fundamental para soportar cambios sistemáticos en los programas de Python existentes. Dos usos preliminares de esta función son (1) simplificar los programas para un mejor análisis estático y (2) optimizar o reparar programas problemáticos. Para admitir el primer uso, integramos en el marco una base de datos que incluye un conjunto de reglas que indican cómo se deben transformar los fragmentos de código coincidentes. Esta base de datos debe extenderse continuamente para cumplir con los complicados requisitos de simplificación para lograr un análisis estático efectivo de los programas de Python. Para apoyar el segundo uso, inspirado en el mecanismo de optimización proporcionado por Soot (uno de los marcos de análisis de programas Java más famosos más famosos), también establecemos un proceso de transformación con métodos de devolución de llamada dedicados para ser reescritos por los usuarios para optimizar el código de Python en función de sus necesidades personalizadas.
Función 2: Construcción del gráfico de flujo de control. El módulo de construcción del gráfico de flujo de control (CFG) genera CFG intraprocedurales, que son un componente esencial en el análisis de flujo estático con aplicaciones como la optimización del programa y el análisis de Taint. Un CFG representa todas las rutas que podrían atravesarse a través de un programa durante su ejecución. Los CFG de un proyecto Python se pueden combinar con el gráfico de llamadas para generar un CFG interprocedural del proyecto.
Función 3: Representación de asignación única estática (SSA). El módulo de asignación única estática proporciona representaciones intermedias (IR) a nivel de compilador para el análisis de código. No solo se puede usar para la ejecución simbólica sino también para propagación constante. Al renombrar cada asignación de variable con diferentes nombres, podemos obtener cadenas explícitas de uso de uso, por lo tanto, rastreando con precisión cómo fluyen los datos en el programa.
Función 4: Análisis de alias. Dado que las variables pueden apuntar a la misma ubicación de memoria o valores idénticos, la función de análisis de alias está diseñada para modelar dichos usos. Esta función puede ser vital para una propagación constante de sonido. Además, el análisis de alias también beneficiará a la comprobación de tipo de tipo, así como a la calificación del nombre de la API.
Función 5: propagación constante. El módulo de propagación constante evaluará los valores reales para las variables en ciertos puntos del programa en diferentes rutas de ejecución antes del tiempo de ejecución. Con los valores reales conocidos de antemano, podemos optimizar el código y detectar errores. La propagación constante utilizará la representación del módulo SSA para mantener los valores de grabación de cada asignación para una sola variable.
Función 6: Importar construcción de gráficos. En Python, se ha señalado que los flujos de importación y las relaciones son importantes para el mapeo API y el análisis de dependencia. Nuestra construcción de gráficos de importación tiene como objetivo proporcionar una estructura de datos para representar estas relaciones de importación en los archivos del módulo Python en el mismo proyecto. Los gráficos de importación de múltiples proyectos de Python se pueden combinar para realizar análisis de flujo de datos interbibliotecarios.
Función 7: Nombre completamente calificado Inferrer. Las API o los nombres de funciones de Python se pueden invocar de diferentes maneras dependiendo de cómo se importen. Sin embargo, esto da como resultado inconvenientes para el análisis de uso de API. En este módulo, convertiremos todos los nombres de llamadas de funciones a sus nombres totalmente calificados que son cadenas punteadas que pueden representar la ruta desde el módulo de nivel superior hasta el objeto en sí. Varias tareas pueden beneficiarse de esta funcionalidad, como comprender el uso de API desactivado, el análisis de dependencia y la creación de gráficos de llamadas de sonido.
Función 8: Llame a la construcción del gráfico. Un gráfico de llamadas muestra relaciones de llamadas entre métodos en un programa de software. Es un componente fundamental en el análisis de flujo estático y se puede aprovechar en tareas como perfiles, propagación de vulnerabilidad y refactorización. Este módulo aborda los desafíos traídos por las características complicadas adoptadas en Python, como funciones de orden superior y definiciones de funciones anidadas, para construir gráficos precisos de llamadas para proyectos de Python dados.
Función 9: Tipo de inferencia. Python, como un lenguaje tipado dinámicamente, enfrenta el problema de ser difícil de utilizar el poder completo del análisis estático tradicional. Este módulo infiere la información de tipo de todas las variables, incluidos los valores de retorno de la función y los parámetros de función en un programa de Python, lo que hace posible un análisis estático más sofisticado para Python. Utilizamos el análisis de flujo de datos hacia atrás y un conjunto de reglas heurísticas para lograr una alta precisión.