The point of software analysis is to determine whether software is correct. Today, the cost of software development is less than 50% programming, with testing, debugging, security assessments, and similar tasks taking more resources than developing the software itself. As a result, there is an increasing focus in the software industry on using tools to write better software. These tools can take the form of testing tools that help find bugs but they can also take the form of analysis techniques that have the goal of building a stronger code foundation with fewer areas where defects can emerge, the end result being less risk in the software development lifecycle.
In this class, we will investigate multiple techniques for analyzing software and the limits of what software analysis can tell us. Each lesson covers a different area of software analysis and many lessons have a corresponding lab where you will gain hands-on experience with the technique covered in the lecture. The labs will evaluate your practical use of the techniques, while the exams will evaluate your understanding of the lessons not covered by labs and also the theories of software analysis techniques.
Applications of techniques covered in this class relate to performance, cyber security, testing, and debugging. In this course, you will study the underlying principles of software analysis and these approaches, and gain hands-on experience applying them to automate testing software and finding bugs in complex, real-world programs. You will explore techniques including dataflow analysis, constraint-based analysis, type systems, automated test case generation, symbolic execution, and more.
While testing is frequently part of software analysis, the approach to software testing presented in this class is directly tied to analysis and is frequently different than the testing usually performed as part of quality assurance in a typical software development lifecycle.
More information is available on the CS 6340 course website.
This course counts towards the following specialization(s):
After successfully completing the course, you will be able to do the following:
- Evaluate the suitability of different analysis and testing techniques for different types of programs and under a given set of constraints
- Implement and run analyses to determine useful facts about a given program
- Describe qualitative properties of different techniques for analyzing and testing programs
- Compute the outcome of a given analysis or testing technique on a program
Summer 2020 syllabus (PDF)
Note: Sample syllabi are provided for informational purposes only. For the most up-to-date information, consult the official course documentation.
You can view the lecture videos for this course here.
Before Taking This Class...
Suggested Background Knowledge
In this class, you will use a variety of tools implemented in different programming languages to generate useful facts about a program’s behavior and analyze them. This means you should be comfortable reading and writing basic code in several commonly used languages, such as C, Java, and Python. In preparation for taking this course we recommend that you visit our Readiness Assessment to determine which skills you may wish to refresh or acquire prior to the start of classes.
Technical Requirements and Software
Georgia Tech's Office of Student Computer Ownership issues minimum hardware requirements to incoming undergraduates; you should meet or exceed these guidelines.
All Georgia Tech students are expected to uphold the Georgia Tech Academic Honor Code. This course may impose additional academic integrity stipulations; consult the official course documentation for more information.