手术刀是Python静态分析框架。它提供了基本的程序分析功能,以促进针对静态解决专用问题的客户应用程序的实施。
使用PIP安装手术刀和以下命令
pip install python-scalpel如果您可以为该项目做出贡献,我们将非常感谢它。请通过提交发行报告或直接添加拉请请求来随意这样做。我们希望获得帮助:
详细的用户指南可以在Python-Scalpel.ReadThedocs.io上找到。
我们旨在将手术刀作为一种通用的Python静态分析框架,其中包含尽可能多的功能(例如,可以轻松构建功能间的控制流图,以解释不同的Python模块等的导入关系等),以促进开发人员实施其专用问题的专注于专注于问题的静态分析者。下图描述了当前设计的架构。

手术刀的API文档可在python-scalpel.readthedocs.io上找到。
我们发布了手术刀源代码,以期使他人受益。请您通过引用以下文章来确认该工具的用法:
@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}
}
邀请手术刀在2022年的Europython上介绍。欧洲郡是地球上最古老,最长的志愿者领导的Python节目会议!

该项目受到许多现有作品的启发。如果您认为您的工作出现在此项目中,但尚未提及,请以任何方式告诉我们。
功能1:代码重写器。代码重写器模块被设计为用于支持现有Python程序系统更改的基本功能。此功能的两个初步用法是(1)简化程序以进行更好的静态分析以及(2)优化或修复有问题的程序。为了支持第一个用法,我们将数据库集成到框架中,包括一组规则,指示应如何转换匹配的代码段。该数据库应不断扩展,以满足对Python程序有效静态分析的复杂简化要求。为了支持第二次用法,灵感来自烟灰(最著名的静态Java程序分析框架之一)提供的优化机制,我们还设置了一个转换过程,并使用用户重写专用回调方法来根据其自定义需求来优化Python代码。
功能2:控制流图构造。控制流图(CFG)构造模块生成杂质内CFG,这是静态流量分析中的重要组成部分,以及应用程序优化和污点分析等应用。 CFG表示在执行过程中可能会通过程序穿越的所有路径。 Python项目的CFG可以与呼叫图相结合,以生成项目间的CFG。
功能3:静态单分配(SSA)表示。静态单分配模块提供编译器级中间表示(IR)进行代码分析。它不仅可以用于符号执行,还可用于恒定传播。通过将每个变量分配重命名使用不同的名称,我们可以获得显式使用DEF链,因此可以精确跟踪程序中的数据流。
功能4:别名分析。由于变量可以指向相同的内存位置或相同的值,因此别名分析功能旨在建模此类用法。此功能对于听起来恒定传播至关重要。此外,别名分析还将受益类型检查以及API名称合格。
功能5:恒定传播。恒定传播模块将在运行时在不同执行路径中的某些程序点上评估变量的实际值。有了事先已知的实际值,我们可以优化代码并检测错误。恒定传播将利用SSA模块的表示形式,以使每个变量的每个分配中记录值。
功能6:导入图构造。在Python中,已经指出导入流和关系对于API映射和依赖性分析很重要。我们的导入图构造旨在提供数据结构,以表示同一项目中Python模块文件中的这些导入关系。可以将多个Python项目的导入图组合在一起以执行图周间数据流分析。
功能7:完全合格的名称属。 Python API或函数名称可以根据其导入方式来调用。但是,这会给API使用分析带来不便。在此模块中,我们将将所有函数调用名称转换为其完全符合条件的名称,这些名称是虚线的字符串,可以将从顶级模块向对象本身的路径表示为路径。从这些功能中可以从各种任务中受益,例如了解弃用的API使用情况,依赖性解析以及构建声音呼叫图。
功能8:呼叫图构造。呼叫图描述了软件程序中方法之间的呼叫关系。它是静态流量分析中的基本组成部分,可以在诸如分析,脆弱性传播和重构等任务中利用。该模块解决了Python中采用的复杂功能带来的挑战,例如高阶功能和嵌套功能定义,以构建给定Python项目的精确呼叫图。
功能9:类型推理。 Python作为一种动态打字的语言,面临着难以利用传统静态分析的全部力量的问题。该模块在Python程序中渗透了所有变量的类型信息,包括函数返回值和功能参数,从而使Python成为更复杂的静态分析。我们利用向后的数据流分析和一组启发式规则来实现高精度。