Teaching Assistant for CSC 230

Undergraduate course, North Carolina State University, 2024

In this course, students will develop skills in several important areas. First, we’ll get some experience working in C, a language that lets us think like procedural rather than object-oriented developers. Also, being a fairly low-level language, C lets us see and control more of what’s going on in the hardware. This can help us think about using the hardware more effectively, whether we’re actually programming in C or in a higher-level language. While we learn C, we’ll also learn about tools and techniques that help us build, manage, debug and analyze software projects.

Course Objectives

  • Compilation
    • Implement C programs using the C standard library and separately-compiled modules.
    • Explain the steps of compilation.
    • Identify and fix errors during compilation and execution.
  • Language
    • Write, debug, and modify C programs using:
      • Data types
      • Control structures
      • Operators
      • Library utilities
      • Variables
    • Understand variable scope within a single function, across multiple functions, and across modules.
  • Assembly Language
    • Describe and explain a subset of assembly language for:
      • Implementing C features like switch and goto statements.
      • Accessing parts of the stack frame.
      • Accessing fields in a struct.
  • Numbers
    • Add and subtract unsigned and signed, two’s complement binary integers.
    • Convert among standard types (bases 2, 10, and 16).
    • Understand 16-bit and 32-bit IEEE floating-point representation and its consequences for rounding error.
    • Convert between these formats and decimal.
  • Memory and Representation
    • Use functions and basic data structures (arrays, structs, pointers, function pointers).
    • Allocate and deallocate memory in C programs.
    • Avoid memory leaks and dangling pointers.
  • Tools
    • Utilize software development tools for:
      • Implementing, testing, building, and tracing C programs.
      • Build automation.
      • Version control.
      • Static and dynamic analysis tools.
  • Security
    • Describe and demonstrate how to avoid common programming errors leading to security vulnerabilities (e.g., buffer overflows, injection attacks).
    • Understand security properties provided by cryptographic primitives (symmetric cryptography, asymmetric cryptography, cryptographic hash functions).