返回博客
2023-11-15· 约 2 分钟
Edit

Exploring Code Analysis: Zero-Shot Insights on Syntax and Semantics with LLMs

我的第一篇投稿:系统评估 LLM 对代码语法和语义的理解能力,发现它们像 AST 解析器一样擅长语法,但在语义理解上漏洞百出。TOSEM 已接收,正式版本题目更新为 Exploring Code Analysis: Zero-Shot Insights on Syntax and Semantics with LLMs。

Exploring Code Analysis: Zero-Shot Insights on Syntax and Semantics with LLMs

📄 已被 TOSEM 接收 | PDF

作者:Wei Ma*, Zhihao Lin*, Shangqing Liu, Qiang Hu, Ye Liu, Wenhan Wang, Cen Zhang, Liming Nie, Li Li, Yang Liu, Lingxiao Jiang

* 共同一作


一句话概括

LLM 能写代码不代表它理解代码。我们从语法、静态行为、动态行为三个维度系统评估 LLM 的代码理解能力,结论既有惊喜也有警醒。


起因:一个朴素的疑问

2023 年,ChatGPT 横空出世,人人都在惊叹它写代码的能力。但我们好奇的是一个更基础的问题:

LLM 生成的代码看起来对,但它真的"理解"这些代码在做什么吗?

理解代码需要多个层次的能力:

  1. 语法理解:知道 AST(抽象语法树)长什么样
  2. 静态行为理解:能看懂控制流图(CFG)、数据依赖
  3. 动态行为理解:能推理代码运行时的状态变化

我们怎么测的

三个维度、多种任务

维度考察什么示例任务
语法AST 结构理解"这段代码的 AST 有几层嵌套?"
静态行为CFG/调用图理解"函数 A 会调用函数 B 吗?"
动态行为运行时推理"执行完这段代码后,变量 x 的值是?"

跨语言、跨模型

  • 语言:C、Java、Python、Solidity
  • 模型:GPT-4、GPT-3.5、StarCoder、CodeLlama-13b

关键发现

惊喜:LLM ≈ AST 解析器

在语法理解方面,LLM 表现得出奇的好——它们几乎能像专业的 AST 解析器一样准确地理解代码结构。这说明 LLM 确实从大量代码中学到了编程语言的语法规则。

警醒:语义理解漏洞百出

但在语义层面,问题就大了:

  • 控制流混乱:在复杂的分支和循环中,LLM 经常搞错执行路径
  • 数据依赖遗漏:跨函数的数据依赖关系容易被忽略
  • 动态行为幻觉:LLM 会"编造"不存在的运行时行为,而且说得头头是道

核心结论

LLM 生成的代码通常在语法上是正确的,但可能在语义上是脆弱的。这解释了为什么 LLM 写的代码"看起来对"但经常有隐藏的 Bug。

这意味着什么

  1. 不能盲目信任 LLM 生成的代码:语法正确 ≠ 逻辑正确
  2. 需要验证机制:结合静态分析或测试来验证 LLM 输出的语义正确性
  3. 研究方向:如何增强 LLM 的语义理解能力是一个重要的开放问题

个人感言

这是我的第一篇投稿,从 2023 年 11 月投出到 2026 年 5 月 16 日正式被 TOSEM 接收,经历了漫长的审稿周期。这段经历教会我的不只是"怎么做研究",更是"怎么面对拒稿和修改"——第一次被拒的时候确实很沮丧,但回头看,每一轮审稿意见都让论文变得更好了。


这篇论文是我和 Wei Ma 共同一作的工作。如果你对 LLM 的代码理解能力感兴趣,欢迎阅读论文原文和讨论。

我的音乐