These are the courses that I regularly teach.
This undergraduate course introduces students to intermediate representations, inter-procedural and intra-procedural analyses, call graphs, pointer analysis, and analysis frameworks. Students acquire a solid knowledge about the theory of program analysis, as well as practical experience through the course assignments and project.
This graduate course provides a platform for students to discuss research papers about both classical and state-of-the-art program analyses. It also enables students to conduct in-depth research in program analysis, with the ability to apply it to their own area of interest (e.g., security or usability).
This undergraduate course introduces students to the interface between software and hardware, as well as the major issues with the design and implementation of parallel programs that run in multiple processors. Students leave this course with an understanding of how machine code is generated by a compiler/assembler.