关于静态分析 + LLM

发布: (2026年3月23日 GMT+8 17:23)
6 分钟阅读
原文: Dev.to

Source: Dev.to

nwyin

静态分析

静态分析是在运行代码之前理解代码。

def add(a, b):
    return a + b

def main():
    return add(1, 3)

以上是一个简单的程序。
一眼就可以看出,调用 main() 将返回 4

值得思考的问题

  • 如果你用非数值类型调用 add 会发生什么?例如 add("foo", "bar") 会返回什么?
  • 你是如何了解上述情况的?

静态分析旨在在不运行代码的情况下回答这些问题。

作为人类程序员,我们对语言和运行时形成熟悉感,这使我们能够轻松回答此类问题。
但是机器是如何得出答案的呢?

程序表示

程序有多种表示方式(人类友好的语法只是其中之一)。下面展示了同一个 Python 程序的几种替代表示。

AST

Module(
  body=[
    FunctionDef(
      name='add',
      args=arguments(
        args=[
          arg(arg='a'),
          arg(arg='b')]),
      body=[
        Return(
          value=BinOp(
            left=Name(id='a'),
            op=Add(),
            right=Name(id='b')))]),
    FunctionDef(
      name='main',
      args=arguments(),
      body=[
        Return(
          value=Call(
            func=Name(id='add'),
            args=[
              Constant(value=1),
              Constant(value=3)]))])])

Bytecode

Disassembly of :
  1  RESUME              0
  2  LOAD_FAST           0 (a)
  3  LOAD_FAST           1 (b)
  4  BINARY_OP           0 (+)
  5  RETURN_VALUE

Disassembly of :
  1  RESUME              0
  2  LOAD_GLOBAL         1 (add)
  3  LOAD_SMALL_INT      1
  4  LOAD_SMALL_INT      3
  5  CALL                2
  6  RETURN_VALUE

这些表示更“接近机器”。它们包含了编译器或 CPU 在执行程序时需要的细节。大多数人类程序员从不关心这些底层细节,但在某些情况下它们非常有用。

调用图

example.py
  [D] add
  [D] main
main
  [U] add

[D] 表示 “在此定义”,[U] 表示 “使用”。
你可以把上面的内容读作:“addmainexample.py 中定义,main 使用了 add”。

调用图对于理解程序中的依赖链和数据流非常有帮助。在拥有数十万行代码、数千个函数和众多文件的大型系统中,调用图可以帮助回答以下问题:

  • 某段数据会经过哪些函数和文件?
  • 如果需要重构或重新思考数据流,我必须修改哪些文件和函数?

静态分析是工程师在处理无法直接从头重写的复杂系统时的强大工具。许多系统是建立在不稳固的基础之上,而了解这些基础是至关重要的。

Source:

2026 年的静态分析与大语言模型

我们现在已经拥有大语言模型(LLMs)。
我们能否直接使用 LLM 来进行重构和改写?

有人认为,使用 LLM 进行“严肃”的工程工作不可行,因为:

  • 它们的上下文窗口太小。
  • 它们往往会产生“低质量”输出。

我并不同意。我相信存在一种 能力超额:朴素的提示和糟糕的上下文管理会大幅削弱模型的能力,就像让一位有能力的工程师只看一秒代码就要解决问题一样。

Claude Code、Codex 和 Opencode 等工具为模型提供了动手和测试迭代的环境,但它们仍受限于我们授予的权限以及我们在提示中编码的模式。归根结底,模型 + 工具的效果受限于工程师自身的能力。

伟大的工程师不是巫师。
他们是使用优秀工具的优秀工程师。

有许多分析可以在不运行或剖析代码的情况下完成:调用图分析、控制流分析等。让模型能够访问这些工具——这些正是高级工程师已经在使用的工具——为大规模重构提供了“低垂的果实”。

根据我的经验,赋予模型通过静态分析来分析代码库的能力,使它们能够更有能力地规划和执行更大的重构。它们可以在与高级工程师相当的层次上推理代码库。

我目前正在为 Python 构建更好的静态分析工具。由于 Python 是动态语言(且许多用户并非程序员),其工具链不如 C/LLVM 那样成熟,但 LLM 正在为此注入强劲动力。我已经看到 LLM 仅通过查看调用图和控制流图,就能重构并改进一个 10 k 行代码的 Python 项目。

在我看来,前沿模型在配备了合适的静态分析数据后,可能已经具备与高级工程师相当的能力。

As a senior or staff‑level engineer, given the right prompt, tools, and enough time to reason, getting this right will “just” be a matter of building tools, formats, and representations that are highly amenable to LLM reasoning.
0 浏览
Back to Blog

相关文章

阅读更多 »