Fixture 87

variable length array

C · 2 functions · 4 lanes · 0 of 8 function-lanes behave identically

4 of 4 lanes have a function that returns a different result after decompilation: clang-O0 (0/2), clang-O2 (0/2), gcc-O0 (0/2), gcc-O2 (0/2).

C99 variable-length arrays. The element count is a runtime value, so the frame is sized dynamically and indexing uses a runtime stride. The count is hard-clamped: an unbounded VLA would be a stack-overflow hazard, not a test.

tests/decompiler_fixtures/src/87_variable_length_array.c source
#include <stdint.h>

/* C99 variable-length arrays. The element count is a runtime value, so the
 * frame is sized dynamically and indexing uses a runtime stride. The count is
 * hard-clamped: an unbounded VLA would be a stack-overflow hazard, not a test. */

#define VLA_LIMIT 16

__attribute__((noinline)) int32_t
vla_reverse_sum(const int32_t *input, int32_t count) {
    if (input == 0 || count < 1 || count > VLA_LIMIT) {
        return -1;
    }
    {
        int32_t scratch[count];
        int32_t index;
        int32_t total = 0;
        for (index = 0; index < count; ++index) {
            scratch[count - 1 - index] = input[index];
        }
        for (index = 0; index < count; ++index) {
            total += scratch[index] * (index + 1);
        }
        return total;
    }
}

__attribute__((noinline)) int32_t
vla_two_dimensional(int32_t rows, int32_t columns) {
    if (rows < 1 || rows > 4 || columns < 1 || columns > 4) {
        return -1;
    }
    {
        int32_t grid[rows][columns];
        int32_t row;
        int32_t column;
        int32_t total = 0;
        for (row = 0; row < rows; ++row) {
            for (column = 0; column < columns; ++column) {
                grid[row][column] = row * columns + column;
            }
        }
        for (row = 0; row < rows; ++row) {
            for (column = 0; column < columns; ++column) {
                total += grid[row][column];
            }
        }
        return total;
    }
}

Recovered C

Generated by glaurung decompile --style decbench at b47f6b43. baseline.json records the result after recompiling the C and calling it beside the original with seeded inputs.

clang -O0

0/2
vla_reverse_sum fail 39 lines
// glaurung: vla_reverse_sum @ 0x1100
__attribute__((no_stack_protector)) int32_t vla_reverse_sum(const int32_t * arg0, int32_t arg1) {
    unsigned long __vla_expr0;
    int total;
    int index;
    void * local_20;
    long local_38;
    int local_4;
    unsigned char stack_1[64];
    // x86-64 prologue: save rbp, frame 64 bytes
    if ((arg0 == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((long)(arg1) < 1)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    local_20 = &stack_1[0];
    local_38 = (long)((&stack_1[0] - ((((unsigned long)((unsigned int)(arg1)) * 4) + 15) & -16)));
    __vla_expr0 = (unsigned int)(arg1);
    total = 0;
    for (index = 0; (index < arg1); index++) {
        *(int *)((local_38 + ((long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) - 1))) - index))) * 4))) = arg0[(long)(index)];
    }
    for (index = 0; (index < arg1); index++) {
        total = ((unsigned int)(((unsigned long)((unsigned int)(*(int *)((local_38 + ((long)(index) * 4))))) * (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) + 1))))) + total);
    }
    local_4 = total;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}
vla_two_dimensional fail 57 lines
// glaurung: vla_two_dimensional @ 0x1200
__attribute__((no_stack_protector)) int32_t vla_two_dimensional(int32_t arg0, int32_t arg1) {
    unsigned long __vla_expr0;
    unsigned long __vla_expr1;
    int total;
    int row;
    int column;
    void * local_18;
    int local_4;
    long local_40;
    long local_48;
    unsigned char stack_1[80];
    // x86-64 prologue: save rbp, frame 80 bytes
    if (((long)(arg0) < 1)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((((unsigned long)((unsigned int)(arg0)) == 4) | ((long)(arg0) < 4)) == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((long)(arg1) < 1)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((((unsigned long)((unsigned int)(arg1)) == 4) | ((long)(arg1) < 4)) == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    local_48 = (unsigned int)(arg1);
    local_18 = &stack_1[0];
    local_40 = (long)((&stack_1[0] - (((((unsigned long)((unsigned int)(arg0)) * (unsigned long)((unsigned int)(arg1))) * 4) + 15) & -16)));
    __vla_expr0 = (unsigned int)(arg0);
    __vla_expr1 = (unsigned int)(arg1);
    total = 0;
    row = 0;
    while ((row < arg0)) {
        for (column = 0; (column < arg1); column++) {
            *(int *)(((local_40 + (((long)(row) * local_48) << 2)) + ((long)(column) * 4))) = ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * arg1))) + column);
        }
        row = ((unsigned int)(row) + 1);
    }
    row = 0;
    while ((row < arg0)) {
        for (column = 0; (column < arg1); column++) {
            total = ((unsigned int)(*(int *)(((local_40 + (((long)(row) * local_48) << 2)) + ((long)(column) * 4)))) + total);
        }
        row = ((unsigned int)(row) + 1);
    }
    local_4 = total;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}

clang -O2

0/2
vla_reverse_sum fail 300 lines
// glaurung: vla_reverse_sum @ 0x1100
__attribute__((no_stack_protector)) int32_t vla_reverse_sum(const int32_t * arg0, int32_t arg1) {
    int index;
    int total;
    long rbp;
    long ret;
    long rsp;
    unsigned char stack_2[24];
    long t110;
    long t113;
    long t421;
    long t424;
    long var0;
    long var1;
    long var12;
    int var128;
    int var129;
    int var130;
    int var131;
    long var133;
    int var134;
    int var135;
    int var136;
    int var137;
    int var138;
    int var139;
    long var14;
    int var140;
    int var141;
    int var145;
    int var146;
    int var147;
    int var148;
    int var149;
    int var150;
    int var151;
    int var152;
    int var153;
    int var154;
    int var155;
    int var156;
    long var16;
    long var2;
    long var22;
    long var23;
    long var25;
    long var273;
    long var29;
    long var32;
    int var38;
    long var4;
    int var45;
    int var46;
    int var47;
    int var48;
    int var54;
    int var55;
    int var56;
    int var57;
    int var63;
    int var64;
    int var65;
    int var66;
    int var72;
    int var73;
    int var74;
    int var75;
    long var79;
    long var8;
    long var80;
    long var83;
    int var85;
    int var86;
    int var87;
    int var88;
    int var89;
    long var9;
    int var90;
    int var91;
    int var92;
    long var95;
    ret = 0xffffffff;
    if ((arg0 == 0)) {
        return ret;
    }
    var0 = (unsigned long)((unsigned int)((arg1 - 17)));
    if (((unsigned long)((unsigned long)((unsigned int)(var0))) < (unsigned long)(0xfffffff0))) {
        return ret;
    }
    rsp = (rsp - 8);
    *(long *)((&stack_2[0] + 16)) = rbp;
    rbp = rsp;
    rsp = (rsp - 8);
    *(long *)((&stack_2[0] + 8)) = var1;
    *(long *)(&stack_2[0]) = var2;
    var4 = (unsigned long)((unsigned int)(arg1));
    var8 = (long)((&stack_2[0] - ((((unsigned long)((unsigned int)(arg1)) * 4) + 15) & -16)));
    rsp = var8;
    if (((unsigned long)(4) <= (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
        var0 = (var4 - 1);
        var9 = (unsigned long)((unsigned int)((arg1 - 1)));
        var12 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var9)) - var0)));
        var14 = 0;
        if (((((unsigned int)(var12) == (unsigned int)(var9)) | ((long)((int)(var12)) < (long)((int)(var9)))) == 0)) {
            L_11d3: ;
            var16 = (~var14);
            if (((unsigned long)((unsigned char)((var4 & 1))) != 0)) {
                var0 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + var14 * 4))));
                *(int *)((var8 + ((long)((int)(((~(unsigned long)((unsigned int)(var14))) + arg1))) * 4))) = var0;
                var14 = (var14 | 1);
            }
            var22 = (var16 + var4);
            var23 = (long)arg0;
            if ((var22 != 0)) {
                var25 = (var4 - var14);
                var29 = (unsigned long)((unsigned int)(((~(unsigned long)((unsigned int)(var14))) + arg1)));
                var23 = (long)((((long)arg0 + (var14 * 4)) + 4));
                var32 = 0;
                do {
                    *(int *)((var8 + ((long)((int)(var29)) * 4))) = *(int *)((var23 + var32 * 4 - 0x4));
                    *(int *)((var8 + ((long)((int)(((long)((int)(var29)) - 1))) * 4))) = *(int *)((var23 + var32 * 4));
                    var32 = (var32 + 2);
                    var38 = ((long)((int)(var29)) - 2);
                    var29 = (unsigned long)((unsigned int)(var38));
                    var22 = (unsigned long)((unsigned int)(var38));
                } while ((var25 != var32));
            }
        } else {
            var0 = ((unsigned long)(var0) >> 32);
            if ((var0 != 0)) {
                goto L_11d3;
            } else {
                var14 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var4)) & -4)));
                var22 = (long)((int)(var9));
                var45 = *(int *)(((long)arg0 + 0xc));
                var46 = *(int *)(((long)arg0 + 0x8));
                var47 = *(int *)(((long)arg0 + 0x4));
                var48 = *(int *)(((long)arg0));
                ret = ((unsigned long)((unsigned int)(var46)) | (unsigned long)((unsigned int)(var45)));
                *(int *)(((var8 + ((long)((int)(var9)) * 4)) - 12)) = var45;
                *(int *)(((var8 + ((long)((int)(var9)) * 4)) - 8)) = var46;
                *(int *)(((var8 + ((long)((int)(var9)) * 4)) - 4)) = var47;
                *(int *)((var8 + ((long)((int)(var9)) * 4))) = var48;
                if ((var14 != 4)) {
                    var22 = (long)((int)((arg1 - 5)));
                    var54 = *(int *)(((long)arg0 + 0x1c));
                    var55 = *(int *)(((long)arg0 + 0x18));
                    var56 = *(int *)(((long)arg0 + 0x14));
                    var57 = *(int *)(((long)arg0 + 0x10));
                    ret = ((unsigned long)((unsigned int)(var55)) | (unsigned long)((unsigned int)(var54)));
                    *(int *)((var8 + var22 * 4 - 0xc)) = var54;
                    *(int *)((var8 + var22 * 4 - 0x8)) = var55;
                    *(int *)((var8 + var22 * 4 - 0x4)) = var56;
                    *(int *)((var8 + var22 * 4)) = var57;
                    if (((unsigned long)((unsigned int)(var14)) != 8)) {
                        var22 = (long)((int)((arg1 - 9)));
                        var63 = *(int *)(((long)arg0 + 0x2c));
                        var64 = *(int *)(((long)arg0 + 0x28));
                        var65 = *(int *)(((long)arg0 + 0x24));
                        var66 = *(int *)(((long)arg0 + 0x20));
                        ret = ((unsigned long)((unsigned int)(var64)) | (unsigned long)((unsigned int)(var63)));
                        *(int *)((var8 + var22 * 4 - 0xc)) = var63;
                        *(int *)((var8 + var22 * 4 - 0x8)) = var64;
                        *(int *)((var8 + var22 * 4 - 0x4)) = var65;
                        *(int *)((var8 + var22 * 4)) = var66;
                        if (((unsigned long)((unsigned int)(var14)) != 12)) {
                            var22 = (long)((int)((arg1 - 13)));
                            var72 = *(int *)(((long)arg0 + 0x3c));
                            var73 = *(int *)(((long)arg0 + 0x38));
                            var74 = *(int *)(((long)arg0 + 0x34));
                            var75 = *(int *)(((long)arg0 + 0x30));
                            ret = ((unsigned long)((unsigned int)(var73)) | (unsigned long)((unsigned int)(var72)));
                            *(int *)((var8 + var22 * 4 - 0xc)) = var72;
                            *(int *)((var8 + var22 * 4 - 0x8)) = var73;
                            *(int *)((var8 + var22 * 4 - 0x4)) = var74;
                            *(int *)((var8 + var22 * 4)) = var75;
                        }
                    }
                }
                var23 = (long)arg0;
                if ((var14 == var4)) {
                    goto L_1243;
                }
                goto L_11d3;
            }
        }
    } else {
        var14 = 0;
        goto L_11d3;
    }
    L_1243: ;
    if (((unsigned long)(4) <= (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
        var79 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var4)) & -4)));
        var80 = (var79 - 4);
        var83 = (((unsigned long)(var80) >> 2) + 1);
        if ((var80 == 0)) {
            var85 = 0;
            var86 = 0;
            var87 = 0;
            var88 = 0;
            var89 = 1;
            var90 = 2;
            var91 = 3;
            var92 = 4;
            var95 = 0;
            if (((unsigned long)((unsigned char)((var83 & 1))) != 0)) {
                L_133f: ;
                var128 = (var85 + (unsigned int)(((unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4)))) * (unsigned long)((unsigned int)(var89)))));
                var129 = (var86 + (unsigned int)(((unsigned long)((unsigned int)(var90)) * (unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4 + 0x4)))))));
                var130 = (var87 + (unsigned int)(((unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4 + 0x8)))) * (unsigned long)((unsigned int)(var91)))));
                var131 = (var88 + (unsigned int)(((unsigned long)((unsigned int)(var92)) * (unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4 + 0xc)))))));
            } else {
                var128 = var85;
                var129 = var86;
                var130 = var87;
                var131 = var88;
            }
        } else {
            var133 = (var83 & -2);
            var134 = 2;
            var135 = 0;
            var136 = 3;
            var137 = 0;
            var138 = 0;
            var139 = 0;
            var140 = 1;
            var141 = 0;
            var85 = 0;
            var86 = 0;
            var87 = 0;
            var88 = 0;
            var95 = 0;
            var145 = -1;
            var146 = -1;
            var147 = -1;
            var148 = -1;
            var149 = 5;
            var150 = 5;
            var151 = 5;
            var152 = 5;
            var153 = 8;
            var154 = 0;
            var155 = 8;
            var156 = 0;
            do {
                var85 = ((unsigned int)(((unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4 + 0x10)))) * (unsigned long)((unsigned int)((var138 + var149))))) + ((unsigned int)(((unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4)))) * (unsigned long)((unsigned int)((var138 - var145))))) + var85));
                var86 = ((unsigned int)(((unsigned long)((unsigned int)((var140 + var150))) * (unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4 + 0x14)))))) + ((unsigned int)(((unsigned long)((unsigned int)((var140 - var146))) * (unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4 + 0x4)))))) + var86));
                var87 = ((unsigned int)(((unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4 + 0x18)))) * (unsigned long)((unsigned int)((var134 + var151))))) + ((unsigned int)(((unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4 + 0x8)))) * (unsigned long)((unsigned int)((var134 - var147))))) + var87));
                var88 = ((unsigned int)(((unsigned long)((unsigned int)((var136 + var152))) * (unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4 + 0x1c)))))) + ((unsigned int)(((unsigned long)((unsigned int)((var136 - var148))) * (unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4 + 0xc)))))) + var88));
                ret = ((unsigned long)((unsigned int)(var86)) | (unsigned long)((unsigned int)(var85)));
                var95 = (var95 + 8);
                t110 = (((unsigned long)((unsigned int)(var139)) | (unsigned long)((unsigned int)(var138))) + ((unsigned long)((unsigned int)(var154)) | (unsigned long)((unsigned int)(var153))));
                var138 = (unsigned int)(t110);
                var139 = (((unsigned long)(t110) >> 32) & 0xffffffff);
                t113 = (((unsigned long)((unsigned int)(var141)) | (unsigned long)((unsigned int)(var140))) + ((unsigned long)((unsigned int)(var156)) | (unsigned long)((unsigned int)(var155))));
                var140 = (unsigned int)(t113);
                var141 = (((unsigned long)(t113) >> 32) & 0xffffffff);
                t421 = (((unsigned long)((unsigned int)(var135)) | (unsigned long)((unsigned int)(var134))) + ((unsigned long)((unsigned int)(var154)) | (unsigned long)((unsigned int)(var153))));
                var134 = (unsigned int)(t421);
                var135 = (((unsigned long)(t421) >> 32) & 0xffffffff);
                t424 = (((unsigned long)((unsigned int)(var137)) | (unsigned long)((unsigned int)(var136))) + ((unsigned long)((unsigned int)(var156)) | (unsigned long)((unsigned int)(var155))));
                var136 = (unsigned int)(t424);
                var137 = (((unsigned long)(t424) >> 32) & 0xffffffff);
                var133 = (var133 - 2);
            } while ((var133 != 0));
            var89 = (var138 + 1);
            var90 = (var140 + 1);
            var91 = (var134 + 1);
            var92 = (var136 + 1);
            var128 = var85;
            var129 = var86;
            var130 = var87;
            var131 = var88;
            if (((unsigned long)((unsigned char)((var83 & 1))) == 0)) {
                goto L_1369;
            }
            goto L_133f;
        }
        L_1369: ;
        var273 = (unsigned long)((unsigned int)(((var131 + var129) + (var130 + var128))));
        ret = var273;
        if ((var79 != var4)) {
            L_1390: ;
            do {
                index = (var79 + 1);
                total = (var273 + (unsigned int)(((unsigned long)((unsigned int)(*(int *)((var8 + var79 * 4)))) * index)));
                var273 = (unsigned long)((unsigned int)(total));
                var79 = (unsigned long)((unsigned int)(index));
                ret = (unsigned long)((unsigned int)(total));
            } while ((var4 != index));
        }
    } else {
        var273 = 0;
        var79 = 0;
        goto L_1390;
    }
    rsp = (rbp - 16);
    // x86-64 epilogue: restore rbp
    return ret;
}
vla_two_dimensional fail 162 lines
// glaurung: vla_two_dimensional @ 0x13d0
__attribute__((no_stack_protector)) int32_t vla_two_dimensional(int32_t arg0, int32_t arg1) {
    int column;
    int row;
    int total;
    long rbp;
    long ret;
    unsigned char stack_0[40];
    long var12;
    long var15;
    long var16;
    long var17;
    long var18;
    long var19;
    long var2;
    int var22;
    long var23;
    int var24;
    long var25;
    long var28;
    long var3;
    long var31;
    long var32;
    long var33;
    long var38;
    long var39;
    long var4;
    long var40;
    long var43;
    long var44;
    long var45;
    long var5;
    int var60;
    long var7;
    long var8;
    ret = 0xffffffff;
    if (((unsigned long)(0xfffffffc) <= (unsigned long)((unsigned long)((unsigned int)((arg0 - 5)))))) {
        if (((unsigned long)((unsigned long)((unsigned int)((arg1 - 5)))) < (unsigned long)(0xfffffffc))) {
            return ret;
        }
        *(long *)((&stack_0[0] + 32)) = rbp;
        rbp = (long)((&stack_0[0] + 32));
        *(long *)((&stack_0[0] + 24)) = var2;
        *(long *)((&stack_0[0] + 16)) = var3;
        *(long *)((&stack_0[0] + 8)) = var4;
        *(long *)(&stack_0[0]) = var5;
        var7 = (unsigned long)((unsigned int)(arg0));
        var8 = (unsigned long)((unsigned int)(arg1));
        var12 = (((((unsigned long)((unsigned int)(arg1)) * (unsigned long)((unsigned int)(arg0))) * 4) + 15) & -16);
        var15 = (long)((&stack_0[0] - var12));
        var16 = (-var12);
        *(int *)((&stack_0[0] + var16)) = 0;
        if (((unsigned long)((unsigned int)(arg1)) != 1)) {
            *(int *)((var15 + 0x4)) = 1;
            if (((unsigned long)((unsigned int)(arg1)) != 2)) {
                *(int *)((var15 + 0x8)) = 2;
                if (((unsigned long)((unsigned int)(arg1)) != 3)) {
                    *(int *)((var15 + 0xc)) = 3;
                }
            }
        }
        var17 = var18;
        if (((unsigned long)((unsigned int)(arg0)) != 1)) {
            *(int *)((var15 + var8 * 4)) = arg1;
            if (((unsigned long)((unsigned int)(arg1)) != 1)) {
                var16 = (unsigned long)((unsigned int)((arg1 + 1)));
                *(int *)((var15 + var8 * 4 + 0x4)) = var16;
                if (((unsigned long)((unsigned int)(arg1)) != 2)) {
                    var16 = (unsigned long)((unsigned int)((arg1 + 2)));
                    *(int *)((var15 + var8 * 4 + 0x8)) = var16;
                    if (((unsigned long)((unsigned int)(arg1)) != 3)) {
                        var16 = (unsigned long)((unsigned int)((arg1 + 3)));
                        *(int *)((var15 + var8 * 4 + 0xc)) = var16;
                    }
                }
            }
            var17 = var18;
            if (((unsigned long)((unsigned int)(arg0)) != 2)) {
                var16 = (unsigned long)((unsigned int)((arg1 + arg1)));
                *(int *)((var15 + var8 * 8)) = var16;
                var17 = var18;
                if (((unsigned long)((unsigned int)(arg1)) != 1)) {
                    var19 = (var8 + var8);
                    var17 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var16)) | 1)));
                    *(int *)((var15 + var19 * 4 + 0x4)) = var17;
                    if (((unsigned long)((unsigned int)(arg1)) != 2)) {
                        var17 = (unsigned long)((unsigned int)((var16 + 2)));
                        *(int *)((var15 + var19 * 4 + 0x8)) = var17;
                        if (((unsigned long)((unsigned int)(arg1)) != 3)) {
                            var22 = (var16 + 3);
                            var16 = (unsigned long)((unsigned int)(var22));
                            *(int *)((var15 + var19 * 4 + 0xc)) = var22;
                        }
                    }
                }
                if (((unsigned long)((unsigned int)(arg0)) != 3)) {
                    var16 = (unsigned long)((unsigned int)((arg1 + (arg1 * 2))));
                    var23 = (var8 + (var8 * 2));
                    *(int *)((var15 + var23 * 4)) = var16;
                    if (((unsigned long)((unsigned int)(arg1)) != 1)) {
                        var17 = (unsigned long)((unsigned int)((var16 + 1)));
                        *(int *)((var15 + var23 * 4 + 0x4)) = var17;
                        if (((unsigned long)((unsigned int)(arg1)) != 2)) {
                            var17 = (unsigned long)((unsigned int)((var16 + 2)));
                            *(int *)((var15 + var23 * 4 + 0x8)) = var17;
                            if (((unsigned long)((unsigned int)(arg1)) != 3)) {
                                var24 = (var16 + 3);
                                var16 = (unsigned long)((unsigned int)(var24));
                                *(int *)((var15 + var23 * 4 + 0xc)) = var24;
                            }
                        }
                    }
                }
            }
        }
        var25 = (var8 - 1);
        var28 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var8)) & 7)));
        var31 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var8)) & -8)));
        var32 = (var15 + 28);
        var33 = (var8 << 2);
        var38 = 0;
        ret = 0;
        var39 = (unsigned long)((unsigned int)(arg0));
        do {
            var40 = var39;
            if (((((unsigned long)((unsigned int)(arg1)) == 0) | ((long)(arg1) < 0)) == 0)) {
                column = 0;
                var43 = ret;
                var44 = 0;
                if (((unsigned long)(7) <= (unsigned long)(var25))) {
                    var45 = ret;
                    do {
                        var60 = ((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var45 + *(int *)((var32 + column * 4 - 0x1c))))) + *(int *)((var32 + column * 4 - 0x18))))) + *(int *)((var32 + column * 4 - 0x14))))) + *(int *)((var32 + column * 4 - 0x10))))) + *(int *)((var32 + column * 4 - 0xc))))) + *(int *)((var32 + column * 4 - 0x8))))) + *(int *)((var32 + column * 4 - 0x4)))) + *(int *)((var32 + column * 4)));
                        var45 = (unsigned long)((unsigned int)(var60));
                        column = (column + 8);
                        var43 = (unsigned long)((unsigned int)(var60));
                        var44 = (unsigned long)((unsigned int)(column));
                    } while ((var31 != column));
                }
                ret = var43;
                var40 = var39;
                var17 = var44;
                if ((var28 != 0)) {
                    var17 = (var15 + (var44 * 4));
                    var40 = 0;
                    do {
                        var43 = (unsigned long)((unsigned int)((var43 + *(int *)((var17 + var40 * 4)))));
                        var40 = (var40 + 1);
                    } while ((var28 != var40));
                    ret = var43;
                }
            }
            row = (var38 + 1);
            var32 = (var32 + var33);
            var15 = (var15 + var33);
            var38 = (unsigned long)((unsigned int)(row));
            var39 = var40;
        } while ((row != var7));
        // x86-64 epilogue: restore rbp
    }
    return ret;
}

gcc -O0

0/2
vla_reverse_sum fail 49 lines
// glaurung: vla_reverse_sum @ 0x1119
int32_t vla_reverse_sum(const int32_t * arg0, int32_t arg1) {
    extern __attribute__((noreturn)) void __stack_chk_fail(void);
    int total;
    int index;
    long local_18;
    long local_20;
    long local_28;
    long ret;
    long rsp;
    long var23;
    long var27;
    long var37;
    long var4;
    // x86-64 prologue: save rbp, frame 8 bytes
    rsp = (rsp - 56);
    local_18 = (long)(0x28);
    if ((((arg0 == 0) || (((unsigned long)((unsigned int)(arg1)) == 0) | ((long)(arg1) < 0))) || (((unsigned long)((unsigned int)(arg1)) != 16) && (16 <= (long)(arg1))))) {
        ret = 0xffffffff;
    } else {
        var4 = rsp;
        local_28 = ((long)(arg1) - 1);
        var23 = (((unsigned long)(((((unsigned __int128)(unsigned long)(0) << 64) | (unsigned long)(((16 - 1) + (0 + ((long)((int)((unsigned long)((unsigned int)(arg1)))) * 4))))) / (unsigned long)(16)))) * 16);
        var27 = (rsp - (var23 & -4096));
        while ((rsp != var27)) {
            rsp = (rsp - 4096);
        }
        rsp = (rsp - (unsigned long)((unsigned int)((var23 & 4095))));
        if (((unsigned long)((unsigned int)((var23 & 4095))) != 0)) {
            var37 = (((unsigned long)((unsigned int)((var23 & 4095))) - 8) + rsp);
            *(long *)((var37)) = *(long *)((var37));
        }
        local_20 = (((unsigned long)((rsp + 3)) >> 2) << 2);
        total = 0;
        for (index = 0; (index < arg1); index++) {
            *(int *)((local_20 + ((long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) - 1))) - index))) * 4))) = arg0[(long)(index)];
        }
        for (index = 0; (index < arg1); index++) {
            total = (total + (unsigned int)(((unsigned long)((unsigned int)(*(int *)((local_20 + ((long)(index) * 4))))) * (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) + 1))))));
        }
        ret = (unsigned long)((unsigned int)(total));
        rsp = var4;
    }
    if ((local_18 != 0x28)) {
        __stack_chk_fail();
    }
    // x86-64 epilogue: restore rbp
    return ret;
}
vla_two_dimensional fail 72 lines
// glaurung: vla_two_dimensional @ 0x12a2
int32_t vla_two_dimensional(int32_t arg0, int32_t arg1) {
    extern __attribute__((noreturn)) void __stack_chk_fail(void);
    int total;
    int row;
    int column;
    long local_38;
    long local_40;
    long local_48;
    long local_50;
    long local_78;
    long local_80;
    long rbp;
    long ret;
    long rsp;
    long var11;
    long var4;
    long var56;
    long var60;
    long var70;
    // x86-64 prologue: save rbp, frame 8 bytes
    rsp = (rsp - 8);
    rsp = (rsp - 8);
    rsp = (rsp - 8);
    rsp = (rsp - 8);
    rsp = (rsp - 88);
    local_38 = (long)(0x28);
    if (((((((unsigned long)((unsigned int)(arg0)) == 0) | ((long)(arg0) < 0)) || ((((unsigned long)((unsigned int)(arg0)) == 4) | ((long)(arg0) < 4)) == 0)) || (((unsigned long)((unsigned int)(arg1)) == 0) | ((long)(arg1) < 0))) || (((unsigned long)((unsigned int)(arg1)) != 4) && (4 <= (long)(arg1))))) {
        ret = 0xffffffff;
    } else {
        var4 = rsp;
        local_50 = ((long)(arg1) - 1);
        local_80 = arg1;
        local_78 = 0;
        var11 = ((long)(arg1) << 2);
        local_48 = ((long)(arg0) - 1);
        var56 = (((unsigned long)(((((unsigned __int128)(unsigned long)(0) << 64) | (unsigned long)(((16 - 1) + (0 + (((long)((int)((unsigned long)((unsigned int)(arg0)))) * (long)((int)((unsigned long)((unsigned int)(arg1))))) * 4))))) / (unsigned long)(16)))) * 16);
        var60 = (rsp - (var56 & -4096));
        while ((rsp != var60)) {
            rsp = (rsp - 4096);
        }
        rsp = (rsp - (unsigned long)((unsigned int)((var56 & 4095))));
        if (((unsigned long)((unsigned int)((var56 & 4095))) != 0)) {
            var70 = (((unsigned long)((unsigned int)((var56 & 4095))) - 8) + rsp);
            *(long *)((var70)) = *(long *)((var70));
        }
        local_40 = (((unsigned long)((rsp + 3)) >> 2) << 2);
        total = 0;
        row = 0;
        while ((row < arg0)) {
            for (column = 0; (column < arg1); column++) {
                *(int *)((local_40 + ((((long)(row) * ((unsigned long)(var11) >> 2)) + (long)(column)) * 4))) = ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * arg1))) + (unsigned long)((unsigned int)(column)));
            }
            row = (row + 1);
        }
        row = 0;
        while ((row < arg0)) {
            for (column = 0; (column < arg1); column++) {
                total = (total + (unsigned int)(*(int *)((local_40 + ((((long)(row) * ((unsigned long)(var11) >> 2)) + (long)(column)) * 4)))));
            }
            row = (row + 1);
        }
        ret = (unsigned long)((unsigned int)(total));
        rsp = var4;
    }
    if ((local_38 != 0x28)) {
        __stack_chk_fail();
    }
    rsp = (rbp - 40);
    // x86-64 epilogue: restore rbp
    return ret;
}

gcc -O2

0/2
vla_reverse_sum fail 86 lines
// glaurung: vla_reverse_sum @ 0x1120
int32_t vla_reverse_sum(const int32_t * arg0, int32_t arg1) {
    extern __attribute__((noreturn)) void __stack_chk_fail(void);
    int index;
    int total;
    long local_8;
    long rsp;
    unsigned char stack_0[8];
    long var12;
    long var13;
    long var15;
    long var16;
    long var19;
    long var20;
    long var21;
    long var26;
    long var27;
    long var28;
    int var29;
    long var34;
    long var4;
    long var7;
    long var8;
    long var9;
    rsp = (rsp - 8);
    rsp = (rsp - 16);
    local_8 = (long)(0x28);
    if (((unsigned long)(15) < (unsigned long)((unsigned long)((unsigned int)((arg1 - 1)))))) {
        goto L_1200;
    }
    var4 = (long)arg0;
    if ((arg0 == 0)) {
        goto L_1200;
    }
    var7 = rsp;
    var8 = ((long)(arg1) << 2);
    var9 = (var8 + 15);
    var12 = (rsp - (var9 & -4096));
    var13 = (var9 & -16);
    if ((rsp != var12)) {
        while ((rsp != var12)) {
            rsp = (rsp - 4096);
        }
    }
    var15 = (unsigned long)((unsigned int)((var13 & 4095)));
    rsp = (rsp - var15);
    if ((var15 != 0)) {
        goto L_11f8;
    }
    L_119c: ;
    var16 = rsp;
    index = 0;
    var19 = (var8 + rsp);
    do {
        var20 = (unsigned long)((unsigned int)(*(int *)((var4 + index * 4))));
        index = (index + 1);
        var19 = (var19 - 4);
        *(int *)((var19)) = var20;
    } while (((((unsigned int)(arg1) == (unsigned int)(index)) | (arg1 < index)) == 0));
    var21 = var16;
    var26 = 0;
    var27 = 0;
    do {
        var28 = (unsigned long)((unsigned int)(*(int *)((var21))));
        var29 = (var27 + 1);
        var21 = (var21 + 4);
        var26 = (unsigned long)((unsigned int)((var26 + (unsigned long)((unsigned int)((var28 * (unsigned long)((unsigned int)(var29))))))));
        var27 = (unsigned long)((unsigned int)(var29));
    } while ((var29 < arg1));
    rsp = var7;
    var34 = var26;
    L_11de: ;
    if ((local_8 != 0x28)) {
        goto L_1208;
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(var34);
    L_11f8: ;
    *(long *)((&stack_0[0] + var15)) = *(long *)((&stack_0[0] + var15));
    goto L_119c;
    L_1200: ;
    var34 = 0xffffffff;
    goto L_11de;
    L_1208: ;
    __stack_chk_fail();
}
vla_two_dimensional fail 113 lines
// glaurung: vla_two_dimensional @ 0x1210
int32_t vla_two_dimensional(int32_t arg0, int32_t arg1) {
    extern __attribute__((noreturn)) void __stack_chk_fail(void);
    int row;
    int column;
    int total;
    long local_18;
    long rbp;
    long rsp;
    unsigned char stack_0[8];
    long var10;
    long var11;
    long var13;
    long var16;
    long var17;
    long var19;
    long var20;
    long var21;
    long var23;
    long var25;
    long var26;
    long var27;
    long var28;
    int var29;
    long var38;
    long var39;
    long var46;
    long var5;
    long var9;
    rsp = (rsp - 8);
    rbp = rsp;
    rsp = (rsp - 8);
    rsp = (rsp - 8);
    rsp = (rsp - 16);
    local_18 = (long)(0x28);
    if (((unsigned long)(3) < (unsigned long)((unsigned long)((unsigned int)((arg0 - 1)))))) {
        goto L_1331;
    }
    var5 = (unsigned long)((unsigned int)(arg1));
    if (((unsigned long)(3) < (unsigned long)((unsigned long)((unsigned int)((arg1 - 1)))))) {
        goto L_1331;
    }
    var9 = (unsigned long)((unsigned int)(arg0));
    var10 = ((long)(arg1) << 2);
    var11 = rsp;
    var13 = (((long)(arg0) * var10) + 15);
    var16 = (rsp - (var13 & -4096));
    var17 = (var13 & -16);
    if ((rsp != var16)) {
        while ((rsp != var16)) {
            rsp = (rsp - 4096);
        }
    }
    var19 = (unsigned long)((unsigned int)((var17 & 4095)));
    rsp = (rsp - var19);
    if ((var19 != 0)) {
        goto L_1326;
    }
    L_129f: ;
    var20 = rsp;
    var21 = (unsigned long)((unsigned int)(var5));
    var23 = 0;
    var25 = 0;
    var26 = rsp;
    L_12b0: ;
    var27 = var26;
    var28 = (unsigned long)((unsigned int)(var23));
    do {
        *(int *)((var27)) = var28;
        var29 = (var28 + 1);
        var28 = (unsigned long)((unsigned int)(var29));
        var27 = (var27 + 4);
    } while (((unsigned int)(var29) != (unsigned int)(var21)));
    row = (unsigned long)((unsigned int)((var25 + 1)));
    var23 = (unsigned long)((unsigned int)((var23 + var5)));
    var26 = (var26 + var10);
    var21 = (unsigned long)((unsigned int)((var21 + var5)));
    if (((unsigned int)(var9) != (unsigned int)(row))) {
        var25 = (unsigned long)((unsigned int)(row));
        goto L_12b0;
    }
    var38 = 0;
    var39 = 0;
    L_12e5: ;
    column = 0;
    do {
        var38 = (unsigned long)((unsigned int)((var38 + *(int *)((var20 + column * 4)))));
        column = (column + 1);
    } while (((((unsigned int)(var5) == (unsigned int)(column)) | ((long)((int)(var5)) < (long)(column))) == 0));
    row = (unsigned long)((unsigned int)((var39 + 1)));
    var20 = (var20 + var10);
    if (((unsigned int)(var25) != (unsigned int)(var39))) {
        var39 = (unsigned long)((unsigned int)(row));
        goto L_12e5;
    }
    rsp = var11;
    var46 = var38;
    L_130b: ;
    if ((local_18 != 0x28)) {
        goto L_1339;
    }
    rsp = (rbp - 16);
    // x86-64 epilogue: restore rbp
    return (unsigned int)(var46);
    L_1326: ;
    *(long *)((&stack_0[0] + var19)) = *(long *)((&stack_0[0] + var19));
    goto L_129f;
    L_1331: ;
    var46 = 0xffffffff;
    goto L_130b;
    L_1339: ;
    __stack_chk_fail();
}

← 213 fixtures