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 生成的代码看起来对,但它真的"理解"这些代码在做什么吗?
理解代码需要多个层次的能力:
- 语法理解:知道 AST(抽象语法树)长什么样
- 静态行为理解:能看懂控制流图(CFG)、数据依赖
- 动态行为理解:能推理代码运行时的状态变化
我们怎么测的
三个维度、多种任务
| 维度 | 考察什么 | 示例任务 |
|---|---|---|
| 语法 | 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。
这意味着什么
- 不能盲目信任 LLM 生成的代码:语法正确 ≠ 逻辑正确
- 需要验证机制:结合静态分析或测试来验证 LLM 输出的语义正确性
- 研究方向:如何增强 LLM 的语义理解能力是一个重要的开放问题
个人感言
这是我的第一篇投稿,从 2023 年 11 月投出到 2026 年 5 月 16 日正式被 TOSEM 接收,经历了漫长的审稿周期。这段经历教会我的不只是"怎么做研究",更是"怎么面对拒稿和修改"——第一次被拒的时候确实很沮丧,但回头看,每一轮审稿意见都让论文变得更好了。
这篇论文是我和 Wei Ma 共同一作的工作。如果你对 LLM 的代码理解能力感兴趣,欢迎阅读论文原文和讨论。