CS 6340: Software Analysis

Instructional Team

Chris Poch
Chris Poch
Instructor
Mayur Naik
Mayur Naik
Creator
Chris Pryby
Chris Pryby
Course Developer
Joel Cooper
Joel Cooper
Head TA
Kelly Parks
Kelly Parks
Head TA

Overview

Have you ever wondered how your development environment can determine that you have an unused variable before you compiled the code? How do strongly-typed programming languages prevent bugs in your code? How can we be ahead of our users in finding bugs in complicated systems that may not have been caught by our testing efforts? In this class, we will explore these topics along with several others that together make up the field of software analysis.

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.

Foundational Course Computing Systems Elective

Course Goals

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

Preview

Sample Syllabi

Summer 2024 syllabus (PDF)
Spring 2024 syllabus (PDF)
Summer 2023 syllabus (PDF)

Note: Sample syllabi are provided for informational purposes only. For the most up-to-date information, consult the official course documentation.

Course Content

To access the public version of this course's content, click here, then log into your Ed Lessons account. If you have not already created an Ed Lessons account, enter your name and email address, then click the activation link sent to your email, then revisit that link.

Before Taking This Class...

Suggested Background Knowledge

We expect you to be fluent in a C-family language, such as C, C++, Java, or C#. Most classwork will be in C++, and the effort required will be greatly increased if you are not already fluent in a C-family language. 

In this course, you will use a variety of tools implemented in different programming languages to generate useful facts about a program’s behavior and analyze them. You will learn about the tools and their theoretical underpinnings in this class, however it is assumed that you are already familiar with basic concepts in computer science and mathematics, as well as the use of various tools/command in a UNIX-like environment.

The instructors and teaching assistants have only a limited capability to assist students with learning these tasks, and they will not be explicitly covered in video lessons. We have created a Readiness Assessment that you can use to determine prerequisite tasks that you may wish to learn or re-familiarize yourself with before enrolling in this course.

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.

Academic Integrity

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.