Day 19: The Mask
Section 2.7, bitwise operators, and why the same 8 bits mean different things depending on who's reading them.
Section 2.7, bitwise operators, and why the same 8 bits mean different things depending on who's reading them.
Closed the overnight question on why character constants are int, worked through sections 2.3 through 2.5, and wrote exercise 2-2 — the one where short-circuit evaluation turns out to be a security guarantee.
Chapter 2 opens and the type system immediately starts lying to you.
Testing everything from Chapter 1. Feynman gauntlet, code tracing, security connections, and closing gaps I did not know I had.
Finishing Chapter 1 with the two hardest exercises. Comment stripping, bracket matching, and why parsers that don't understand context create entire vulnerability classes.
K&R exercises 1-20 through 1-22. Tab expansion, tab compression, line folding. A bug that hid in plain sight.
Exercises 1-16 through 1-18. Dual counters, GDB investigations, and what happens when zero means two things.
K&R 1.8 and 1.9. Call by value, character arrays, and the single byte that holds all of C together.
K&R 1.6 and 1.7. Arrays, character arithmetic, functions. And the first time I watched a bug disappear into memory that wasn't mine.
Rebuilding ten exercises from scratch on a different machine. No peeking. No shortcuts. Proof of ownership.
Rebuilding exercise 1-10 from scratch, word counting with state machines, and threat modeling a 20-line program.
Line counting, state tracking, and the cost of reaching for someone else's answer.
C stops printing and starts listening. getchar, putchar, and the precedence trap that has ruined code for fifty years.
K&R section 1.4. Symbolic constants. The preprocessor. And the realization that every layer was built by people who could not see what was coming.