February 25, 2026
When code goes GOTO, you go oh no
30 Years of Decompilation and the Unsolved Structuring Problem: Part 1 (2024)
30 Years In and GOTO Still Haunts Code — crowd split between keep-it-real vs make-it-pretty
TLDR: A deep dive says the core challenge of turning jumpy machine code into neat if/else blocks remains unsolved. Commenters split between raw honesty (show the jumps) and polished readability, trading GOTO memes and arguing whether “pretty” decompilation helps users or just hides the truth.
The post revisits 30 years of trying to turn messy machine code into clean, human-friendly “if/else” and loops, and the comments are on fire. Reverse engineers cheered the blunt truth: structuring code is still an unsolved puzzle. Compiler folks rolled in with “told you so,” while casual readers learned that a “control flow graph” is basically a map of code jumps—aka spaghetti. The biggest fight? Whether decompilers should tell the ugly truth (lots of jumps, aka GOTO) or pretty it up with neat blocks that may not match reality.
Old-schoolers name-dropped 1994’s Cifuentes work and argued pattern-matching still gets you far; practitioners shot back that modern compilers and languages like Rust or Go make those patterns explode. One camp begged for interactive decompilation (let humans choose), another demanded formal guarantees, and a third shrugged: “print the chaos.” Jokes flew fast: “GOTO considered harmful vs GOTO considered inevitable,” ASCII diamonds for if/else, and the now-classic “decompiler fanfic” meme. The spiciest hot take called out tools that flip conditions to look nicer, while others defended readability as a public service. The mood: fascinated, frustrated, and extremely online. For context on what decompilers try to do, see Decompiler and the perennial goto.
Key Points
- •Part 1 surveys the history of binary decompilation with emphasis on the unresolved control flow structuring problem.
- •Cifuentes’ 1994 work formalized converting CFGs into high-level structures via structuring algorithms and graph schemas.
- •Structuring proceeds bottom-up by recognizing patterns; when patterns fail, gotos can ensure code generation, though used sparingly.
- •A CFG example shows how extra edges can break patterns, requiring choices (e.g., which edge becomes a goto) that affect code quality.
- •Multiple valid structured outputs can exist for a single CFG; part 2 will examine modern structuring techniques and limitations.