Test corpus
213 programs with source and recovered C
Each fixture isolates a compiler pattern or language feature. The harness recompiles the recovered C and calls it beside the original with the same seeded inputs.
83.9%
function-lanes behave identically
2,895 of 3,449 function-lanes, baseline.json at b47f6b43
213
fixtures
C, C++, Rust; six lanes each
94
fixtures with a failing lane
listed first below
A lane is one function built with one compiler and optimization level, such as gcc -O0 or clang -O2. A function built four ways counts four times. The denominator
is therefore
3,449 and not the number of C functions.
This is an execution test, not a text comparison. Plausible C still fails if it returns a different value or changes a buffer differently.
Groups are ordered by what the decompiler recovers, weakest first, and so are the fixtures inside them. The numbers in the left column are the order fixtures were added, which is not a difficulty curve.
By what it recovers
| group | fixtures | function-lanes | pass |
|---|---|---|---|
| C++ object model | 10 | 88/201 | 43.8% |
| Rust | 7 | 70/136 | 51.5% |
| Floating point | 5 | 76/124 | 61.3% |
| Scale, linkage, wire formats | 15 | 189/264 | 71.6% |
| Runtime and obfuscation | 11 | 149/184 | 81.0% |
| C language semantics | 51 | 540/616 | 87.7% |
| ABI and codegen edges | 35 | 747/848 | 88.1% |
| Numeric and domain code | 27 | 213/228 | 93.4% |
| Strings, encoding, hashing | 13 | 123/128 | 96.1% |
| Control flow and calls | 13 | 552/568 | 97.2% |
| Data structures and algorithms | 26 | 148/152 | 97.4% |
C++ object model 88/201 · 43.8%
Rust 70/136 · 51.5%
Floating point 76/124 · 61.3%
Scale, linkage, wire formats 189/264 · 71.6%
- 160 init and fini 0/20
- 158 weak symbols 4/20
- 157 symbol visibility 8/20
- 154 wide switch 9/12
- 156 plt and got calls 18/24
- 159 ifunc resolver 16/20
- 164 nested tlv walker 16/20
- 165 bitstream reader 16/20
- 162 unaligned memcpy access 25/28
- 161 packed struct layout 18/20
- 155 long dependency chain 11/12
- 151 wide branch ladder 8/8
- 152 deep nesting 12/12
- 153 many live locals 8/8
- 163 wire header parser 20/20
Runtime and obfuscation 149/184 · 81.0%
- 140 thread local storage 2/16
- 143 dynamic frames 4/12
- 148 dispatch obfuscation 10/16
- 150 obfuscation composite 9/12
- 142 nonlocal control 7/8
- 145 control flow flattening 14/16
- 141 atomics 15/16
- 144 inline asm 16/16
- 146 opaque predicates 24/24
- 147 instruction substitution 24/24
- 149 mba expressions 24/24
C language semantics 540/616 · 87.7%
- 102 duffs device 0/4
- 103 computed goto 0/4
- 87 variable length array 0/8
- 108 multidimensional arrays 4/12
- 113 varargs 4/12
- 101 static locals 6/12
- 111 self referential struct 2/4
- 88 restrict pointers 4/8
- 116 string literals 10/16
- 120 const and literals 8/12
- 126 x macros 9/12
- 81 call argument identity 6/8
- 112 recursion shapes 13/16
- 128 qualifier combinations 10/12
- 129 struct by value 10/12
- 84 compound literals 10/12
- 85 designated initializers 10/12
- 95 function pointer table 7/8
- 123 sizeof semantics 18/20
- 109 subscript commutativity 11/12
- 122 compound assignment 11/12
- 127 inline linkage 11/12
- 100 struct layout 12/12
- 104 statement expression 8/8
- 105 goto ladder 4/4
- 106 switch shapes dense sparse 12/12
- 107 short circuit 12/12
- 110 pointer arithmetic 12/12
- 114 volatile access 16/16
- 115 enum semantics 12/12
- 117 modular arithmetic 20/20
- 118 bit tricks 24/24
- 119 branch hints 8/8
- 121 dense expression 12/12
- 124 loop break continue 12/12
- 125 loop shapes 16/16
- 130 bitpacked codec 12/12
- 131 obfuscated composite 8/8
- 82 comma operator 12/12
- 83 ternary chains 12/12
- 86 flexible array member 8/8
- 89 bool semantics 12/12
- 90 bitfields 12/12
- 91 union type punning 12/12
- 92 anonymous members 8/8
- 93 generic selection 16/16
- 94 alignment 16/16
- 96 integer promotion 16/16
- 97 signed unsigned pitfalls 16/16
- 98 shift semantics 20/20
- 99 char and endianness 16/16
ABI and codegen edges 747/848 · 88.1%
- 205 x87 long double 4/20
- 217 complex arithmetic 10/24
- 182 cold and part splits 8/16
- 203 string move copies 18/36
- 197 homogeneous float aggregates 31/44
- 195 by value aggregates 30/40
- 201 float bit stores 25/32
- 206 aarch64 wide dispatch 10/12
- 215 switch on wide selector 17/20
- 198 aggregate return edges 55/60
- 207 scaled index addressing 22/24
- 191 indirect table args 15/16
- 212 loop with returning arm 15/16
- 204 adjacent dispatch tables 19/20
- 183 sentinel list search 20/20
- 184 rep stos widths 20/20
- 185 subword signed division 28/28
- 186 defaultless guarded switch 20/20
- 187 constant bias index 20/20
- 188 vector transport 16/16
- 189 effectful select 20/20
- 190 dual role products 20/20
- 192 pointer chased list 20/20
- 193 mapped constant roles 24/24
- 194 narrow return widths 40/40
- 196 disjoint frame slots 16/16
- 199 pointer return kinds 24/24
- 202 bit scan and count 48/48
- 208 flag register roundtrip 16/16
- 209 out of line guard handlers 12/12
- 210 shared return epilogues 20/20
- 211 irreducible loops 16/16
- 213 arm predicated execution 24/24
- 214 arm literal pools 24/24
- 216 packed union wire record 20/20
Numeric and domain code 213/228 · 93.4%
- 54 sha256 block 0/4
- 58 rational 5/8
- 62 gaussian elimination 3/4
- 63 numerical integration 6/8
- 77 lru cache 3/4
- 56 sieve 7/8
- 65 projectile motion 7/8
- 67 elastic collision 11/12
- 74 moving statistics 11/12
- 55 modular arithmetic 12/12
- 57 bignum 8/8
- 59 combinatorics 12/12
- 60 integer matrix 12/12
- 61 fixed point 16/16
- 64 root finding 8/8
- 66 orbital step 4/4
- 68 thermodynamics 12/12
- 69 molar mass 4/4
- 70 reaction balance 4/4
- 71 compound interest 8/8
- 72 loan amortization 8/8
- 73 present value 8/8
- 75 order book 4/4
- 76 portfolio rebalance 8/8
- 78 ring buffer 12/12
- 79 segment tree 12/12
- 80 trie 8/8
Strings, encoding, hashing 123/128 · 96.1%
Control flow and calls 552/568 · 97.2%
- 09 memory effects 24/36
- 08 indirect dispatch 12/16
- 01 conditional polarity 48/48
- 02 integer widths 112/112
- 03 loop shapes 72/72
- 04 switch shapes 64/64
- 05 cleanup and state machine 8/8
- 06 calling conventions 68/68
- 07 packet parser 8/8
- 11 call shapes 52/52
- 12 loop rotation 32/32
- 13 loop early exit 24/24
- 14 flag effects 28/28
Data structures and algorithms 148/152 · 97.4%
- 36 quicksort 2/4
- 33 knapsack 7/8
- 39 counting radix sort 7/8
- 15 binary search tree 8/8
- 16 red black tree 4/4
- 17 hash table 8/8
- 18 binary heap 8/8
- 19 disjoint set 8/8
- 20 graph bfs 4/4
- 21 graph dfs 4/4
- 22 dijkstra 4/4
- 23 topological sort 4/4
- 24 merge sort 4/4
- 25 kmp search 4/4
- 26 sparse matrix 4/4
- 27 newton raphson 4/4
- 28 euler ode 4/4
- 29 polynomial 8/8
- 30 finite difference 4/4
- 31 edit distance 8/8
- 32 longest common subsequence 8/8
- 34 coin change 8/8
- 35 matrix chain 4/4
- 37 heapsort 4/4
- 38 insertion shell sort 8/8
- 40 quickselect 8/8