Scalpel est un cadre d'analyse statique Python. Il fournit des fonctions d'analyse de programme essentiels pour faciliter la mise en œuvre des applications clients axées sur la résolution statiquement des problèmes dédiés.
Installez Scalpel à l'aide de PIP avec la commande suivante
pip install python-scalpelNous l'apprécierons fortement si vous pouvez contribuer à ce projet. N'hésitez pas à le faire en soumettant des rapports de problème ou en ajoutant directement des demandes de traction. Nous espérons obtenir de l'aide pour:
Des guides utilisateur détaillés peuvent être trouvés sur python-scalpel.readthedocs.io.
Nous visons à fournir un scalpel en tant que cadre d'analyse statique de python générique qui comprend autant de fonctions que possible (par exemple, pour construire facilement le graphique de contrôle de contrôle inter-fonctionnement, pour interpréter la relation d'importation de différents modules Python, etc.) vers la facilitation des développeurs pour implémenter leurs analyseurs statiques statiques axés sur les problèmes dédiés. Le chiffre suivant illustre l'architecture actuelle de sa conception.

La documentation de l'API de Scalpel est disponible sur python-scalpel.readthedocs.io.
Nous publions Scalpel Source Code dans l'espoir de profiter aux autres. On vous demande de reconnaître l'utilisation de l'outil en citant l'article suivant:
@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}
}
Scalpel est invité à être présenté à Europython 2022. Europython est la conférence de programmation Python la plus ancienne et la plus longue du volontaire sur la planète!

Ce projet a été inspiré par de nombreux travaux existants. Si vous pensez que votre travail apparaît dans ce projet mais n'a pas encore été mentionné, veuillez nous le faire savoir par tous les moyens.
Fonction 1: réécriture de code. Le module de réécriture de code est conçu comme une fonction fondamentale pour prendre en charge les changements systématiques dans les programmes Python existants. Deux usages préliminaires de cette fonction sont (1) simplifier les programmes pour une meilleure analyse statique et (2) optimiser ou réparer les programmes problématiques. Pour soutenir la première utilisation, nous intégrons dans le cadre de la base de données comprenant un ensemble de règles indiquant comment les extraits de code correspondants doivent être transformés. Cette base de données doit être continuellement étendue pour répondre aux exigences de simplification compliquées pour réaliser une analyse statique efficace des programmes Python. Pour soutenir la deuxième utilisation, inspirée par le mécanisme d'optimisation fourni par Soot (l'un des cadres d'analyse de programme Java les plus célèbres), nous avons également mis en place un processus de transformation avec des méthodes de rappel dédiées à réécrire par les utilisateurs pour optimiser le code Python en fonction de leurs besoins personnalisés.
Fonction 2: Construction de graphiques de flux de contrôle. Le module de construction du graphique de flux de contrôle (CFG) génère des CFG intra-procéduraux, qui sont un composant essentiel de l'analyse du flux statique avec des applications telles que l'optimisation du programme et l'analyse de souillure. Un CFG représente tous les chemins qui pourraient être traversés par un programme pendant son exécution. Les CFG d'un projet Python peuvent être combinés avec le graphique d'appel pour générer un CFG inter-procédural du projet.
Fonction 3: Représentation statique unique d'attribution (SSA). Le module d'attribution unique statique fournit des représentations intermédiaires au niveau du compilateur (IR) pour l'analyse du code. Il peut non seulement être utilisé pour l'exécution symbolique mais aussi pour une propagation constante. En renommant chaque affectation de variable avec différents noms, nous pouvons obtenir des chaînes d'utilisation explicites, en suivant donc précisément la façon dont les données se déroulent dans le programme.
Fonction 4: Analyse d'alias. Étant donné que les variables peuvent pointer vers le même emplacement de mémoire ou les valeurs identiques, la fonction d'analyse d'alias est conçue pour modéliser ces usages. Cette fonction peut être vitale pour paraître une propagation constante. De plus, l'analyse ALIAS bénéficiera également à la vérification du type ainsi qu'à la qualification du nom d'API.
Fonction 5: Propagation constante. Le module de propagation constant évaluera les valeurs réelles des variables à certains points de programme dans différents chemins d'exécution avant l'exécution. Avec les valeurs réelles connues au préalable, nous pouvons optimiser le code et détecter les bogues. La propagation constante utilisera la représentation du module SSA pour continuer à enregistrer les valeurs de chaque affectation pour une seule variable.
Fonction 6: Importer la construction du graphique. Dans Python, les flux d'importation et les relations ont été soulignés comme étant importants pour la cartographie des API et l'analyse de dépendance. Notre construction de graphiques d'importation vise à fournir une structure de données pour représenter ces relations d'importation à travers les fichiers de module Python dans le même projet. Les graphiques d'importation de plusieurs projets Python peuvent être combinés pour effectuer une analyse du flux de données inter-bibliothèque.
FONCTION 7: Nom entièrement qualifié Inferrer. Les API ou les noms de fonction Python peuvent être invoqués de différentes manières selon la façon dont ils sont importés. Cependant, cela se traduit par des inconvénients à l'analyse de l'utilisation de l'API. Dans ce module, nous convertirons tous les noms d'appels de fonction en leurs noms entièrement qualifiés qui sont des chaînes pointillées qui peuvent représenter le chemin du module de niveau supérieur à l'objet lui-même. Diverses tâches peuvent bénéficier de cette fonctionnalité telles que la compréhension de l'utilisation de l'API obsolète, l'analyse de dépendance ainsi que la construction de graphiques d'appels sonores.
Fonction 8: Construction du graphique d'appel. Un graphique d'appel représente l'appel des relations entre les méthodes dans un logiciel. Il s'agit d'une composante fondamentale de l'analyse du débit statique et peut être exploitée dans des tâches telles que le profilage, la propagation de la vulnérabilité et le refactorisation. Ce module aborde les défis présentés par des fonctionnalités compliquées adoptées dans Python, telles que les fonctions d'ordre supérieur et les définitions de fonctions imbriquées, pour construire des graphiques d'appels précis pour des projets Python donnés.
Fonction 9: Tapez l'inférence. Python, en tant que langage dynamiquement typé, est confronté au problème d'être difficile à utiliser la pleine puissance de l'analyse statique traditionnelle. Ce module déduit les informations de type de toutes les variables, y compris les valeurs de retour de fonction et les paramètres de fonction dans un programme Python, ce qui rend possible une analyse statique plus sophistiquée pour Python. Nous utilisons une analyse de flux de données vers l'arrière et un ensemble de règles heuristiques pour atteindre une haute précision.