# NJU 软件分析

## 课程简介

- 所属大学：南京大学
- 先修要求：数据结构与算法，至少熟悉一门编程语言
- 编程语言：Java
- 课程难度：🌟🌟🌟
- 预计学时：60 小时

软件分析是由南京大学李樾老师和谭添老师共同开设的一门课程，主要介绍了程序分析，在这里特指静态分析的理论与实践。
静态分析的理念是在不运行程序的情况下，通过分析其源代码和各种表示来获得关于程序特定性质的**近似**结论。
这门课从程序的抽象语法树，控制流图和中间表示这些基础知识开始介绍，再到数据流分析和指针分析的理论与实践，最后介绍了若干高级主题，如 IFDS 等。

这门课程值得学习的原因在我看来有两部分：

- 授课。程序分析一般来说并不太好上手，但两位老师讲的尤其细致入微，还会在课上带你一步一步走某一个算法的流程。个人认为只要认真听课，对于课上的知识不存在学不懂或者讲的不清楚的问题。

- 作业。作业围绕其自创的 Java 程序分析框架太阿进行。
八个作业涵盖多种静态分析技术，包括编译优化（活跃变量分析、常量传播、死代码检测），基础程序分析（程序调用图构建、非/上下文敏感指针分析），以及程序分析在软件安全性的应用（污点分析）。
课程同时还提供**所有人**可用的在线评测系统，适合自学。

作业主要是实现课上的伪代码算法，从而更好的帮助你理解课上所讲的知识。我感觉难度并不是特别大，特别适合在上完课后完成对应的实验来检验自己对课上知识的掌握程度。
不过想要通过每个作业的所有测试点还是很有难度的。

## 课程资源

- 课程网站：[主页](https://tai-e.pascal-lab.net/lectures.html)
- 课程视频：[Bilibili](https://www.bilibili.com/video/BV1b7411K7P4/?spm_id_from=333.999.0.0&vd_source=b58da8cd0259ee873ef3dc2c9aa36d74)
- 课程教材：无
- 课程作业：[实验主页](https://tai-e.pascal-lab.net/intro/overview.html)
- 在线评测： [OJ](https://oj.pascal-lab.net/problem)
