跳转至

软件分析

课程归属与导航说明

PASCAL 研究组官网 显示该组隶属南京大学计算机软件研究所和计算机学院,并链接 Software Analysis 教学资源。本页放在 se-core 目录是按“软件质量”主题归档,不足以证明该课属于软件学院必修,也不能据此固定教师、学分或开课学期;这些信息应以所在年级培养方案和教务系统为准。

课程解决什么问题

静态程序分析在不执行所有可能输入的前提下,对程序行为作保守近似,用于推断数据流性质、调用关系、指针指向和潜在安全问题。它通常需要在以下目标之间权衡:

  • 健全性(Soundness):在给定模型和假设下,尽量不漏掉目标行为;
  • 精度(Precision):减少因近似产生的误报;
  • 可扩展性(Scalability):在可接受时间和内存内分析真实程序。

静态分析结果依赖语言模型、分析假设和实现正确性,不能被表述为“证明所有执行路径都不存在空指针、内存泄漏或安全漏洞”。

理论知识地图

  • 中间表示:三地址码、控制流图(CFG)及程序点之间的数据依赖。
  • 数据流分析:Live Variables、Constant Propagation、Reaching Definitions、不动点迭代和工作列表算法。
  • 格与单调框架:偏序、上确界/下确界、传递函数和收敛条件。
  • 过程间分析:调用图、CHA 等调用关系近似,以及过程间数据流传播。
  • 指针分析:Andersen 风格的包含约束、上下文不敏感/敏感分析及精度与成本权衡。
  • 缺陷与安全分析:死代码、别名影响、污点传播等应用。

这些是公开教学资料反映的主题范围,不是某一届固定考试清单。

Tai-e 实践模块

Tai-e 教学与课程主页 是公开课程和实验信息的一手入口。页面当前列有递进作业,但编号、合并方式和提交接口仍应以修课当期通知为准,因此本指南只保留不编号的能力模块:

  • 活跃变量分析(Live Variable Analysis);
  • 常量传播与死代码检测;
  • 调用图构建和过程间常量传播;
  • 上下文不敏感与上下文敏感的指针分析;
  • 利用别名信息改进过程间分析;
  • 污点分析等安全应用。

修课时必须以当年主页分发的框架、任务说明、测试接口和截止时间为准,不要把公开概览中的旧顺序当作现行八次作业。

学习方法

  1. 先写清抽象域和传递函数:明确格元素、合并操作、边界值以及每条 IR 语句如何改变数据流事实。
  2. 用极小程序验证分析:分别覆盖分支、循环、不可达代码、递归、动态分派和别名,检查结果为何变化。
  3. 区分健全性与实现缺陷:出现漏报或误报时,先判断是设计取舍、模型假设还是实现错误。
  4. 只使用指定框架版本:Tai-e 主仓库持续演进,当前源码 API 不一定与某届课程框架一致。

学术诚信警告

Tai-e 作业通常要求独立实现核心分析逻辑。不要查找、复制、改写或传播往届学生实现、评测样例答案和实验报告,也不要让生成式 AI 代写可提交代码。公开论文、教材和框架文档可用于理解算法;协作、代码复用与 AI 工具的允许范围必须以当年书面规则为准。提交者应能解释抽象域、传递函数、复杂度和每一处实现选择。

参考资料