← 最新论文
💻 computer science

NESA: Relational Neuro-Symbolic Static Program Analysis

本文提出了名为 NESA 的复合神经符号静态程序分析方法,该方法利用大语言模型结合受限 Datalog 策略语言,通过问题分解和增量提示技术实现了无需编译且可定制的代码分析,在显著抑制幻觉的同时,在程序切片和漏洞检测等任务上取得了媲美甚至超越现有技术的性能。

原作者: Chengpeng Wang, Yifei Gao, Wuqi Zhang, Xuwei Liu, Jinyao Guo, Mingwei Zheng, Qingkai Shi, Xiangyu Zhang

发布于 2026-04-15
📖 1 分钟阅读☕ 轻松阅读

原作者: Chengpeng Wang, Yifei Gao, Wuqi Zhang, Xuwei Liu, Jinyao Guo, Mingwei Zheng, Qingkai Shi, Xiangyu Zhang

原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明

这篇论文介绍了一个名为 NESA 的新工具,它旨在解决软件开发中一个长期存在的难题:如何在不重新编译代码的情况下,快速、灵活地找出程序里的错误(Bug)或分析代码逻辑。

为了让你更容易理解,我们可以把传统的静态代码分析比作**“老式工厂的质检员”,而 NESA 则像是一位“拥有超级大脑的灵活侦探”**。

1. 传统方法的困境:死板的“工厂质检员”

想象一下,传统的代码分析工具(如 FlowDroid)就像是一个在工厂流水线上工作的质检员。

  • 必须“煮熟”才能检查:这个质检员只检查已经“煮熟”(编译完成)的半成品。如果代码还没写完,或者还在开发者的电脑上没编译,他就完全没法工作。
  • 只会做特定的事:他只会检查“有没有螺丝没拧紧”(比如特定的内存泄漏)。如果你想让他检查“有没有油漆没刷匀”(比如某种特定的逻辑漏洞),你就得重新培训他,甚至给他换一套全新的工装(修改底层编译器代码)。这对普通开发者来说太难了,门槛极高。

结果:很多开发者觉得这些工具太麻烦、太死板,干脆不用了。

2. NESA 的解决方案:灵活的“超级侦探”

NESA 引入了大语言模型(LLM,也就是像我们对话的 AI),但它不是让 AI 直接去“猜”答案,因为 AI 有时候会“胡编乱造”(幻觉)。NESA 设计了一套聪明的**“侦探办案流程”**:

核心策略:化整为零,分工合作

NESA 把复杂的代码分析任务拆解成两个部分,就像侦探办案时把任务分给“法医”和“逻辑推理专家”:

  1. 语法部分(交给“法医”/解析器)

    • 任务:检查代码的“骨架”。比如:这行代码在第几行?这个变量叫什么名字?这个函数调用了哪个参数?
    • 特点:这部分是绝对客观的,就像法医验尸,数据是确定的,AI 不会在这里“胡编乱造”。NESA 用传统的代码解析器(Parser)来快速完成这部分,零幻觉。
  2. 语义部分(交给“逻辑推理专家”/AI)

    • 任务:理解代码的“灵魂”。比如:这个变量的值会不会被污染?这个循环会不会导致内存泄漏?
    • 特点:这部分很难用死板的规则写出来,但 AI 很擅长理解。
    • 关键创新:NESA 不会让 AI 直接去猜整个程序的逻辑(那样容易出错)。它会把大问题拆成小问题。
      • 比喻:与其问 AI“这个程序哪里错了?”,不如先问“变量 A 在第 5 行被定义了吗?”(这是语法,解析器回答),再问“如果变量 A 是脏的,它会传给变量 B 吗?”(这是语义,AI 回答)。
      • 因为问题变小了,AI 的“胡编乱造”概率就大大降低了。

3. NESA 的两大“独门秘籍”

为了让这个“侦探”既聪明又省钱,NESA 还有两个绝招:

  • 秘籍一:懒洋洋的提问(Lazy Prompting)

    • 比喻:就像你问侦探“谁偷了钱包?”。如果你直接问,侦探可能瞎猜。但如果你先告诉他“嫌疑人只可能是 A、B、C 三个人”,侦探的猜测范围就缩小了,准确率就高了。
    • 做法:NESA 会先让解析器把所有确定的信息(比如变量名、行号)都整理好,只把确定的信息喂给 AI 去推理。这样 AI 只需要在有限的范围内思考,大大减少了“幻觉”。
  • 秘籍二:记性好的提问(Incremental Prompting)

    • 比喻:侦探在查案时,如果已经查过"A 和 B 有关系”,下次再查时,他绝不会重新问一遍"A 和 B 有没有关系”,而是直接翻出之前的记录。
    • 做法:NESA 会记住 AI 已经回答过的问题,避免重复提问。这不仅省时间,还省了调用 AI 的金钱成本。

4. 实际效果:真的好用吗?

论文通过大量实验证明了 NESA 的强大:

  • 不用编译也能查:代码还没写完,或者在开发环境中,NESA 就能开始工作。
  • 自定义极其简单:以前想查一种新 Bug,需要改代码、改编译器。现在,开发者只需要用自然语言告诉 NESA 什么是“脏数据”,举几个例子,NESA 就能学会查这种新 Bug。
  • 成绩优异
    • 在查找“程序切片”(找出影响某行代码的所有相关代码)任务中,NESA 比现有的最先进工具还要准。
    • 在查找“污点漏洞”(比如黑客注入攻击)时,NESA 的准确率比工业界工具高了 20%。
    • 实战成果:NESA 在真实的开源项目(如 Uber 的 h3 库)中,发现了 13 个真实的内存泄漏 Bug,并且这些 Bug 已经被开发者修复了!

总结

NESA 就像是一个给代码分析工具装上了“超级大脑”和“灵活手脚”的升级包。

它不再要求代码必须“完美编译”才能检查,也不再要求开发者必须是编译器专家才能定制检查规则。它通过**“解析器负责事实,AI 负责推理,且把大问题拆成小问题”**的策略,既利用了 AI 的理解能力,又避免了 AI 的胡编乱造。

对于开发者来说,这意味着以后找 Bug 可以像“聊天”一样简单,而且能在代码开发的早期阶段就发现问题,让软件更安全、开发更顺畅。

您所在领域的论文太多了?

获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。

试用 Digest →