O bisturi é uma estrutura de análise estática do Python. Ele fornece funções essenciais de análise de programa para facilitar a implementação de aplicativos de clientes com foco na resolução de problemas dedicados estaticamente.
Instale o bisturi usando o PIP com o seguinte comando
pip install python-scalpelApreciaremos muito se você puder contribuir para este projeto. Sinta -se à vontade para fazê -lo enviando relatórios de emissão ou adicionando diretamente solicitações de tração. Esperamos obter ajuda para:
Guias detalhados do usuário podem ser encontrados em python-scalpel.readthedocs.io.
Nosso objetivo é fornecer o bisturi como uma estrutura de análise estática genérica do Python que inclua o maior número possível de funções (por exemplo, para construir facilmente o gráfico de fluxo de controle entre funções, para interpretar o relacionamento de importação de diferentes módulos de Python etc.) para facilitar os desenvolvedores para implementar seus analisadores estáticos focados em problemas dedicados. A figura a seguir descreve a arquitetura atual de seu design.

A documentação da API do bisturi está disponível em python-scalpel.readthedocs.io.
Lançamos o código -fonte do bisturi na esperança de beneficiar os outros. Você é solicitado a reconhecer o uso da ferramenta citando o seguinte artigo:
@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}
}
O bisturi é convidado a ser apresentado em Europython 2022. O EUROPYTHON é a conferência de programação Python mais antiga e mais antiga liderada por voluntários sobre o planeta!

Este projeto foi inspirado por muitos trabalhos existentes. Se você acha que seu trabalho aparece neste projeto, mas ainda não foi mencionado, informe -nos por qualquer meio.
Função 1: Reescritor de código. O módulo de reescrita de código foi projetado como uma função fundamental para apoiar mudanças sistemáticas nos programas Python existentes. Dois usos preliminares desta função são (1) simplificar os programas para obter melhores análises estáticas e (2) otimizar ou reparar programas problemáticos. Para apoiar o primeiro uso, integramos na estrutura um banco de dados, incluindo um conjunto de regras indicando como os trechos de código correspondentes devem ser transformados. Esse banco de dados deve ser estendido continuamente para atender aos complicados requisitos de simplificação para alcançar uma análise estática eficaz de programas Python. Para apoiar o segundo uso, inspirado no mecanismo de otimização fornecido pela fuligem (uma das mais famosas estruturas de análise de programa Java estático), também configuramos um processo de transformação com métodos dedicados de retorno de chamada a serem reescritos pelos usuários para otimizar o código Python com base em suas necessidades personalizadas.
Função 2: Construção de gráficos de fluxo de controle. O módulo de construção do gráfico de fluxo de controle de controle (CFG) gera CFGs intra-procedurais, que são um componente essencial na análise de fluxo estático com aplicações como otimização do programa e análise de mancha. Um CFG representa todos os caminhos que podem ser percorridos através de um programa durante sua execução. Os CFGs de um projeto Python podem ser combinados com o gráfico de chamada para gerar um CFG interprocedural do projeto.
Função 3: Representação estática de atribuição única (SSA). O módulo de atribuição única estática fornece representações intermediárias no nível do compilador (IR) para análise de código. Ele não pode ser usado apenas para execução simbólica, mas também para propagação constante. Ao renomear cada atribuição de variável com nomes diferentes, podemos obter cadeias explícitas de uso de uso, rastreando com precisão como o fluxo de dados no programa.
Função 4: Análise de Alias. Como as variáveis podem apontar para a mesma localização da memória ou valores idênticos, a função de análise de alias foi projetada para modelar esses usos. Esta função pode ser vital para soar propagação constante. Além disso, a análise de alias também beneficiará a verificação do tipo, bem como a qualificação do nome da API.
Função 5: propagação constante. O módulo de propagação constante avaliará os valores reais para variáveis em determinados pontos do programa em diferentes caminhos de execução antes do tempo de execução. Com os valores reais conhecidos com antecedência, podemos otimizar o código e detectar erros. A propagação constante utilizará a representação do módulo SSA para manter os valores de gravação de cada atribuição para uma única variável.
Função 6: Importar construção de gráficos. No Python, os fluxos e as relações de importação foram apontados para serem importantes para o mapeamento da API e análise de dependência. Nossa construção de gráficos de importação visa fornecer uma estrutura de dados para representar esses relacionamentos de importação nos arquivos do módulo Python no mesmo projeto. Os gráficos de importação de vários projetos Python podem ser combinados para executar a análise entre bibliotecas de fluxo de dados.
Função 7: Nome totalmente qualificado InferRer. APIs de Python ou nomes de funções podem ser invocados de maneiras diferentes, dependendo de como são importadas. No entanto, isso resulta em inconvenientes para a análise de uso da API. Neste módulo, converteremos todos os nomes de chamadas de função em seus nomes totalmente qualificados, que são seqüências pontilhadas que podem representar o caminho do módulo de nível superior até o próprio objeto. Várias tarefas podem ser beneficiadas com essa funcionalidade, como entender o uso de API depreciado, a análise de dependência e a criação de gráficos de chamadas de som.
Função 8: Chamada de construção de gráficos. Um gráfico de chamadas mostra as relações de chamada entre métodos em um programa de software. É um componente fundamental na análise de fluxo estático e pode ser alavancado em tarefas como perfil, propagação de vulnerabilidade e refatoração. Este módulo aborda os desafios trazidos por recursos complicados adotados no Python, como funções de ordem superior e definições de funções aninhadas, para construir gráficos de chamadas precisas para determinados projetos Python.
Função 9: Digite inferência. O Python, como uma linguagem tipulada dinamicamente, enfrenta o problema de ser difícil de utilizar todo o poder da análise estática tradicional. Este módulo infere a informação de tipo de todas as variáveis, incluindo valores de retorno da função e parâmetros de função em um programa Python, possibilitando uma análise estática mais sofisticada possível para o Python. Utilizamos a análise de fluxo de dados para trás e um conjunto de regras heurísticas para obter alta precisão.