Tools whose bugs are features, or at least have been promoted to features for the purposes of this page.
Some of the programs in my archive do something wrong on purpose. Others do something wrong by accident and have been left that way long enough that fixing them would now be disruptive. This page is where I keep both, with attribution. It is not the gallery; the gallery is for tools I would recommend to a stranger. This is for tools I would recommend to a stranger only after several minutes of caveats.
fork-bomb-lite
POSIX sh · 2019 · TS-B-001
A pedagogical fork bomb with a hard ceiling. It doubles the process count every 200 ms until it hits RLIMIT_NPROC / 2, then stops and prints a histogram of how long each generation took to spawn. Used exactly once, at a workshop, to demonstrate why ulimit exists. It has been sitting in the archive ever since, and I refuse to delete it because someone might ask me to teach that workshop again.
Broken behaviour: will deadlock under some combinations of cgroup limits. Fix: unknown. Accepted: yes.
cat-but-worse
C · 2020 · TS-B-002
A drop-in replacement for cat(1) that is bytewise identical in output, but reads one byte at a time using read(fd, buf, 1). Exists to give junior engineers a hands-on understanding of why the standard cat is ~2000× faster on real files. I have, on two occasions, watched someone have the "oh" moment in real time. Worth its weight.
Broken behaviour: is, itself, the joke. Not actually broken. Deliberately stupid.
utf8-roulette
Rust · 2022 · TS-B-003
A UTF-8 encoder that, once in every 256 characters on average, emits a syntactically valid but semantically incorrect byte sequence. Useful for stress-testing decoders that claim to be strict. Every decoder I have pointed this at has eventually lost. Every single one.
Broken behaviour: intentional corruption. Fix: turn it off. Accepted: yes, behind a loud flag.
chronic-yes
C · 2023 · TS-B-004
Like yes(1), but it gets tired. Emits "y" at a rate that decays on a negative exponential with a half-life of seven minutes. Written in response to a specific argument about whether a certain load-testing harness would ever notice if a client's throughput curve was not, in fact, flat. The harness did not notice. The tool stayed.
Broken behaviour: pretending to be a benchmark fixture. Fix: don't use it for that. Accepted: reluctantly.
/proc/stupid
Linux kernel module · 2023 · TS-B-005
This one also appears in the gallery. It is here too, because on three specific kernel revisions it panics when /proc/stupid/self is read twice within the same jiffy. I know which revisions. I have chosen not to fix it, because the behaviour is extremely funny and no one is running it in production (see front-page warning).
Broken behaviour: real kernel panic on real hardware. Fix: known, four lines. Accepted: for now.
tee-but-honest
POSIX sh · 2024 · TS-B-006
A one-line wrapper around tee(1) that prints, to stderr, a running estimate of how much data it has seen so that you know whether the pipeline is stuck or merely slow. Violates the principle that a tool in a pipe should shut up. Violates it happily.
Broken behaviour: chatty on stderr. Fix: none planned.
If you came here looking for production-grade software, I refer you to any of the several companies that sell it. This page is honest about what it is.