Fixture 54

sha256 block

C · 1 functions · 4 lanes · 0 of 4 function-lanes behave identically

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

One SHA-256 compression over a single 512-bit block. A 64-entry constant table in read-only data, a message schedule with four rotations per step, and eight rotating working registers: this is the densest constant-and- rotation recovery case in the corpus.

tests/decompiler_fixtures/src/54_sha256_block.c source
#include <stdint.h>

/* One SHA-256 compression over a single 512-bit block.  A 64-entry constant
 * table in read-only data, a message schedule with four rotations per step,
 * and eight rotating working registers: this is the densest constant-and-
 * rotation recovery case in the corpus. */

static const uint32_t SHA256_K[64] = {
    0x428A2F98u, 0x71374491u, 0xB5C0FBCFu, 0xE9B5DBA5u, 0x3956C25Bu,
    0x59F111F1u, 0x923F82A4u, 0xAB1C5ED5u, 0xD807AA98u, 0x12835B01u,
    0x243185BEu, 0x550C7DC3u, 0x72BE5D74u, 0x80DEB1FEu, 0x9BDC06A7u,
    0xC19BF174u, 0xE49B69C1u, 0xEFBE4786u, 0x0FC19DC6u, 0x240CA1CCu,
    0x2DE92C6Fu, 0x4A7484AAu, 0x5CB0A9DCu, 0x76F988DAu, 0x983E5152u,
    0xA831C66Du, 0xB00327C8u, 0xBF597FC7u, 0xC6E00BF3u, 0xD5A79147u,
    0x06CA6351u, 0x14292967u, 0x27B70A85u, 0x2E1B2138u, 0x4D2C6DFCu,
    0x53380D13u, 0x650A7354u, 0x766A0ABBu, 0x81C2C92Eu, 0x92722C85u,
    0xA2BFE8A1u, 0xA81A664Bu, 0xC24B8B70u, 0xC76C51A3u, 0xD192E819u,
    0xD6990624u, 0xF40E3585u, 0x106AA070u, 0x19A4C116u, 0x1E376C08u,
    0x2748774Cu, 0x34B0BCB5u, 0x391C0CB3u, 0x4ED8AA4Au, 0x5B9CCA4Fu,
    0x682E6FF3u, 0x748F82EEu, 0x78A5636Fu, 0x84C87814u, 0x8CC70208u,
    0x90BEFFFAu, 0xA4506CEBu, 0xBEF9A3F7u, 0xC67178F2u};

static uint32_t rotate_right(uint32_t value, uint32_t amount) {
    return (value >> amount) | (value << (32u - amount));
}

__attribute__((noinline)) uint32_t
sha256_compress_block(const uint32_t *block, uint32_t *state_out) {
    uint32_t schedule[64];
    uint32_t a, b, c, d, e, f, g, h;
    int32_t step;
    if (block == 0 || state_out == 0) {
        return 0;
    }
    for (step = 0; step < 16; ++step) {
        schedule[step] = block[step];
    }
    for (step = 16; step < 64; ++step) {
        uint32_t s0 = rotate_right(schedule[step - 15], 7) ^
                      rotate_right(schedule[step - 15], 18) ^
                      (schedule[step - 15] >> 3);
        uint32_t s1 = rotate_right(schedule[step - 2], 17) ^
                      rotate_right(schedule[step - 2], 19) ^
                      (schedule[step - 2] >> 10);
        schedule[step] = schedule[step - 16] + s0 + schedule[step - 7] + s1;
    }
    a = 0x6A09E667u;
    b = 0xBB67AE85u;
    c = 0x3C6EF372u;
    d = 0xA54FF53Au;
    e = 0x510E527Fu;
    f = 0x9B05688Cu;
    g = 0x1F83D9ABu;
    h = 0x5BE0CD19u;
    for (step = 0; step < 64; ++step) {
        uint32_t big1 = rotate_right(e, 6) ^ rotate_right(e, 11) ^
                        rotate_right(e, 25);
        uint32_t choose = (e & f) ^ ((~e) & g);
        uint32_t temp1 = h + big1 + choose + SHA256_K[step] + schedule[step];
        uint32_t big0 = rotate_right(a, 2) ^ rotate_right(a, 13) ^
                        rotate_right(a, 22);
        uint32_t majority = (a & b) ^ (a & c) ^ (b & c);
        uint32_t temp2 = big0 + majority;
        h = g;
        g = f;
        f = e;
        e = d + temp1;
        d = c;
        c = b;
        b = a;
        a = temp1 + temp2;
    }
    state_out[0] = 0x6A09E667u + a;
    state_out[1] = 0xBB67AE85u + b;
    state_out[2] = 0x3C6EF372u + c;
    state_out[3] = 0xA54FF53Au + d;
    state_out[4] = 0x510E527Fu + e;
    state_out[5] = 0x9B05688Cu + f;
    state_out[6] = 0x1F83D9ABu + g;
    state_out[7] = 0x5BE0CD19u + h;
    return state_out[0] ^ state_out[7];
}

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/1
sha256_compress_block fail 107 lines
// glaurung: sha256_compress_block @ 0x1100
__attribute__((no_stack_protector)) uint32_t sha256_compress_block(const uint32_t * arg0, uint32_t * arg1) {
    extern unsigned int rotate_right(unsigned int, unsigned int);
    int step;
    unsigned int s0;
    unsigned int s1;
    unsigned int a;
    unsigned int b;
    unsigned int c;
    unsigned int d;
    unsigned int e;
    unsigned int f;
    unsigned int g;
    unsigned int h;
    unsigned int big1;
    unsigned int choose;
    unsigned int temp1;
    unsigned int big0;
    unsigned int majority;
    unsigned int temp2;
    unsigned char local_120[256];
    int local_168;
    int local_16c;
    int local_170;
    int local_174;
    int local_178;
    int local_17c;
    int local_4;
    unsigned int var120;
    unsigned int var122;
    unsigned int var128;
    unsigned int var14;
    unsigned int var20;
    unsigned int var40;
    unsigned int var46;
    unsigned int var84;
    unsigned int var86;
    unsigned int var92;
    // x86-64 prologue: save rbp, frame 384 bytes
    if ((arg0 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0;
    }
    if ((arg1 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0;
    }
    for (step = 0; ((long)(step) < 16); step++) {
        *(int *)((&local_120[0] + ((long)(step) * 4))) = arg0[(long)(step)];
    }
    for (step = 16; ((long)(step) < 64); step++) {
        var14 = rotate_right((unsigned long)((unsigned int)(*(int *)((&local_120[0] + ((long)((int)(((unsigned long)((unsigned int)(step)) - 15))) * 4))))), 7);
        local_16c = var14;
        var20 = rotate_right((unsigned long)((unsigned int)(*(int *)((&local_120[0] + ((long)((int)(((unsigned long)((unsigned int)(step)) - 15))) * 4))))), 18);
        s0 = ((unsigned int)(((unsigned long)((unsigned int)(local_16c)) ^ var20)) ^ (unsigned int)(((unsigned long)((unsigned int)(*(int *)((&local_120[0] + ((long)((int)(((unsigned long)((unsigned int)(step)) - 15))) * 4))))) >> 3)));
        var40 = rotate_right((unsigned long)((unsigned int)(*(int *)((&local_120[0] + ((long)((int)(((unsigned long)((unsigned int)(step)) - 2))) * 4))))), 17);
        local_168 = var40;
        var46 = rotate_right((unsigned long)((unsigned int)(*(int *)((&local_120[0] + ((long)((int)(((unsigned long)((unsigned int)(step)) - 2))) * 4))))), 19);
        s1 = ((unsigned int)(((unsigned long)((unsigned int)(local_168)) ^ var46)) ^ (unsigned int)(((unsigned long)((unsigned int)(*(int *)((&local_120[0] + ((long)((int)(((unsigned long)((unsigned int)(step)) - 2))) * 4))))) >> 10)));
        *(int *)((&local_120[0] + ((long)(step) * 4))) = ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((&local_120[0] + ((long)((int)(((unsigned long)((unsigned int)(step)) - 16))) * 4))))) + s0))) + *(int *)((&local_120[0] + ((long)((int)(((unsigned long)((unsigned int)(step)) - 7))) * 4)))))) + s1);
    }
    a = 0x6a09e667;
    b = -0x4498517bLL;
    c = 0x3c6ef372;
    d = -0x5ab00ac6LL;
    e = 0x510e527f;
    f = -0x64fa9774LL;
    g = 0x1f83d9ab;
    h = 0x5be0cd19;
    for (step = 0; ((long)(step) < 64); step++) {
        var84 = rotate_right(e, 6);
        local_17c = var84;
        var86 = rotate_right(e, 11);
        local_178 = ((unsigned int)(local_17c) ^ var86);
        var92 = rotate_right(e, 25);
        big1 = ((unsigned int)(local_178) ^ var92);
        choose = ((unsigned int)((e & f)) ^ (unsigned int)(((unsigned long)((unsigned int)((e ^ -1))) & g)));
        temp1 = ((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((h + big1))) + choose))) + *(int *)((0x2000 + ((long)(step) * 4))))) + *(int *)((&local_120[0] + ((long)(step) * 4))));
        var120 = rotate_right(a, 2);
        local_174 = var120;
        var122 = rotate_right(a, 13);
        local_170 = ((unsigned int)(local_174) ^ var122);
        var128 = rotate_right(a, 22);
        big0 = ((unsigned int)(local_170) ^ var128);
        majority = ((unsigned int)(((unsigned long)((unsigned int)((a & b))) ^ (unsigned long)((unsigned int)((a & c))))) ^ (unsigned int)((b & c)));
        temp2 = (big0 + majority);
        h = g;
        g = f;
        f = e;
        e = (d + temp1);
        d = c;
        c = b;
        b = a;
        a = (temp1 + temp2);
    }
    *(int *)((long)arg1) = (a + 0x6a09e667);
    *(int *)(((long)arg1 + 0x4)) = (b - 0x4498517b);
    *(int *)(((long)arg1 + 0x8)) = (c + 0x3c6ef372);
    *(int *)(((long)arg1 + 0xc)) = (d - 0x5ab00ac6);
    *(int *)(((long)arg1 + 0x10)) = (e + 0x510e527f);
    *(int *)(((long)arg1 + 0x14)) = (f - 0x64fa9774);
    *(int *)(((long)arg1 + 0x18)) = (g + 0x1f83d9ab);
    *(int *)(((long)arg1 + 0x1c)) = (h + 0x5be0cd19);
    local_4 = ((unsigned int)(*(int *)((long)arg1)) ^ *(int *)(((long)arg1 + 0x1c)));
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}

clang -O2

0/1
sha256_compress_block fail 161 lines
// glaurung: sha256_compress_block @ 0x1100
__attribute__((no_stack_protector)) uint32_t sha256_compress_block(const uint32_t * arg0, uint32_t * arg1) {
    int step;
    unsigned int h;
    unsigned int a;
    unsigned int b;
    unsigned int big0;
    unsigned int big1;
    unsigned int c;
    unsigned int d;
    unsigned int e;
    unsigned int f;
    unsigned int g;
    unsigned int majority;
    unsigned int s0;
    unsigned int s1;
    unsigned int temp1;
    unsigned int temp2;
    unsigned char local_134[308];
    unsigned char local_138[4];
    unsigned char local_140[8];
    unsigned char local_154[20];
    unsigned char local_174[32];
    long rbp;
    long ret;
    long var1;
    int var10;
    int var106;
    int var11;
    int var12;
    int var13;
    long var132;
    int var133;
    long var135;
    int var14;
    int var15;
    int var16;
    int var17;
    unsigned char var18[16] __attribute__((aligned(16)));
    long var2;
    long var20;
    long var21;
    long var23;
    long var26;
    long var3;
    long var4;
    long var5;
    long var63;
    long var64;
    long var65;
    long var66;
    long var67;
    long var68;
    long var69;
    int var7;
    long var70;
    long var71;
    long var72;
    long var74;
    long var75;
    long var76;
    int var8;
    long var80;
    long var81;
    long var82;
    int var9;
    ret = 0;
    if ((arg0 == 0)) {
        return ret;
    }
    if ((arg1 == 0)) {
        return ret;
    }
    *(long *)((&local_134[0] + 300)) = rbp;
    *(long *)((&local_134[0] + 292)) = var1;
    *(long *)((&local_134[0] + 284)) = var2;
    *(long *)((&local_134[0] + 276)) = var3;
    *(long *)((&local_134[0] + 268)) = var4;
    *(long *)((&local_134[0] + 260)) = var5;
    var7 = *(int *)(((long)arg0 + 0x4));
    var8 = *(int *)(((long)arg0 + 0x8));
    var9 = *(int *)(((long)arg0 + 0xc));
    var10 = *(int *)(((long)arg0 + 0x10));
    var11 = *(int *)(((long)arg0 + 0x14));
    var12 = *(int *)(((long)arg0 + 0x18));
    var13 = *(int *)(((long)arg0 + 0x1c));
    var14 = *(int *)(((long)arg0 + 0x20));
    var15 = *(int *)(((long)arg0 + 0x24));
    var16 = *(int *)(((long)arg0 + 0x28));
    var17 = *(int *)(((long)arg0 + 0x2c));
    __builtin_memcpy(var18, (void *)(((long)arg0 + 0x30)), 16);
    *(int *)(&local_138[0]) = *(int *)(((long)arg0));
    *(int *)(&local_134[0]) = var7;
    *(int *)((&local_134[0] + 4)) = var8;
    *(int *)((&local_134[0] + 8)) = var9;
    __builtin_memmove((void *)((&local_134[0] + 44)), var18, 16);
    *(int *)((&local_134[0] + 28)) = var14;
    *(int *)((&local_134[0] + 32)) = var15;
    *(int *)((&local_134[0] + 36)) = var16;
    *(int *)((&local_134[0] + 40)) = var17;
    *(int *)((&local_134[0] + 12)) = var10;
    *(int *)((&local_134[0] + 16)) = var11;
    *(int *)((&local_134[0] + 20)) = var12;
    *(int *)((&local_134[0] + 24)) = var13;
    var20 = (unsigned long)((unsigned int)(*(int *)(&local_138[0])));
    var21 = (unsigned long)((unsigned int)(var20));
    step = 16;
    do {
        var23 = (unsigned long)((unsigned int)(*(int *)((&local_174[0] + (step * 4)))));
        var26 = (unsigned long)((unsigned int)(*(int *)((&local_140[0] + (step * 4)))));
        *(int *)((&local_138[0] + (step * 4))) = ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var23)) >> 3))) ^ (unsigned long)((unsigned int)(((((unsigned long)((unsigned int)(var23)) << 14) | ((unsigned long)((unsigned int)(var23)) >> 18)) ^ (((unsigned long)((unsigned int)(var23)) << 25) | ((unsigned long)((unsigned int)(var23)) >> 7)))))))) + var21))) + *(int *)((&local_154[0] + (step * 4)))))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var26)) >> 10))) ^ (unsigned long)((unsigned int)(((((unsigned long)((unsigned int)(var26)) << 13) | ((unsigned long)((unsigned int)(var26)) >> 19)) ^ (((unsigned long)((unsigned int)(var26)) << 15) | ((unsigned long)((unsigned int)(var26)) >> 17)))))))));
        step = (step + 1);
        var21 = (unsigned long)((unsigned int)(var23));
    } while ((step != 64));
    var63 = 0;
    var64 = (long)(0x2000);
    var65 = 0x3c6ef372;
    var66 = 0xbb67ae85;
    var67 = 0x9b05688c;
    var68 = 0xa54ff53a;
    var69 = 0x1f83d9ab;
    var70 = 0x5be0cd19;
    var71 = 0x6a09e667;
    var72 = 0x510e527f;
    while (1) {
        var74 = (unsigned long)((unsigned int)(var69));
        var75 = (unsigned long)((unsigned int)(var67));
        var76 = (unsigned long)((unsigned int)(var72));
        var80 = (unsigned long)((unsigned int)(var65));
        var81 = (unsigned long)((unsigned int)(var66));
        var82 = (unsigned long)((unsigned int)(var71));
        var106 = ((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((~(unsigned long)((unsigned int)(var72))) & (unsigned long)((unsigned int)(var69))))) + (unsigned long)((unsigned int)(var70))))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var72)) & (unsigned long)((unsigned int)(var67)))))))) + (unsigned long)((unsigned int)(((((unsigned long)((unsigned int)(var72)) << 7) | ((unsigned long)((unsigned int)(var72)) >> 25)) ^ (unsigned long)((unsigned int)(((((unsigned long)((unsigned int)(var72)) << 21) | ((unsigned long)((unsigned int)(var72)) >> 11)) ^ (((unsigned long)((unsigned int)(var72)) << 26) | ((unsigned long)((unsigned int)(var72)) >> 6))))))))))) + *(int *)((var63 + var64)))) + var20);
        var72 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var68)) + (unsigned long)((unsigned int)(var106)))));
        var132 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var66)) & (unsigned long)((unsigned int)(var65))))) ^ (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var66)) ^ (unsigned long)((unsigned int)(var65))))) & (unsigned long)((unsigned int)(var71)))))))) + (unsigned long)((unsigned int)(((((unsigned long)((unsigned int)(var71)) << 10) | ((unsigned long)((unsigned int)(var71)) >> 22)) ^ (unsigned long)((unsigned int)(((((unsigned long)((unsigned int)(var71)) << 19) | ((unsigned long)((unsigned int)(var71)) >> 13)) ^ (((unsigned long)((unsigned int)(var71)) << 30) | ((unsigned long)((unsigned int)(var71)) >> 2))))))))))) + (unsigned long)((unsigned int)(var106)))));
        if ((var63 == 252)) {
            break;
        }
        var20 = (unsigned long)((unsigned int)(*(int *)((&local_134[0] + var63))));
        var63 = (var63 + 4);
        var65 = var81;
        var66 = var82;
        var67 = var76;
        var68 = var80;
        var69 = var75;
        var70 = var74;
        var71 = var132;
    }
    var133 = (var132 + 0x6a09e667);
    var135 = (long)arg1;
    *(int *)((long)arg1) = var133;
    *(int *)((var135 + 0x4)) = (var82 - 0x4498517b);
    *(int *)((var135 + 0x8)) = (var81 + 0x3c6ef372);
    *(int *)((var135 + 0xc)) = (var80 - 0x5ab00ac6);
    *(int *)((var135 + 0x10)) = (var72 + 0x510e527f);
    *(int *)((var135 + 0x14)) = (var76 - 0x64fa9774);
    *(int *)((var135 + 0x18)) = (var75 + 0x1f83d9ab);
    h = (var74 + 0x5be0cd19);
    *(int *)((var135 + 0x1c)) = h;
    // x86-64 epilogue: tear down frame
    return (unsigned int)(((unsigned long)(h) ^ (unsigned long)((unsigned int)(var133))));
}

gcc -O0

0/1
sha256_compress_block fail 109 lines
// glaurung: sha256_compress_block @ 0x1135
uint32_t sha256_compress_block(const uint32_t * arg0, uint32_t * arg1) {
    extern __attribute__((noreturn)) void __stack_chk_fail(void);
    extern unsigned int rotate_right(unsigned int, unsigned int);
    int step;
    unsigned int s0;
    unsigned int s1;
    unsigned int a;
    unsigned int b;
    unsigned int c;
    unsigned int d;
    unsigned int e;
    unsigned int f;
    unsigned int g;
    unsigned int h;
    unsigned int big1;
    unsigned int choose;
    unsigned int temp1;
    unsigned int big0;
    unsigned int majority;
    unsigned int temp2;
    unsigned char local_120[256];
    long local_18;
    long ret;
    long var101;
    unsigned int var103;
    unsigned int var135;
    long var137;
    unsigned int var139;
    long var142;
    unsigned int var144;
    unsigned int var19;
    long var21;
    unsigned int var27;
    unsigned int var47;
    long var49;
    unsigned int var55;
    unsigned int var94;
    long var96;
    unsigned int var98;
    // x86-64 prologue: save rbp, frame 8 bytes
    local_18 = (long)(0x28);
    if (((arg0 == 0) || (arg1 == 0))) {
        ret = 0;
    } else {
        for (step = 0; ((((unsigned long)((unsigned int)(step)) == 15) | ((long)(step) < 15)) != 0); step++) {
            *(int *)((&local_120[0] + ((long)(step) * 4))) = arg0[(long)(step)];
        }
        for (step = 16; ((((unsigned long)((unsigned int)(step)) == 63) | ((long)(step) < 63)) != 0); step++) {
            var19 = rotate_right((unsigned long)((unsigned int)(*(int *)((&local_120[0] + ((long)((int)(((unsigned long)((unsigned int)(step)) - 15))) * 4))))), 7);
            var21 = (unsigned long)(var19);
            var27 = rotate_right((unsigned long)((unsigned int)(*(int *)((&local_120[0] + ((long)((int)(((unsigned long)((unsigned int)(step)) - 15))) * 4))))), 18);
            s0 = ((unsigned int)(((unsigned long)((unsigned int)(*(int *)((&local_120[0] + ((long)((int)(((unsigned long)((unsigned int)(step)) - 15))) * 4))))) >> 3)) ^ (unsigned int)((var21 ^ var27)));
            var47 = rotate_right((unsigned long)((unsigned int)(*(int *)((&local_120[0] + ((long)((int)(((unsigned long)((unsigned int)(step)) - 2))) * 4))))), 17);
            var49 = (unsigned long)(var47);
            var55 = rotate_right((unsigned long)((unsigned int)(*(int *)((&local_120[0] + ((long)((int)(((unsigned long)((unsigned int)(step)) - 2))) * 4))))), 19);
            s1 = ((unsigned int)(((unsigned long)((unsigned int)(*(int *)((&local_120[0] + ((long)((int)(((unsigned long)((unsigned int)(step)) - 2))) * 4))))) >> 10)) ^ (unsigned int)((var49 ^ var55)));
            *(int *)((&local_120[0] + ((long)(step) * 4))) = ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((&local_120[0] + ((long)((int)(((unsigned long)((unsigned int)(step)) - 16))) * 4))))) + s0))) + (unsigned long)((unsigned int)(*(int *)((&local_120[0] + ((long)((int)(((unsigned long)((unsigned int)(step)) - 7))) * 4)))))))) + s1);
        }
        a = 0x6a09e667;
        b = -0x4498517bLL;
        c = 0x3c6ef372;
        d = -0x5ab00ac6LL;
        e = 0x510e527f;
        f = -0x64fa9774LL;
        g = 0x1f83d9ab;
        h = 0x5be0cd19;
        for (step = 0; ((((unsigned long)((unsigned int)(step)) == 63) | ((long)(step) < 63)) != 0); step++) {
            var94 = rotate_right(e, 6);
            var96 = (unsigned long)(var94);
            var98 = rotate_right(e, 11);
            var101 = (unsigned long)((unsigned int)((var96 ^ var98)));
            var103 = rotate_right(e, 25);
            big1 = (var103 ^ var101);
            choose = ((unsigned int)(((~e) & g)) ^ (unsigned int)((e & f)));
            temp1 = ((unsigned int)(*(int *)((&local_120[0] + ((long)(step) * 4)))) + (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((h + big1))) + choose))) + (unsigned long)((unsigned int)(*(int *)((((long)(step) * 4) + 0x2000)))))));
            var135 = rotate_right(a, 2);
            var137 = (unsigned long)(var135);
            var139 = rotate_right(a, 13);
            var142 = (unsigned long)((unsigned int)((var137 ^ var139)));
            var144 = rotate_right(a, 22);
            big0 = (var144 ^ var142);
            majority = ((unsigned int)((b & c)) ^ (unsigned int)(((unsigned long)((unsigned int)((b ^ c))) & a)));
            temp2 = (majority + big0);
            h = g;
            g = f;
            f = e;
            e = (temp1 + d);
            d = c;
            c = b;
            b = a;
            a = (temp2 + temp1);
        }
        *(int *)((long)arg1) = (a + 0x6a09e667);
        *(int *)((arg1 + 1)) = (b - 0x4498517b);
        *(int *)((arg1 + 2)) = (c + 0x3c6ef372);
        *(int *)((arg1 + 3)) = (d - 0x5ab00ac6);
        *(int *)((arg1 + 4)) = (e + 0x510e527f);
        *(int *)((arg1 + 5)) = (f - 0x64fa9774);
        *(int *)((arg1 + 6)) = (g + 0x1f83d9ab);
        *(int *)((arg1 + 7)) = (h + 0x5be0cd19);
        ret = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((arg1 + 7)))) ^ (unsigned long)((unsigned int)(*(int *)((long)arg1))))));
    }
    if ((local_18 != 0x28)) {
        __stack_chk_fail();
    }
    // x86-64 epilogue: restore rbp
    return ret;
}

gcc -O2

0/1
sha256_compress_block fail 149 lines
// glaurung: sha256_compress_block @ 0x1120
uint32_t sha256_compress_block(const uint32_t * arg0, uint32_t * arg1) {
    extern __attribute__((noreturn)) void __stack_chk_fail(void);
    unsigned int e;
    unsigned int a;
    unsigned int big0;
    unsigned int big1;
    unsigned int c;
    unsigned int choose;
    unsigned int d;
    unsigned int g;
    unsigned int h;
    unsigned int majority;
    unsigned int s0;
    unsigned int s1;
    unsigned int temp1;
    unsigned int temp2;
    unsigned char local_148[256];
    long local_40;
    long ret;
    int var10;
    int var104;
    int var11;
    long var113;
    long var127;
    long var128;
    long var129;
    int var13;
    long var133;
    int var14;
    long var146;
    int var15;
    int var16;
    int var17;
    int var18;
    int var19;
    int var20;
    long var21;
    long var22;
    long var23;
    long var24;
    int var5;
    long var56;
    long var57;
    int var6;
    long var66;
    long var67;
    long var68;
    long var69;
    int var7;
    long var70;
    long var71;
    long var73;
    int var8;
    int var9;
    int var96;
    local_40 = (long)(0x28);
    if (((arg0 == 0) || (arg1 == 0))) {
        ret = 0;
    } else {
        var5 = *(int *)(((long)arg0 + 0x4));
        var6 = *(int *)(((long)arg0 + 0x8));
        var7 = *(int *)(((long)arg0 + 0xc));
        var8 = *(int *)(((long)arg0 + 0x10));
        var9 = *(int *)(((long)arg0 + 0x14));
        var10 = *(int *)(((long)arg0 + 0x18));
        var11 = *(int *)(((long)arg0 + 0x1c));
        var13 = *(int *)(((long)arg0 + 0x20));
        var14 = *(int *)(((long)arg0 + 0x24));
        var15 = *(int *)(((long)arg0 + 0x28));
        var16 = *(int *)(((long)arg0 + 0x2c));
        var17 = *(int *)(((long)arg0 + 0x30));
        var18 = *(int *)(((long)arg0 + 0x34));
        var19 = *(int *)(((long)arg0 + 0x38));
        var20 = *(int *)(((long)arg0 + 0x3c));
        var21 = (long)(&local_148[0]);
        var22 = (long)((&local_148[0] + 192));
        *(int *)(&local_148[0]) = *(int *)(((long)arg0));
        *(int *)((&local_148[0] + 4)) = var5;
        *(int *)((&local_148[0] + 8)) = var6;
        *(int *)((&local_148[0] + 12)) = var7;
        *(int *)((&local_148[0] + 16)) = var8;
        *(int *)((&local_148[0] + 20)) = var9;
        *(int *)((&local_148[0] + 24)) = var10;
        *(int *)((&local_148[0] + 28)) = var11;
        *(int *)((&local_148[0] + 32)) = var13;
        *(int *)((&local_148[0] + 36)) = var14;
        *(int *)((&local_148[0] + 40)) = var15;
        *(int *)((&local_148[0] + 44)) = var16;
        *(int *)((&local_148[0] + 48)) = var17;
        *(int *)((&local_148[0] + 52)) = var18;
        *(int *)((&local_148[0] + 56)) = var19;
        *(int *)((&local_148[0] + 60)) = var20;
        do {
            var23 = (unsigned long)((unsigned int)(*(int *)((var21 + 0x4))));
            var24 = (unsigned long)((unsigned int)(*(int *)((var21 + 0x38))));
            var21 = (var21 + 4);
            *(int *)((var21 + 0x3c)) = ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((((unsigned long)((unsigned int)(var23)) >> 7) | ((unsigned long)((unsigned int)(var23)) << 25)) ^ (((unsigned long)((unsigned int)(var23)) << 14) | ((unsigned long)((unsigned int)(var23)) >> 18))))) ^ (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var23)) >> 3)))))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((var21 + 0x20)))) + *(int *)((var21 - 0x4)))))))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((((unsigned long)((unsigned int)(var24)) << 15) | ((unsigned long)((unsigned int)(var24)) >> 17)) ^ (((unsigned long)((unsigned int)(var24)) << 13) | ((unsigned long)((unsigned int)(var24)) >> 19))))) ^ (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var24)) >> 10)))))));
        } while ((var21 != var22));
        var56 = 0;
        var57 = 0x428a2f98;
        var66 = (long)(0x2000);
        var67 = 0x3c6ef372;
        var68 = 0xbb67ae85;
        var69 = 0xa54ff53a;
        var70 = 0x9b05688c;
        var71 = 0x1f83d9ab;
        e = 0x510e527f;
        var73 = 0x5be0cd19;
        a = 0x6a09e667;
        while (1) {
            var96 = ((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((((unsigned int)(e) >> 6) | (e << 26)) ^ (((unsigned int)(e) >> 11) | (e << 21))))) ^ ((e << 7) | ((unsigned int)(e) >> 25))))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((~e) & var71))) ^ (unsigned long)((unsigned int)((e & var70)))))))) + *(int *)((&local_148[0] + var56)));
            var56 = (var56 + 4);
            var104 = ((unsigned int)(((unsigned long)((unsigned int)(var96)) + var73)) + var57);
            var113 = (unsigned long)((unsigned int)((var69 + (unsigned long)((unsigned int)(var104)))));
            var127 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var104)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var68)) ^ var67))) & a))) ^ (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var68)) & var67)))))) + (unsigned long)((unsigned int)((((a << 10) | ((unsigned int)(a) >> 22)) ^ (unsigned long)((unsigned int)(((((unsigned int)(a) >> 13) | (a << 19)) ^ (((unsigned int)(a) >> 2) | (a << 30))))))))))))));
            if ((var56 == 256)) {
                break;
            }
            var57 = (unsigned long)((unsigned int)(*(int *)((var66 + var56))));
            var128 = (unsigned long)((unsigned int)(var71));
            var71 = (unsigned long)((unsigned int)(var70));
            var70 = (unsigned long)(e);
            e = (unsigned long)((unsigned int)(var113));
            var129 = (unsigned long)((unsigned int)(var67));
            var67 = (unsigned long)((unsigned int)(var68));
            var68 = (unsigned long)(a);
            var69 = var129;
            var73 = var128;
            a = (unsigned long)((unsigned int)(var127));
        }
        var133 = (unsigned long)((unsigned int)((var71 + 0x5be0cd19)));
        *(int *)(((long)arg1 + 0x4)) = (a - 0x4498517b);
        var146 = (unsigned long)((unsigned int)((var127 + 0x6a09e667)));
        *(int *)(((long)arg1 + 0x8)) = (var68 + 0x3c6ef372);
        *(int *)(((long)arg1 + 0xc)) = (var67 - 0x5ab00ac6);
        *(int *)(((long)arg1 + 0x10)) = (var113 + 0x510e527f);
        *(int *)(((long)arg1 + 0x14)) = (e - 0x64fa9774);
        *(int *)(((long)arg1 + 0x18)) = (var70 + 0x1f83d9ab);
        *(int *)(((long)arg1 + 0x1c)) = var133;
        *(int *)((long)arg1) = var146;
        ret = (unsigned long)((unsigned int)((var146 ^ var133)));
    }
    if ((local_40 != 0x28)) {
        __stack_chk_fail();
    }
    // x86-64 epilogue: tear down frame
    return ret;
}

← 213 fixtures