ๅบไบ pi ๅคๆบ่ฝไฝๆกๆถ็ C/C++ ๆฐๆฎๆตๆฑก็นๅๆ็ณป็ปใ
ไปไธไธชๅทฒ็ฅๅ
ฅๅฃๅฝๆฐๅบๅ๏ผ้ๅฝ่ฟฝ่ธชๅค้จ่พๅ
ฅๅจๅฝๆฐ่ฐ็จ้พไธญ็ไผ ๆญ่ทฏๅพ๏ผ่พๅบๅๅนถๅ็ๅฎๆดๆฐๆฎๆตๅๆๆฅๅใ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ cli.py โ ็จๆท prompt๏ผ"ๅๆ foo.c ็ Bar ๅฝๆฐ"๏ผ โ
โโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Orchestrator (app/orchestrator.py) โ
โ โ
โ execute_recursive(depth=0) โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Round 1..N (max_rounds=-1 โ โ) โ โ
โ โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โ โ
โ โ โ Workers ร W โ โ Judges ร J โ โ โ
โ โ โ (ๅนถ่ก) โโโโถโ (ๅนถ่ก) โ โ โ
โ โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโฌโโโโโโโโโ โ โ
โ โ โ pass? โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ ่งฃๆ callee ๅ่กจ โ ๅนถ่ก้ๅฝ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โ callee_1 โ execute_recursiveโ โ โ
โ โ callee_2 โ execute_recursiveโโโ (asyncio.gather) โ
โ โ callee_3 โ execute_recursiveโ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โผ โ
โ Merge Agent (ๅๅนถๆๆ dataflow-*.md) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
| ๆไปถ | ่่ดฃ |
|---|---|
cli.py |
CLI ๅ ฅๅฃ๏ผ่งฃๆ prompt๏ผ้ฉฑๅจ Orchestrator๏ผๆ ็ถ่ฟๅบฆ่พๅบ |
app/orchestrator.py |
็ผๆ Worker+Judge ๆตๆฐด็บฟ๏ผ้ๅฝ่ฐ็จ้พ่ฟฝ่ธช๏ผๅนถ่ก callee ๅๆ |
app/runner.py |
่ฐ็จ pi ่ฟ็จๆง่กๅไธช Agent๏ผๅค็้่ฏ/้่ฏฏๆฃๆต/ๆตๅผ่พๅบ |
app/config.py |
่งฃๆ config.json๏ผๆๅปบ TaskConfig |
app/models.py |
Pydantic ๆฐๆฎๆจกๅ๏ผTaskConfig, ServiceConfig, SwarmEvent ็ญ๏ผ |
prompts/workers/ |
Worker Agent ็ณป็ปๆ็คบ่ฏ |
prompts/judges/ |
Judge Agent ็ณป็ปๆ็คบ่ฏ |
prompts/merge/ |
Merge Agent ็ณป็ปๆ็คบ่ฏ |
tools/extract_func.py |
ๅฝๆฐๆๅๅทฅๅ
ท๏ผextract_func ๅฝไปค๏ผ |
Worker โโโ ่ฏปๅๆบ็ โ ่ฟฝ่ธชๆฑก็น่ทฏๅพ โ ่พๅบ dataflow-*.md
โ
็จ extract_func ็ฒพ็กฎๆๅๅฝๆฐไปฃ็ ๏ผ่้่ฏปๆดไธชๆไปถ๏ผ
Judge โโโโ ่ฏป Worker ่พๅบ โ ๆๅ (0-100) โ pass/fail
โ
้่ฟ/ๅคฑ่ดฅ้ๅผ: pass_threshold๏ผ้ป่ฎค๏ผceil(judges/2)๏ผ
Round ้่ฟ โ ้ๅฝๅๆ callees
Round ๅคฑ่ดฅ โ ็ๆ feedback โ ไธไธ่ฝฎๆณจๅ
ฅ Worker
HandleCommissioningSet (depth=0)
โโโ ็ฌฌไธๆญฅ๏ผWorker ๅๆ๏ผJudge ้่ฟ
โโโ ่งฃๆ callee ่กจๆ ผ
โ ๆพๅฐ๏ผSetCommissioningData, SendCommissioningSetResponse
โ
โโโ grep ้ขๆฃ๏ผ_function_has_definition๏ผ
โ ่ฟๆปค๏ผmemcpy/malloc ็ญๆ ๅๅบๅฝๆฐ๏ผ_STDLIB_SKIP ้ปๅๅ๏ผ
โ ่ฟๆปค๏ผextern ็บฏๅฃฐๆ
โ
โโโ asyncio.gather ๅนถ่กๅฏๅจ๏ผๅ callee_concurrency ้ๅถ๏ผ
โโโ SetCommissioningData (depth=1) โโ
โโโ SendCommissioningSetResponse โโค ๅๆถ่ฟ่ก
โ
Merge Agent ๅๅนถ
| ๅฑๆฌก | ๅฎ็ฐ | ่ฏดๆ |
|---|---|---|
| ๅค Worker | run_agents_parallel |
ๅ่ฝฎๅค Worker ๅนถๅๅๆๅไธๅฝๆฐ |
| ๅค Judge | asyncio.gather |
ๅค Judge ๅๆถ่ฏๅฎก๏ผๆฏไธช Judge ็ฌ็ซไธไธๆ |
| Judge ๅ ๅค Worker ่ฏๅค | asyncio.gather |
ๅ Judge ๅนถๅ่ฏๅคๅ Worker ่พๅบ |
| callee ้ๅฝ | asyncio.gather + Semaphore |
ๅ
ๅผ callee ๅนถๅๅๆ๏ผcallee_concurrency ้้ |
{
"max_rounds": -1, // ๆฏๅฝๆฐๆๅคง่ฝฎๆฐ๏ผ-1=ๆ ้
"min_rounds": 1, // ๆๅฐ่ฝฎๆฐ๏ผๅณไฝฟ็ฌฌ1่ฝฎ้่ฟไน็ปง็ปญ๏ผ
"pass_threshold": 1, // Judge ้่ฟ็ฅจๆฐ้ๅผ๏ผ้ป่ฎค ceil(J/2)๏ผ
"max_trace_depth": 5, // ๅฝๆฐ่ฐ็จ้ๅฝๆๅคงๆทฑๅบฆ
"callee_concurrency": -1, // callee ๅนถ่กๆฐ๏ผ-1=ไธ้๏ผ1=ไธฒ่ก๏ผN=ๆๅคNไธช
"agent_max_retries": 50, // API ้่ฏฏ้่ฏๆฌกๆฐ
"agent_retry_delay": 15, // ้่ฏๅๅง็ญๅพ
็ง๏ผๆๆฐ้้ฟ๏ผ
"pi_max_retries": -1, // pi ่ฟ็จๆ่ตทๅคฑ่ดฅ้่ฏๆฌกๆฐ๏ผ-1=ๆ ้
"pi_retry_delay": 5, // pi ่ฟ็จ้่ฏ็ญๅพ
็ง
"workers": {
"default_tools": ["read", "bash", "edit", "write", "find"],
"system_prompt_dir": "/opt/data_flow_analyse/prompts/workers",
"default_thinking_level": "off",
"agents": [
{ "model": "icsl_vllm_2/MiniMax/MiniMax-M2.5" }
]
},
"judges": {
"default_tools": ["read", "bash", "find"],
"system_prompt_dir": "/opt/data_flow_analyse/prompts/judges",
"default_thinking_level": "off",
"agents": [
{ "model": "icsl_vllm_2/MiniMax/MiniMax-M2.5" }
]
},
"output_dir": "/data/output",
"archive_dir": "/data/output",
"result_dir": "/data/output"
}ๆพๅจ /data/config/models.json๏ผๅฎนๅจๅฏๅจๆถ่ชๅจ้พๆฅๅฐ pi ้
็ฝฎ็ฎๅฝใ
็คบไพ๏ผๅ ็ฝ vllm ๆจกๅ๏ผ๏ผ
{
"models": [
{
"name": "icsl_vllm_2/MiniMax/MiniMax-M2.5",
"provider": "openai-completions",
"baseUrl": "http://172.31.23.100:8002/v1",
"model": "MiniMax/MiniMax-M2.5"
}
]
}docker build --network host -t data_flow_analyse .ๅบ็ก้ๅ dfa-base:layer5 ๅทฒ้ข่ฃ
๏ผ
- Node.js + pi agent
- Python 3
- ripgrep๏ผ
rg๏ผ้ฟๅ pi grep ๅทฅๅ ท่ฟ่กๆถไธ่ฝฝ๏ผ
้ๅ้ขๅคๅฎ่ฃ ๏ผ
extract_funcๅฝไปค๏ผ/usr/local/bin/extract_func๏ผ
docker run --rm --network host \
-v /path/to/firmware:/data/target:ro \
-v /path/to/config:/data/config:ro \
-v /path/to/output:/data/output \
data_flow_analyse \
python3 cli.py "ๅฏน src-vul/openthread/.../foo.cpp ็ Bar::Process ๅฝๆฐๅฎๆๆฐๆฎๆตๅๆ"| ๅฎนๅจ่ทฏๅพ | ่ฏดๆ |
|---|---|
/data/target |
ๅช่ฏป๏ผๅพ ๅๆๆบ็ ็ฎๅฝ |
/data/config |
ๅช่ฏป๏ผconfig.json + models.json |
/data/output |
่ฏปๅ๏ผๅๆ็ปๆ + ๆฅๅฟๅ็ผฉๅ |
/data/output/
โโโ flag # 0=ๆชๅฎๆ/ๅคฑ่ดฅ, 1=PASSED
โโโ <src>_<Func>.md # ๅๅนถๅ็ๅฎๆดๆฐๆฎๆตๅๆๆฅๅ
โโโ <src>_<Func>_log.zip # ๆๆ่ฝฎๆฌก็ Worker/Judge ไบคไบ่ฎฐๅฝ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โถ Leader::HandleCommissioningSet
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[Leader::HandleCommissioningSet] R1:
[Leader::HandleCommissioningSet] W ........ W[โ] (245s)
[Leader::HandleCommissioningSet] J .... J[82] โ
โ โ
1/1 (420s)
โ 2 callees: SetCommissioningData, SendCommissioningSetResponse
โโ [d1] SetCommissioningData โโโ ๅนถ่กๅฏๅจ
โโ [d1] SendCommissioningSetResponse โโโ ๅนถ่กๅฏๅจ
[SetCommissioningData] R1:
[SetCommissioningData] W ... W[โ] (180s) โโโ ไบค้่พๅบ
[SendCommissioningSetResponse] R1:
[SendCommissioningSetResponse] W .... W[โ] (200s)
...
๐ Merging 3 documents... โ
(12.4KB)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
PASSED โ 3 functions โ 820s
๐ /data/output/network_data_leader_ftd_Leader__HandleCommissioningSet.md
๐ฆ /data/output/network_data_leader_ftd_Leader__HandleCommissioningSet_log.zip
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
ๅ ็ฝฎไบๅฎนๅจ็ๅฝๆฐๆๅๅทฅๅ ท๏ผWorker Agent ๅฏ้่ฟ bash ่ฐ็จ๏ผ้ฟๅ ่ฏปๅๆดไธชๅคงๆไปถใ
# ๆๅๆๅฎๅฝๆฐ
extract_func src-vul/openthread/src/core/thread/network_data_leader_ftd.cpp \
Leader::HandleCommissioningSet
# ๅธฆไธไธๆ๏ผๅ5่ก๏ผ
extract_func file.cpp process_packet --context 5
# ๅๅบๆไปถไธญๆๆๅฝๆฐ
extract_func file.cpp --list่พๅบ็คบไพ๏ผ
// src-vul/.../network_data_leader_ftd.cpp L228-L282 (55 lines)
otError Leader::HandleCommissioningSet(
const Coap::Header &aHeader, Message &aMessage,
const Ip6::MessageInfo &aMessageInfo)
{
// ... ๅฝๆฐๅฎๆดไปฃ็ ...
}| ้่ฏฏ็ฑปๅ | ่กไธบ |
|---|---|
| API ้ๆต / ็ฝ็ป่ถ ๆถ | ๆๆฐ้้ฟ้่ฏ๏ผๆๅค agent_max_retries ๆฌก |
| pi ่ฟ็จๅฏๅจๅคฑ่ดฅ | ้่ฏๆๅค pi_max_retries ๆฌก๏ผ-1=ๆ ้๏ผ |
| ๆจกๅๆชๆพๅฐ / 401 | ่ดๅฝ้่ฏฏ๏ผ็ซๅณ็ปๆญข๏ผไธ้่ฏ |
| Node.js ๆจกๅ็ผบๅคฑ | ่ดๅฝ้่ฏฏ๏ผ็ซๅณ็ปๆญข |
| callee ๆ ๅฎไน | grep ้ขๆฃ่ทณ่ฟ๏ผไธๅฏๅจ Worker+Judge ๆตๆฐด็บฟ |
| ๆ ๅๅบๅฝๆฐ | _STDLIB_SKIP ้ปๅๅ่ฟๆปค๏ผmemcpy/malloc ็ญ 40+ ๅฝๆฐ๏ผ |
pip install -r requirements.txt
python3 cli.py --config config.example.json \
--cwd /path/to/src \
"ๅฏน foo.c ็ bar_func ๅฎๆๆฐๆฎๆตๅๆ"ๅจ prompts/workers/ ๆ prompts/judges/ ็ฎๅฝไธญๆพ็ฝฎ .md ๆไปถ๏ผๅจ config ็ system_prompt_dir ๆๅ่ฏฅ็ฎๅฝๅณๅฏใๅคไธช Agent ๅฏ็จๅ่ช็ฎๅฝไธๅฏนๅบๅบๅท็ๆไปถ๏ผ0.md, 1.md๏ผๆๅ
จ้จไฝฟ็จ default.md๏ผใ
- ไธไฝฟ็จ pi grep ๅทฅๅ ท๏ผpi ็ grep ๅทฅๅ ทๅจๆ ๅค็ฝๆๅกๅจไธ่ฟ่กๆถไผๅฐ่ฏไธ่ฝฝ ripgrep๏ผๆน็จ bash grep
- Docker ไธ่ท้ๅฎฟไธปๆบ็ฌฆๅท้พๆฅ๏ผๆ่ฝฝ่ทฏๅพ้กปไฝฟ็จ
readlink -f่งฃๆ็ๅฎ่ทฏๅพ - callee ๅนถ่กๅฎๅ
จ๏ผasyncio ๅ็บฟ็จ๏ผ
analyzedset ๆ ็ซไบ๏ผ้ๅจ gather ๅ้ขๆณจๅ้ฒ้ๅค