I had a 40-variant error enum. Nobody matched on it. Display impl was the product. I went back to a string + a code…
Tired of pulling goblin for throwaway lab tools. ~400 lines: DOS stub, COFF, optional header, section table, export…
A vendor sent IOCs as an HTML table. I asked for CSV. They sent HTML. I used a real HTML parser with a size cap, on…
I snapshot Capstone output on a corpus of public functions. A Capstone bump changed formatting and CI went red. Goo…
Last bit of the last word. Tests used sizes % 64 != 0 except the one that mattered. Fuzzer found it on a 64-bit bou…
I stored match offsets in a roaring bitmap. Query time dropped. Memory went up. Worth it for the lab dashboard. If …
Whitespace in the alphabet. Padding rules. A URL-safe variant in one file. I used a crate after the third bug. The …
Needed a one-instruction stub. Go assembler, not Cgo. It was fine. The build tags were not. If you mix Go asm and c…
mmap a hostile file, then a truncating writer on another handle. You will have a bad day. I read() into a cap now. …
Someone used CRC32 to key a map of modules. Collisions in the lab corpus. I switched to blake3 truncated. Checksums…
I rewrote a 3k-line C parser in Rust. It was nicer. The C version still ships because the firmware team will not ta…
16 bytes per line, ASCII pane, offset. No colors. No plugins. I paste it into tickets. xxd is fine. I wanted one I …
libFuzzer, 12 hours, 4 crashes. All my fault. I fixed 3 and documented the 4th as 'do not do that'. If you ship a p…
Lab drop folders get huge by accident. A default cap made a colleague angry and then grateful. Caps are product fea…
Parser written on x86, deployed on ARM64 CI. A u32 field was host-endian by accident. Tests were little-endian-only…
I wanted 'simpler than YAML'. I wrote a grammar. Users wrote YAML in it anyway. I vendored a YAML parser. Do not wr…
Untrusted ZIP from a drop folder. I cap uncompressed size, entry count, and nested ZIPs. Then I still extract to a …
It worked. It was slower. The sandboxing was nice. I still run the native one. WASI is not a personality. It is a d…
Intern table held pointers into a buffer I freed on reload. Looks like 'random corruption'. Was lifetime. If you in…
I needed exports and nothing else. The GUI took 20 seconds to open. The script printed them in 0.1. GUIs are for ex…
--pretty, --color=always in a pipe, --force without a dry-run. I have been burned. Dry-run is default for destructi…
I stored a tag and a payload. A helper trusted the caller on the tag. The caller lied. Fuzzer found it. If the tag …
CSV: bugcheck, image, build, license tag, hash. No full dumps in the zip. Pointers only. People keep asking for the…
Config was XML. I converted it to a smaller JSON at ingest and threw the XML away. Life improved. If you can avoid …
Three functions: need(n), take(n), remain(). Every parser bug I still write is because I did not use them. Paste yo…
Reproducible build check as a test. Two dirs, same flags, cmp. It failed because of an embedded __DATE__. I killed …
Vendor 'JSON' log was NDJSON. My parser expected a list. I read the first 8KB and guessed. Guessed wrong. Sniff the…
Optional header checksum. Easy to fix after a patch. I compute it so loaders do not shrug. I do not use it as integ…
dotnet portable PDB in a mixed tree. My old PDB parser shrugged. I added the portable path. Tests against public sa…
A deny_unknown_fields struct and a vendor added a field. We failed closed in a good way, then I had to ship a permi…
I needed build-id and nothing else. Full ELF library was overkill. 80 lines, aligned reads, done. If you only need …
Version info strings. I treated them as UTF-8 and got mojibake in the lab UI. They are UTF-16LE. Always. I added a …
Power-of-two buffer, claimed empty/full distinguished by a count, tests used even sizes. Odd size in production los…
MSVC-looking flags on clang-cl silently dropped -fsanitize=address until I used the clang-cl form. Paste your worki…
I implemented unsigned varint off a blog post. The blog post was wrong. The spec was not. Tests against a known-goo…
It was not protobuf. I wasted a morning on protoc. It was a home-grown TLV with a 16-bit type and a 32-bit length. …
I used all three this year. Capstone is everywhere. Zydis is nicer on x86. iced is what I reach for in Rust. Pick o…
Length field, then alloc, then copy. Saturating add in the patch. Hunt the old immediate. Grep your own trees. The …
I needed to load a .obj from a lab compiler. COMDATs will end you. If you see IMAGE_COMDAT_SELECT_*, close the edit…
Hot set vs slow set. One Themida-shaped loop in the hot set and you are done. The fast/slow split is the whole game…