PYCG는 정적 분석을 사용하여 Python 코드 용 통화 그래프를 생성합니다. 효율적으로 지원합니다
ICSE 2021 논문에 대한 전체 평가뿐만 아니라 전체 방법론을 읽을 수 있습니다.
PYCG를 다음과 같이 인용 할 수 있습니다. Vitalis Salis, Thodoris Sotiropoulos, Panos Louridas, Diomidis spinellis 및 Dimitris Mitropoulos. PYCG : Python의 실제 통화 그래프 생성. 2021 년 5 월 25 ~ 28 일 ICSE '21, ICSE '21, 소프트웨어 엔지니어링에 관한 43 번째 국제 회의 에서.
PYCG 는 보관되었습니다. 가용성이 제한되어 있기 때문에 더 이상의 개발 개선이 계획되지 않습니다. 발전을 계속하기 위해 포크를 만들고자하는 사람을 도와 드리겠습니다.
PYCG는 Python3에서 구현되며 Python 버전 3.4 이상이 필요합니다. 또한 종속성이 없습니다. 간단히:
pip install pycg
~ >>> pycg -h
usage: __main__.py [-h] [--package PACKAGE] [--fasten] [--product PRODUCT]
[--forge FORGE] [--version VERSION] [--timestamp TIMESTAMP]
[--max-iter MAX_ITER] [--operation {call-graph,key-error}]
[--as-graph-output AS_GRAPH_OUTPUT] [-o OUTPUT]
[entry_point ...]
positional arguments:
entry_point Entry points to be processed
optional arguments:
-h, --help show this help message and exit
--package PACKAGE Package containing the code to be analyzed
--fasten Produce call graph using the FASTEN format
--product PRODUCT Package name
--forge FORGE Source the product was downloaded from
--version VERSION Version of the product
--timestamp TIMESTAMP
Timestamp of the package's version
--max-iter MAX_ITER Maximum number of iterations through source code. If not specified a fix-point iteration will be performed.
--operation {call-graph,key-error}
Operation to perform. Choose call-graph for call graph generation (default) or key-error for key error detection on dictionaries.
--as-graph-output AS_GRAPH_OUTPUT
Output for the assignment graph
-o OUTPUT, --output OUTPUT
Output path
다음 명령 줄 인수는 --fasten 입증 할 때만 사용해야합니다.
--product : 패키지의 이름.--forge : 소스 패키지가 다운로드 된 것입니다.--version : 패키지의 버전.--timestamp : 패키지 버전의 타임 스탬프. 통화 가장자리는 핵심 src 에 할당 된 목록에서 Edge (src, dst) dst 의 항목으로 표시되는 인접성 목록의 형태입니다.
{
"node1": ["node2", "node3"],
"node2": ["node3"],
"node3": []
}
고정 형식에 대한 최신 설명은 고정 위키키를 참조하십시오.
우리는 현재 Python 사전에서 잠재적 인 유효하지 않은 사전 액세스를 식별하는 데 실험하고 있습니다 (주요 오류). 주요 오류의 출력 형식은 다음을 포함하는 사전 목록입니다.
[{
"filename": "mod.py",
"lineno": 2,
"namespace": "mod.<dict1>",
"key": "key2"
},
{
"filename": "mod.py",
"lineno": 8,
"namespace": "mod.<dict1>",
"key": "nokey"
}]
모든 진입 지점이 알려져 있으며 간단한 JSON 형식을 원합니다.
~ >>> pycg --package pkg_root pkg_root/module1.py pkg_root/subpackage/module2.py -o cg.json
모든 진입 지점은 알려지지 않았으며 간단한 JSON 형식을 원합니다.
~ >>> pycg --package django $(find django -type f -name "*.py") -o django.json
우리는 고정 형식을 원합니다 :
~ >>> pycg --package pypi_pkg --fasten --product "pypipkg" --forge "PyPI"
--version "0.1" --timestamp 42
pypi_pkg/module1.py pkg_root/subpackage/module2.py -o cg.json
루트 디렉토리에서 먼저 모의 패키지를 설치하십시오.
pip3 install mock
τ- 단순히 실행하여 테스트를 실행합니다.
make test