Labs

Projects

Labs

Each lecture has a programming assignment associated with it. Labs include one or more smaller tasks designed to give you hands-on (applied) experience that reinforce concepts learned in lecture and to also build up and prepare you for the projects. You will work on these independently and in recitations (you should start them well before recitation).

Labs are to be completed individually.

Labs are provided through the course git repository, and are auto graded using Gradescope. Specifics about each lab are provided in the README for each lab. If you are not comfortable or are unfamiliar with git, please let us know by posting on Ed Discussion.

You need to run the labs on an appropriately configured linux container, see Getting Started.

Labs for each week are due the following Sunday before 11:59pm.

All labs should be submitted to Gradescope using the gitlab button.


  • Early Lab Submission Form

    • Fill out this form if you submitted your lab early and would like to be excused from attending lab. After filling out this form, no new Gradescope submissions for the lab will be graded.

Projects

There are 7 programming projects in the course, roughly one every two weeks. These projects are slightly larger and more involved than the labs, but generally build on what you have learned by doing the labs. The projects will be made available in the course git repository.

You can work alone or with one other student on each project. See the Syllabus for more information about pairing.

Projects are provided through the course git repository, and are auto graded using Gradescope. Specifics about each project are provided in the respective README.

You need to run the projects on an appropriately configured linux container (see Getting Started). Project 4 requires special steps that will be described when the project is released.

The project topics are:

  1. Bits & Bytes: Use bit-wise operations to extract and modify values.

  2. Data & Memory: Implement a hash table to store deserialized information for a key-value system.

  3. Bomb: Reverse engineer programs to determine correct input sequences that avoid failure in execution.

  4. Attack: Perform simple attacks on a program through buffer overflow to i) cause some data to be overwritten and ii) cause the program to execute a specific function in the program that it should not execute.

  5. Caching: Build a cache of key-value pairs and provide appropriate replacement of any modified pairs.

  6. Memory allocation: Implement a version of malloc.

  7. Concurrency: Implement a multithreaded program.