手術刀是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成為更複雜的靜態分析。我們利用向後的數據流分析和一組啟發式規則來實現高精度。