Fixture 162

unaligned memcpy access

C · 7 functions · 4 lanes · 25 of 28 function-lanes behave identically

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

The portable unaligned-access idiom: to read or write a multi-byte scalar at an arbitrary byte offset in a wire buffer you do NOT cast the byte pointer to uint32_t * (that forms a misaligned pointer -- undefined even if you never dereference it -- and violates the effective-type rules); you memcpy into or out of a properly aligned local of the target type. Every serious protocol and firmware codebase is written this way, and every compiler recognises the fixed-size form and emits a single unaligned load or store.

Why this stresses a decompiler: that recognition is exactly what erases the idiom. At -O2 a 4-byte memcpy into a local becomes one mov, a 2-byte one becomes a movzx, and there is no call, no loop, and no local left to see. At -O0 the same source keeps a real memcpy call against a stack slot. So the SAME line of C has two completely different shapes across the optimisation lanes, and the decompiler has to land on the same semantics from both: the width of the access, the byte offset it happens at, and whether the value is reassembled in host order or in a declared wire order. Getting the width right and the offset off by one still recompiles, still type-checks, and decodes a different field.

The native-order accessors below are host-endian by construction and are documented as such; the big-endian accessor copies into a local byte array first and reassembles with shifts, so it is endianness-independent. Both are real idioms and a parser normally contains both.

UB notes: every offset is validated against a length that is clamped to [0, 16] BEFORE any subtraction, so a hostile INT_MIN length can never overflow. No pointer is ever cast to a wider scalar type.

tests/decompiler_fixtures/src/162_unaligned_memcpy_access.c source
/* 162_unaligned_memcpy_access.c
 *
 * The portable unaligned-access idiom: to read or write a multi-byte scalar at
 * an arbitrary byte offset in a wire buffer you do NOT cast the byte pointer to
 * `uint32_t *` (that forms a misaligned pointer -- undefined even if you never
 * dereference it -- and violates the effective-type rules); you `memcpy` into
 * or out of a properly aligned local of the target type. Every serious protocol
 * and firmware codebase is written this way, and every compiler recognises the
 * fixed-size form and emits a single unaligned load or store.
 *
 * Why this stresses a decompiler: that recognition is exactly what erases the
 * idiom. At -O2 a 4-byte `memcpy` into a local becomes one `mov`, a 2-byte one
 * becomes a `movzx`, and there is no call, no loop, and no local left to see.
 * At -O0 the same source keeps a real `memcpy` call against a stack slot. So
 * the SAME line of C has two completely different shapes across the optimisation
 * lanes, and the decompiler has to land on the same semantics from both: the
 * width of the access, the byte offset it happens at, and whether the value is
 * reassembled in host order or in a declared wire order. Getting the width right
 * and the offset off by one still recompiles, still type-checks, and decodes a
 * different field.
 *
 * The native-order accessors below are host-endian by construction and are
 * documented as such; the big-endian accessor copies into a local byte array
 * first and reassembles with shifts, so it is endianness-independent. Both are
 * real idioms and a parser normally contains both.
 *
 * UB notes: every offset is validated against a length that is clamped to
 * [0, 16] BEFORE any subtraction, so a hostile INT_MIN length can never
 * overflow. No pointer is ever cast to a wider scalar type.
 */
#include <stddef.h>
#include <stdint.h>
#include <string.h>

#define UA162_MAX_BUF 16
#define UA162_BAD32   0xFFFFFFFFu

/* Clamp a caller length into [0, UA162_MAX_BUF] before it is used in any
 * arithmetic, so `limit - 4` below is always well defined. */
static int32_t ua162_clamp(int32_t n) {
    if (n < 0) {
        return 0;
    }
    if (n > UA162_MAX_BUF) {
        return UA162_MAX_BUF;
    }
    return n;
}

/* 1 iff [off, off + width) lies inside `limit` bytes. `limit` is pre-clamped
 * and `width` is a small constant, so no subtraction here can overflow. */
static int32_t ua162_fits(int32_t limit, int32_t off, int32_t width) {
    if (off < 0) {
        return 0;
    }
    return (off <= limit - width) ? 1 : 0;
}

/* Unaligned 4-byte load in HOST byte order -- the canonical idiom. Returns
 * 0xFFFFFFFF on rejection (ambiguous with that literal payload value, which is
 * why real code returns a status; this fixture returns the value directly so
 * the differential compares the full 32 bits). */
__attribute__((noinline)) uint32_t
ua162_load_native32(const uint8_t *buf, int32_t len, int32_t off) {
    uint32_t value = 0;
    int32_t limit = ua162_clamp(len);

    if (buf == NULL) {
        return UA162_BAD32;
    }
    if (!ua162_fits(limit, off, 4)) {
        return UA162_BAD32;
    }
    memcpy(&value, buf + off, sizeof value);
    return value;
}

/* Unaligned 2-byte load in HOST byte order. A uint16_t can never be 0xFFFFFFFF,
 * so the sentinel is unambiguous here. */
__attribute__((noinline)) uint32_t
ua162_load_native16(const uint8_t *buf, int32_t len, int32_t off) {
    uint16_t value = 0;
    int32_t limit = ua162_clamp(len);

    if (buf == NULL) {
        return UA162_BAD32;
    }
    if (!ua162_fits(limit, off, 2)) {
        return UA162_BAD32;
    }
    memcpy(&value, buf + off, sizeof value);
    return (uint32_t)value;
}

/* Unaligned 4-byte load in declared BIG-endian wire order: copy the bytes into
 * an aligned local array, then reassemble with shifts. Independent of host
 * endianness, unlike the two above. */
__attribute__((noinline)) uint32_t
ua162_load_be32(const uint8_t *buf, int32_t len, int32_t off) {
    uint8_t staging[4] = {0, 0, 0, 0};
    int32_t limit = ua162_clamp(len);

    if (buf == NULL) {
        return UA162_BAD32;
    }
    if (!ua162_fits(limit, off, 4)) {
        return UA162_BAD32;
    }
    memcpy(staging, buf + off, sizeof staging);
    return ((uint32_t)staging[0] << 24) | ((uint32_t)staging[1] << 16) |
           ((uint32_t)staging[2] << 8) | (uint32_t)staging[3];
}

/* Unaligned 4-byte store in host order. Returns the offset just past the
 * stored field, or a distinct negative code. */
__attribute__((noinline)) int32_t
ua162_store_native32(uint8_t *buf, int32_t len, int32_t off, uint32_t value) {
    int32_t limit = ua162_clamp(len);

    if (buf == NULL) {
        return -1;
    }
    if (!ua162_fits(limit, off, 4)) {
        return -2;
    }
    memcpy(buf + off, &value, sizeof value);
    return off + 4;
}

/* Unaligned 4-byte store in declared BIG-endian order: lay the bytes out in an
 * aligned local, then copy the whole field into place. */
__attribute__((noinline)) int32_t
ua162_store_be32(uint8_t *buf, int32_t len, int32_t off, uint32_t value) {
    uint8_t staging[4];
    int32_t limit = ua162_clamp(len);

    if (buf == NULL) {
        return -1;
    }
    if (!ua162_fits(limit, off, 4)) {
        return -2;
    }
    staging[0] = (uint8_t)((value >> 24) & 0xFFu);
    staging[1] = (uint8_t)((value >> 16) & 0xFFu);
    staging[2] = (uint8_t)((value >> 8) & 0xFFu);
    staging[3] = (uint8_t)(value & 0xFFu);
    memcpy(buf + off, staging, sizeof staging);
    return off + 4;
}

/* Relocate a 4-byte field within ONE buffer. Copying via an aligned local is
 * what makes this safe when the two ranges overlap -- a `memcpy` straight from
 * `buf + src_off` to `buf + dst_off` would be undefined for overlapping ranges.
 * Returns the byte sum of the buffer after the move, or a negative code. */
__attribute__((noinline)) int32_t
ua162_move_field32(uint8_t *buf, int32_t len, int32_t src_off, int32_t dst_off) {
    uint32_t held = 0;
    int32_t limit = ua162_clamp(len);
    int32_t sum = 0;
    int32_t i;

    if (buf == NULL) {
        return -1;
    }
    if (!ua162_fits(limit, src_off, 4)) {
        return -2;
    }
    if (!ua162_fits(limit, dst_off, 4)) {
        return -3;
    }
    memcpy(&held, buf + src_off, sizeof held);
    memcpy(buf + dst_off, &held, sizeof held);
    for (i = 0; i < limit; i++) {
        sum += (int32_t)buf[i];
    }
    return sum;
}

/* Store then reload at the same unaligned offset. Host order cancels out, so
 * the answer is endianness-independent: 1 for the native path, 2 for the
 * big-endian path, 3 when both agree. */
__attribute__((noinline)) int32_t
ua162_roundtrip(int32_t off, uint32_t value) {
    uint8_t frame[UA162_MAX_BUF];
    int32_t result = 0;
    int32_t i;

    for (i = 0; i < UA162_MAX_BUF; i++) {
        frame[i] = 0;
    }
    if (ua162_store_native32(frame, UA162_MAX_BUF, off, value) < 0) {
        return -1;
    }
    if (ua162_load_native32(frame, UA162_MAX_BUF, off) == value) {
        result += 1;
    }
    if (ua162_store_be32(frame, UA162_MAX_BUF, off, value) < 0) {
        return -2;
    }
    if (ua162_load_be32(frame, UA162_MAX_BUF, off) == value) {
        result += 2;
    }
    return result;
}

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 -O2

5/7
ua162_load_be32 pass 19 lines
// glaurung: ua162_load_be32 @ 0x11a0
uint32_t ua162_load_be32(const uint8_t * arg0, int32_t arg1, int32_t arg2) {
    int limit;
    long ret;
    long var1;
    long var8;
    var1 = (((long)(arg1) < 16) ? arg1 : 16);
    ret = 0xffffffff;
    if ((arg0 != 0)) {
        if (((long)(arg2) < 0)) {
            return ret;
        }
        if (((long)(arg2) <= (long)((int)((((0 <= (long)((int)(var1))) ? var1 : 0) - 4))))) {
            var8 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + (unsigned long)((unsigned int)(arg2))))));
            ret = (unsigned int)(((((((unsigned int)(var8) & 255) << 24) | ((((unsigned int)(var8) >> 8) & 255) << 16)) | ((((unsigned int)(var8) >> 16) & 255) << 8)) | (((unsigned int)(var8) >> 24) & 255)));
        }
    }
    return ret;
}
ua162_load_native16 pass 18 lines
// glaurung: ua162_load_native16 @ 0x1170
uint32_t ua162_load_native16(const uint8_t * arg0, int32_t arg1, int32_t arg2) {
    int limit;
    unsigned short value;
    long ret;
    long var1;
    var1 = (((long)(arg1) < 16) ? arg1 : 16);
    ret = 0xffffffff;
    if ((arg0 != 0)) {
        if (((long)(arg2) < 0)) {
            return ret;
        }
        if (((long)(arg2) <= (long)((int)((((0 <= (long)((int)(var1))) ? var1 : 0) - 2))))) {
            ret = (unsigned int)((unsigned short)(*(short *)(((long)arg0 + (unsigned long)((unsigned int)(arg2))))));
        }
    }
    return ret;
}
ua162_load_native32 pass 17 lines
// glaurung: ua162_load_native32 @ 0x1140
uint32_t ua162_load_native32(const uint8_t * arg0, int32_t arg1, int32_t arg2) {
    int limit;
    long ret;
    long var1;
    var1 = (((long)(arg1) < 16) ? arg1 : 16);
    ret = 0xffffffff;
    if ((arg0 != 0)) {
        if (((long)(arg2) < 0)) {
            return ret;
        }
        if (((long)(arg2) <= (long)((int)((((0 <= (long)((int)(var1))) ? var1 : 0) - 4))))) {
            ret = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + (unsigned long)((unsigned int)(arg2))))));
        }
    }
    return ret;
}
ua162_move_field32 fail 152 lines
// glaurung: ua162_move_field32 @ 0x1250
int32_t ua162_move_field32(uint8_t * arg0, int32_t arg1, int32_t arg2, int32_t arg3) {
    extern long __unknown(long, ...);
    int limit;
    int sum;
    int i;
    unsigned int held;
    long ret;
    int var100;
    int var101;
    int var104;
    int var105;
    int var106;
    int var107;
    long var110;
    int var112;
    int var113;
    int var120;
    int var121;
    int var13;
    long var144;
    long var16;
    long var17;
    long var20;
    long var23;
    long var24;
    int var26;
    int var27;
    int var33;
    int var34;
    int var35;
    int var36;
    int var41;
    int var42;
    int var57;
    int var58;
    long var6;
    int var69;
    int var70;
    int var89;
    int var90;
    int var98;
    int var99;
    limit = (((((unsigned long)((unsigned int)(arg1)) == 0) | ((long)(arg1) < 0)) == 0) ? (((long)(arg1) < 16) ? arg1 : 16) : 0);
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    ret = 0xfffffffe;
    if (((long)(arg2) < 0)) {
        return ret;
    }
    var6 = (unsigned long)((unsigned int)((limit - 4)));
    ret = 0xfffffffe;
    if (((long)((int)(var6)) < (long)(arg2))) {
        return ret;
    }
    ret = 0xfffffffd;
    if (((long)(arg3) < 0)) {
        return ret;
    }
    ret = 0xfffffffd;
    if (((long)((int)(var6)) < (long)(arg3))) {
        return ret;
    }
    *(int *)(((long)arg0 + (unsigned long)((unsigned int)(arg3)))) = *(int *)(((long)arg0 + (unsigned long)((unsigned int)(arg2))));
    if ((((unsigned long)((unsigned int)(arg1)) == 0) | ((long)(arg1) < 0))) {
        return 0;
    }
    var13 = ((2 <= (long)(limit)) ? limit : 1);
    if (((unsigned long)(4) <= (unsigned long)((unsigned long)((unsigned int)(var13))))) {
        var16 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var13)) & 0x7ffffffc)));
        var17 = (var16 - 4);
        var20 = (((unsigned long)(var17) >> 2) + 1);
        var23 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var20)) & 3)));
        if (((unsigned long)(12) <= (unsigned long)(var17))) {
            var24 = (var20 & -4);
            var26 = 0;
            var27 = 0;
            var33 = 0;
            var34 = 0;
            var35 = 0;
            var36 = 0;
            do {
                var41 = __unknown(0);
                var42 = __unknown(0);
                var57 = __unknown(0);
                var58 = __unknown(0);
                var69 = __unknown(0);
                var70 = __unknown(0);
                var89 = __unknown(0);
                var90 = __unknown(0);
                var33 = (((unsigned int)((unsigned short)(var89)) | ((unsigned int)((unsigned short)(var26)) << 16)) + ((((unsigned int)((unsigned short)(var69)) | ((unsigned int)((unsigned short)(var26)) << 16)) + ((unsigned int)((unsigned short)(var57)) | ((unsigned int)((unsigned short)(var26)) << 16))) + (((unsigned int)((unsigned short)(var41)) | ((unsigned int)((unsigned short)(var26)) << 16)) + var33)));
                var34 = (((unsigned int)((unsigned short)((((unsigned int)(var89) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var26) >> 16) & 0xffff))) << 16)) + ((((unsigned int)((unsigned short)((((unsigned int)(var69) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var26) >> 16) & 0xffff))) << 16)) + ((unsigned int)((unsigned short)((((unsigned int)(var57) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var26) >> 16) & 0xffff))) << 16))) + (((unsigned int)((unsigned short)((((unsigned int)(var41) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var26) >> 16) & 0xffff))) << 16)) + var34)));
                var35 = (((unsigned int)((unsigned short)(var90)) | ((unsigned int)((unsigned short)(var27)) << 16)) + ((((unsigned int)((unsigned short)(var70)) | ((unsigned int)((unsigned short)(var27)) << 16)) + ((unsigned int)((unsigned short)(var58)) | ((unsigned int)((unsigned short)(var27)) << 16))) + (((unsigned int)((unsigned short)(var42)) | ((unsigned int)((unsigned short)(var27)) << 16)) + var35)));
                var36 = (((unsigned int)((unsigned short)((((unsigned int)(var90) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var27) >> 16) & 0xffff))) << 16)) + ((((unsigned int)((unsigned short)((((unsigned int)(var70) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var27) >> 16) & 0xffff))) << 16)) + ((unsigned int)((unsigned short)((((unsigned int)(var58) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var27) >> 16) & 0xffff))) << 16))) + (((unsigned int)((unsigned short)((((unsigned int)(var42) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var27) >> 16) & 0xffff))) << 16)) + var36)));
                ret = ((unsigned long)((unsigned int)(var34)) | (unsigned long)((unsigned int)(var33)));
                var24 = (var24 - 4);
                var20 = var24;
                var98 = var33;
                var99 = var34;
                var100 = var35;
                var101 = var36;
            } while ((var24 != 0));
        } else {
            var98 = 0;
            var99 = 0;
            var100 = 0;
            var101 = 0;
        }
        var104 = var98;
        var105 = var99;
        var106 = var100;
        var107 = var101;
        if ((var23 != 0)) {
            var110 = 0;
            var112 = 0;
            var113 = 0;
            while ((var23 != var110)) {
                var120 = __unknown(0);
                var121 = __unknown(0);
                var98 = (var98 + ((unsigned int)((unsigned short)(var120)) | ((unsigned int)((unsigned short)(var112)) << 16)));
                var99 = (var99 + ((unsigned int)((unsigned short)((((unsigned int)(var120) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var112) >> 16) & 0xffff))) << 16)));
                var100 = (var100 + ((unsigned int)((unsigned short)(var121)) | ((unsigned int)((unsigned short)(var113)) << 16)));
                var101 = (var101 + ((unsigned int)((unsigned short)((((unsigned int)(var121) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var113) >> 16) & 0xffff))) << 16)));
                ret = ((unsigned long)((unsigned int)(var99)) | (unsigned long)((unsigned int)(var98)));
                var110 = (var110 + 1);
                var104 = var98;
                var105 = var99;
                var106 = var100;
                var107 = var101;
            }
        }
        var144 = (unsigned long)((unsigned int)(((var107 + var105) + (var106 + var104))));
        ret = var144;
        if ((var16 == var13)) {
            return ret;
        }
        L_13b0: ;
        do {
            sum = (var144 + (unsigned int)((unsigned char)(*(char *)(((long)arg0 + var16)))));
            i = (var16 + 1);
            var144 = (unsigned long)((unsigned int)(sum));
            var16 = (unsigned long)((unsigned int)(i));
            ret = (unsigned long)((unsigned int)(sum));
        } while ((var13 != i));
    } else {
        var144 = 0;
        var16 = 0;
        goto L_13b0;
    }
    return ret;
}
ua162_roundtrip fail 44 lines
// glaurung: ua162_roundtrip @ 0x13c0
__attribute__((no_stack_protector)) int32_t ua162_roundtrip(int32_t arg0, uint32_t arg1) {
    extern unsigned int ua162_load_be32(char *, int, int);
    extern unsigned int ua162_load_native32(char *, int, int);
    extern int ua162_store_be32(char *, int, int, unsigned int);
    extern int ua162_store_native32(char *, int, int, unsigned int);
    int i;
    int result;
    unsigned char local_38[56];
    long rsp;
    long var0;
    long var1;
    unsigned int var11;
    long var14;
    long var16;
    int var17;
    long var21;
    unsigned int var22;
    int var7;
    // x86-64 prologue: save callee registers, frame 40 bytes
    rsp = (rsp - 16);
    var0 = (unsigned long)(arg1);
    var1 = (unsigned long)((unsigned int)(arg0));
    *(int *)(&local_38[0]) = 0;
    *(int *)((&local_38[0] + 4)) = 0;
    *(int *)((&local_38[0] + 8)) = 0;
    *(int *)((&local_38[0] + 12)) = 0;
    var7 = ua162_store_native32((char *)(rsp), 16, (unsigned long)((unsigned int)(arg0)), arg1);
    if (((long)((int)(var7)) < 0)) {
        return 0xffffffff;
    } else {
        var11 = ua162_load_native32((char *)(&local_38[0]), 16, (unsigned long)((unsigned int)(var1)));
        var14 = 0;
        var16 = (var11 == (unsigned long)((unsigned int)(var0)));
        var17 = ua162_store_be32((char *)(&local_38[0]), 16, (unsigned long)((unsigned int)(var1)), (unsigned long)((unsigned int)(var0)));
        if (((long)((int)(var17)) < 0)) {
            return 0xfffffffe;
        } else {
            var21 = ((var14 & -256) | (var16 & 255));
            var22 = ua162_load_be32((char *)(&local_38[0]), 16, (unsigned long)((unsigned int)(var1)));
            return (((unsigned int)(var22) != (unsigned int)(var0)) ? var21 : (unsigned long)((unsigned int)((var21 + 2))));
        }
    }
}
ua162_store_be32 pass 18 lines
// glaurung: ua162_store_be32 @ 0x1210
int32_t ua162_store_be32(uint8_t * arg0, int32_t arg1, int32_t arg2, uint32_t arg3) {
    int limit;
    long ret;
    long var1;
    var1 = (((long)(arg1) < 16) ? arg1 : 16);
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    ret = 0xfffffffe;
    if ((0 <= (long)(arg2))) {
        if (((long)(arg2) <= (long)((int)((((0 <= (long)((int)(var1))) ? var1 : 0) - 4))))) {
            *(int *)(((long)arg0 + (unsigned long)((unsigned int)(arg2)))) = (((((arg3 & 255) << 24) | (((arg3 >> 8) & 255) << 16)) | (((arg3 >> 16) & 255) << 8)) | ((arg3 >> 24) & 255));
            ret = (unsigned long)((unsigned int)((arg2 + 4)));
        }
    }
    return ret;
}
ua162_store_native32 pass 18 lines
// glaurung: ua162_store_native32 @ 0x11d0
int32_t ua162_store_native32(uint8_t * arg0, int32_t arg1, int32_t arg2, uint32_t arg3) {
    int limit;
    long ret;
    long var1;
    var1 = (((long)(arg1) < 16) ? arg1 : 16);
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    ret = 0xfffffffe;
    if ((0 <= (long)(arg2))) {
        if (((long)(arg2) <= (long)((int)((((0 <= (long)((int)(var1))) ? var1 : 0) - 4))))) {
            *(int *)(((long)arg0 + (unsigned long)((unsigned int)(arg2)))) = arg3;
            ret = (unsigned long)((unsigned int)((arg2 + 4)));
        }
    }
    return ret;
}

gcc -O2

6/7
ua162_load_be32 pass 21 lines
// glaurung: ua162_load_be32 @ 0x1220
uint32_t ua162_load_be32(const uint8_t * arg0, int32_t arg1, int32_t arg2) {
    long ret;
    long var1;
    long var6;
    long var8;
    if (((long)(arg2) < 0)) {
        return 0xffffffff;
    }
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    var1 = (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0) ? 16 : arg1);
    ret = 0xffffffff;
    var6 = (unsigned long)((unsigned int)(((((long)((int)(var1)) < 0) ? 0 : var1) - 4)));
    if (((((unsigned int)(arg2) == (unsigned int)(var6)) | ((long)(arg2) < (long)((int)(var6)))) != 0)) {
        var8 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + (long)(arg2)))));
        return (unsigned int)(((((((unsigned int)(var8) & 255) << 24) | ((((unsigned int)(var8) >> 8) & 255) << 16)) | ((((unsigned int)(var8) >> 16) & 255) << 8)) | (((unsigned int)(var8) >> 24) & 255)));
    }
    return ret;
}
ua162_load_native16 pass 16 lines
// glaurung: ua162_load_native16 @ 0x11e0
uint32_t ua162_load_native16(const uint8_t * arg0, int32_t arg1, int32_t arg2) {
    long var1;
    long var6;
    if ((0 <= (long)(arg2))) {
        if ((arg0 == 0)) {
            return 0xffffffff;
        }
        var1 = (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0) ? 16 : arg1);
        var6 = (unsigned long)((unsigned int)(((((long)((int)(var1)) < 0) ? 0 : var1) - 2)));
        if (((((unsigned int)(arg2) == (unsigned int)(var6)) | ((long)(arg2) < (long)((int)(var6)))) != 0)) {
            return (unsigned int)((unsigned short)(*(short *)(((long)arg0 + (long)(arg2)))));
        }
    }
    return 0xffffffff;
}
ua162_load_native32 pass 16 lines
// glaurung: ua162_load_native32 @ 0x11a0
uint32_t ua162_load_native32(const uint8_t * arg0, int32_t arg1, int32_t arg2) {
    long var1;
    long var6;
    if ((0 <= (long)(arg2))) {
        if ((arg0 == 0)) {
            return 0xffffffff;
        }
        var1 = (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0) ? 16 : arg1);
        var6 = (unsigned long)((unsigned int)(((((long)((int)(var1)) < 0) ? 0 : var1) - 4)));
        if (((((unsigned int)(arg2) == (unsigned int)(var6)) | ((long)(arg2) < (long)((int)(var6)))) != 0)) {
            return (unsigned int)(*(int *)(((long)arg0 + (long)(arg2))));
        }
    }
    return 0xffffffff;
}
ua162_move_field32 pass 59 lines
// glaurung: ua162_move_field32 @ 0x1300
int32_t ua162_move_field32(uint8_t * arg0, int32_t arg1, int32_t arg2, int32_t arg3) {
    int i;
    int sum;
    unsigned int held;
    long var0;
    long var1;
    long var16;
    int var17;
    long var2;
    long var4;
    int var7;
    long var8;
    var0 = (unsigned long)((unsigned int)(arg1));
    if ((arg0 == 0)) {
        goto L_137d;
    }
    var1 = 0xfffffffe;
    var2 = 0xfffffffe;
    if (((long)(arg2) < 0)) {
        goto L_135f;
    }
    var4 = ((((unsigned long)((unsigned int)(var0)) == 16) | ((long)((int)(var0)) < 16)) ? var0 : 16);
    var7 = (((long)((int)(var4)) < 0) ? 0 : var4);
    var8 = (unsigned long)((unsigned int)((var7 - 4)));
    var2 = var1;
    if (((((unsigned int)(arg2) == (unsigned int)(var8)) | ((long)(arg2) < (long)((int)(var8)))) == 0)) {
        goto L_135f;
    }
    if (((((unsigned int)(arg3) == (unsigned int)(var8)) | ((long)(arg3) < (long)((int)(var8)))) == 0)) {
        goto L_1368;
    }
    if (((long)(arg3) < 0)) {
        goto L_1368;
    }
    *(int *)(((long)arg0 + (long)(arg3))) = *(int *)(((long)arg0 + (long)(arg2)));
    if ((((unsigned long)((unsigned int)(var0)) == 0) | ((long)((int)(var0)) < 0))) {
        goto L_1378;
    }
    i = 0;
    var16 = 0;
    do {
        var17 = (unsigned int)((unsigned char)(*(char *)(((long)arg0 + i))));
        i = (i + 1);
        sum = (var16 + var17);
        var16 = (unsigned long)((unsigned int)(sum));
        var2 = (unsigned long)((unsigned int)(sum));
    } while (((((unsigned int)(var7) == (unsigned int)(i)) | (var7 < i)) == 0));
    L_135f: ;
    return (unsigned int)(var2);
    L_1368: ;
    return 0xfffffffd;
    L_1378: ;
    var2 = 0;
    goto L_135f;
    L_137d: ;
    var2 = 0xffffffff;
    goto L_135f;
}
ua162_roundtrip fail 57 lines
// glaurung: ua162_roundtrip @ 0x1390
__attribute__((no_stack_protector)) int32_t ua162_roundtrip(int32_t arg0, uint32_t arg1) {
    extern unsigned int ua162_load_be32(char *, int, int);
    extern unsigned int ua162_load_native32(char *, int, int);
    extern int ua162_store_be32(char *, int, int, unsigned int);
    extern int ua162_store_native32(char *, int, int, unsigned int);
    int i;
    int result;
    long rbp;
    long rsp;
    long stack_2;
    unsigned char stack_5[16];
    int var13;
    int var15;
    long var17;
    unsigned int var18;
    long var21;
    int var22;
    unsigned int var24;
    long var7;
    long var8;
    rsp = (rsp - 8);
    rsp = (rsp - 8);
    var7 = (unsigned long)((unsigned int)(arg0));
    rsp = (rsp - 8);
    stack_2 = rbp;
    rsp = (rsp - 8);
    var8 = (unsigned long)(arg1);
    rsp = (rsp - 40);
    // stack canary: save guard to %stack_4
    rbp = rsp;
    *(int *)(&stack_5[0]) = 0;
    *(int *)((&stack_5[0] + 4)) = 0;
    *(int *)((&stack_5[0] + 8)) = 0;
    *(int *)((&stack_5[0] + 12)) = 0;
    var13 = ((int (*)(char *))ua162_store_native32)((char *)(rsp));
    if (((long)((int)(var13)) < 0)) {
        var15 = 0xffffffff;
    } else {
        var17 = 0;
        var18 = ua162_load_native32((char *)(rbp), 16, (unsigned long)((unsigned int)(var7)));
        var21 = ((var17 & -256) | (var18 == (unsigned long)((unsigned int)(var8))));
        var22 = ua162_store_be32((char *)(rbp), 16, (unsigned long)((unsigned int)(var7)), (unsigned long)((unsigned int)(var8)));
        if (((long)((int)(var22)) < 0)) {
            var15 = 0xfffffffe;
        } else {
            var24 = ua162_load_be32((char *)(rbp), 16, (unsigned long)((unsigned int)(var7)));
            var15 = ((var24 == (unsigned long)((unsigned int)(var8))) ? (unsigned long)((unsigned int)((var21 + 2))) : var21);
        }
    }
    // stack-canary check
    rsp = (rsp + 40);
    rsp = (rsp + 8);
    rbp = stack_2;
    // x86-64 epilogue: tear down frame
    return (unsigned int)(var15);
}
ua162_store_be32 pass 21 lines
// glaurung: ua162_store_be32 @ 0x12b0
int32_t ua162_store_be32(uint8_t * arg0, int32_t arg1, int32_t arg2, uint32_t arg3) {
    long var0;
    long var1;
    long var3;
    long var8;
    var0 = (long)arg0;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    var1 = 0xfffffffe;
    if ((0 <= (long)(arg2))) {
        var3 = (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0) ? 16 : arg1);
        var8 = (unsigned long)((unsigned int)(((((long)((int)(var3)) < 0) ? 0 : var3) - 4)));
        if (((((unsigned int)(arg2) == (unsigned int)(var8)) | ((long)(arg2) < (long)((int)(var8)))) != 0)) {
            var1 = (unsigned long)((unsigned int)((arg2 + 4)));
            *(int *)((var0 + (long)(arg2))) = (((((arg3 & 255) << 24) | (((arg3 >> 8) & 255) << 16)) | (((arg3 >> 16) & 255) << 8)) | ((arg3 >> 24) & 255));
        }
    }
    return (unsigned int)(var1);
}
ua162_store_native32 pass 21 lines
// glaurung: ua162_store_native32 @ 0x1260
int32_t ua162_store_native32(uint8_t * arg0, int32_t arg1, int32_t arg2, uint32_t arg3) {
    long var0;
    long var1;
    long var3;
    long var8;
    var0 = (long)arg0;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    var1 = 0xfffffffe;
    if ((0 <= (long)(arg2))) {
        var3 = (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0) ? 16 : arg1);
        var8 = (unsigned long)((unsigned int)(((((long)((int)(var3)) < 0) ? 0 : var3) - 4)));
        if (((((unsigned int)(arg2) == (unsigned int)(var8)) | ((long)(arg2) < (long)((int)(var8)))) != 0)) {
            var1 = (unsigned long)((unsigned int)((arg2 + 4)));
            *(int *)((var0 + (long)(arg2))) = arg3;
        }
    }
    return (unsigned int)(var1);
}

clang -O0

7/7
ua162_load_be32 pass 26 lines
// glaurung: ua162_load_be32 @ 0x12d0
__attribute__((no_stack_protector)) uint32_t ua162_load_be32(const uint8_t * arg0, int32_t arg1, int32_t arg2) {
    extern void * memset(void *, int, __SIZE_TYPE__);
    extern int ua162_clamp(int);
    extern int ua162_fits(int, int, int);
    int limit;
    unsigned char local_1c[4];
    void * var1;
    int var3;
    int var5;
    // x86-64 prologue: save rbp, frame 32 bytes
    var1 = memset((void *)(&local_1c[0]), 0, (__SIZE_TYPE__)(4));
    var3 = ua162_clamp((unsigned long)((unsigned int)(arg1)));
    limit = var3;
    if ((arg0 != 0)) {
        var5 = ua162_fits((unsigned long)((unsigned int)(limit)), (unsigned long)((unsigned int)(arg2)), 4);
        if (((unsigned long)((unsigned int)(var5)) != 0)) {
            *(int *)(&local_1c[0]) = *(int *)(((long)arg0 + (long)(arg2)));
            return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned int)((unsigned char)(*(char *)(&local_1c[0]))) << 24))) | (unsigned long)((unsigned int)(((unsigned int)((unsigned char)(*(char *)((&local_1c[0] + 1)))) << 16)))))) | (unsigned long)((unsigned int)(((unsigned int)((unsigned char)(*(char *)((&local_1c[0] + 2)))) << 8)))))) | (unsigned int)((unsigned char)(*(char *)((&local_1c[0] + 3))))));
        } else {
            return (unsigned int)(-1);
        }
    } else {
        return (unsigned int)(-1);
    }
}
ua162_load_native16 pass 24 lines
// glaurung: ua162_load_native16 @ 0x1250
uint32_t ua162_load_native16(const uint8_t * arg0, int32_t arg1, int32_t arg2) {
    extern int ua162_clamp(int);
    extern int ua162_fits(int, int, int);
    unsigned short value;
    int limit;
    int var0;
    int var2;
    // x86-64 prologue: save rbp, frame 32 bytes
    value = 0;
    var0 = ua162_clamp((unsigned long)((unsigned int)(arg1)));
    limit = var0;
    if ((arg0 != 0)) {
        var2 = ua162_fits((unsigned long)((unsigned int)(limit)), (unsigned long)((unsigned int)(arg2)), 2);
        if (((unsigned long)((unsigned int)(var2)) != 0)) {
            value = *(short *)(((long)arg0 + (long)(arg2)));
            return (unsigned int)(value);
        } else {
            return (unsigned int)(-1);
        }
    } else {
        return (unsigned int)(-1);
    }
}
ua162_load_native32 pass 24 lines
// glaurung: ua162_load_native32 @ 0x1150
uint32_t ua162_load_native32(const uint8_t * arg0, int32_t arg1, int32_t arg2) {
    extern int ua162_clamp(int);
    extern int ua162_fits(int, int, int);
    unsigned int value;
    int limit;
    int var0;
    int var2;
    // x86-64 prologue: save rbp, frame 32 bytes
    value = 0;
    var0 = ua162_clamp((unsigned long)((unsigned int)(arg1)));
    limit = var0;
    if ((arg0 != 0)) {
        var2 = ua162_fits((unsigned long)((unsigned int)(limit)), (unsigned long)((unsigned int)(arg2)), 4);
        if (((unsigned long)((unsigned int)(var2)) != 0)) {
            value = *(int *)(((long)arg0 + (long)(arg2)));
            return value;
        } else {
            return (unsigned int)(-1);
        }
    } else {
        return (unsigned int)(-1);
    }
}
ua162_move_field32 pass 37 lines
// glaurung: ua162_move_field32 @ 0x14c0
int32_t ua162_move_field32(uint8_t * arg0, int32_t arg1, int32_t arg2, int32_t arg3) {
    extern int ua162_clamp(int);
    extern int ua162_fits(int, int, int);
    unsigned int held;
    int limit;
    int sum;
    int i;
    int var0;
    int var2;
    int var4;
    // x86-64 prologue: save rbp, frame 48 bytes
    held = 0;
    var0 = ua162_clamp((unsigned long)((unsigned int)(arg1)));
    limit = var0;
    sum = 0;
    if ((arg0 != 0)) {
        var2 = ua162_fits((unsigned long)((unsigned int)(limit)), (unsigned long)((unsigned int)(arg2)), 4);
        if (((unsigned long)((unsigned int)(var2)) != 0)) {
            var4 = ua162_fits((unsigned long)((unsigned int)(limit)), (unsigned long)((unsigned int)(arg3)), 4);
            if (((unsigned long)((unsigned int)(var4)) != 0)) {
                held = *(int *)(((long)arg0 + (long)(arg2)));
                *(int *)(((long)arg0 + (long)(arg3))) = held;
                for (i = 0; (i < limit); i++) {
                    sum = ((unsigned int)((unsigned char)(arg0[i])) + sum);
                }
                return (unsigned int)(sum);
            } else {
                return (unsigned int)(-3);
            }
        } else {
            return (unsigned int)(-2);
        }
    } else {
        return (unsigned int)(-1);
    }
}
ua162_roundtrip pass 38 lines
// glaurung: ua162_roundtrip @ 0x15b0
__attribute__((no_stack_protector)) int32_t ua162_roundtrip(int32_t arg0, uint32_t arg1) {
    extern unsigned int ua162_load_be32(char *, int, int);
    extern unsigned int ua162_load_native32(char *, int, int);
    extern int ua162_store_be32(char *, int, int, unsigned int);
    extern int ua162_store_native32(char *, int, int, unsigned int);
    int result;
    int i;
    unsigned char local_20[16];
    int var11;
    unsigned int var13;
    int var4;
    unsigned int var6;
    // x86-64 prologue: save rbp, frame 48 bytes
    result = 0;
    for (i = 0; ((long)(i) < 16); i++) {
        *(signed char *)((&local_20[0] + (long)(i))) = 0;
    }
    var4 = ua162_store_native32((char *)(&local_20[0]), 16, (unsigned long)((unsigned int)(arg0)), arg1);
    if ((0 <= (long)((int)(var4)))) {
        var6 = ua162_load_native32((char *)(&local_20[0]), 16, (unsigned long)((unsigned int)(arg0)));
        if ((var6 == arg1)) {
            result = ((unsigned int)(result) + 1);
        }
        var11 = ua162_store_be32((char *)(&local_20[0]), 16, (unsigned long)((unsigned int)(arg0)), arg1);
        if ((0 <= (long)((int)(var11)))) {
            var13 = ua162_load_be32((char *)(&local_20[0]), 16, (unsigned long)((unsigned int)(arg0)));
            if ((var13 == arg1)) {
                result = ((unsigned int)(result) + 2);
            }
            return (unsigned int)(result);
        } else {
            return (unsigned int)(-2);
        }
    } else {
        return (unsigned int)(-1);
    }
}
ua162_store_be32 pass 27 lines
// glaurung: ua162_store_be32 @ 0x1400
__attribute__((no_stack_protector)) int32_t ua162_store_be32(uint8_t * arg0, int32_t arg1, int32_t arg2, uint32_t arg3) {
    extern int ua162_clamp(int);
    extern int ua162_fits(int, int, int);
    int limit;
    unsigned char local_20[4];
    int var0;
    int var2;
    // x86-64 prologue: save rbp, frame 48 bytes
    var0 = ua162_clamp((unsigned long)((unsigned int)(arg1)));
    limit = var0;
    if ((arg0 != 0)) {
        var2 = ua162_fits((unsigned long)((unsigned int)(limit)), (unsigned long)((unsigned int)(arg2)), 4);
        if (((unsigned long)((unsigned int)(var2)) != 0)) {
            *(signed char *)(&local_20[0]) = ((unsigned int)(arg3) >> 24);
            *(signed char *)((&local_20[0] + 1)) = ((unsigned int)(arg3) >> 16);
            *(signed char *)((&local_20[0] + 2)) = ((unsigned int)(arg3) >> 8);
            *(signed char *)((&local_20[0] + 3)) = arg3;
            *(int *)(((long)arg0 + (long)(arg2))) = *(int *)(&local_20[0]);
            return (unsigned int)(((unsigned long)((unsigned int)(arg2)) + 4));
        } else {
            return (unsigned int)(-2);
        }
    } else {
        return (unsigned int)(-1);
    }
}
ua162_store_native32 pass 22 lines
// glaurung: ua162_store_native32 @ 0x1380
int32_t ua162_store_native32(uint8_t * arg0, int32_t arg1, int32_t arg2, uint32_t arg3) {
    extern int ua162_clamp(int);
    extern int ua162_fits(int, int, int);
    int limit;
    int var0;
    int var2;
    // x86-64 prologue: save rbp, frame 32 bytes
    var0 = ua162_clamp((unsigned long)((unsigned int)(arg1)));
    limit = var0;
    if ((arg0 != 0)) {
        var2 = ua162_fits((unsigned long)((unsigned int)(limit)), (unsigned long)((unsigned int)(arg2)), 4);
        if (((unsigned long)((unsigned int)(var2)) != 0)) {
            *(int *)(((long)arg0 + (long)(arg2))) = arg3;
            return (unsigned int)(((unsigned long)((unsigned int)(arg2)) + 4));
        } else {
            return (unsigned int)(-2);
        }
    } else {
        return (unsigned int)(-1);
    }
}

gcc -O0

7/7
ua162_load_be32 pass 33 lines
// glaurung: ua162_load_be32 @ 0x1319
uint32_t ua162_load_be32(const uint8_t * arg0, int32_t arg1, int32_t arg2) {
    extern __attribute__((noreturn)) void __stack_chk_fail(void);
    extern int ua162_clamp(int);
    extern int ua162_fits(int, int, int);
    int limit;
    long local_8;
    unsigned char local_c[4];
    long ret;
    int var4;
    int var8;
    // x86-64 prologue: save rbp, frame 32 bytes
    local_8 = (long)(0x28);
    *(int *)(&local_c[0]) = 0;
    var4 = ua162_clamp((unsigned long)((unsigned int)(arg1)));
    limit = var4;
    if ((arg0 != 0)) {
        var8 = ua162_fits((unsigned long)((unsigned int)(limit)), (unsigned long)((unsigned int)(arg2)), 4);
        if (((unsigned long)((unsigned int)(var8)) != 0)) {
            *(int *)(&local_c[0]) = *(int *)(((long)arg0 + (long)(arg2)));
            ret = (unsigned long)((unsigned int)(((unsigned int)((unsigned char)(((unsigned int)((unsigned char)(*(char *)((&local_c[0] + 3)))) & 255))) | (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned int)((unsigned char)(((unsigned int)((unsigned char)(*(char *)(&local_c[0]))) & 255))) << 24))) | (unsigned long)((unsigned int)(((unsigned int)((unsigned char)(((unsigned int)((unsigned char)(*(char *)((&local_c[0] + 1)))) & 255))) << 16)))))) | (unsigned long)((unsigned int)(((unsigned int)((unsigned char)(((unsigned int)((unsigned char)(*(char *)((&local_c[0] + 2)))) & 255))) << 8)))))))));
        } else {
            ret = 0xffffffff;
        }
    } else {
        ret = 0xffffffff;
    }
    if ((local_8 != 0x28)) {
        __stack_chk_fail();
    }
    // x86-64 epilogue: restore rbp
    return ret;
}
ua162_load_native16 pass 33 lines
// glaurung: ua162_load_native16 @ 0x1283
uint32_t ua162_load_native16(const uint8_t * arg0, int32_t arg1, int32_t arg2) {
    extern __attribute__((noreturn)) void __stack_chk_fail(void);
    extern int ua162_clamp(int);
    extern int ua162_fits(int, int, int);
    unsigned short value;
    int limit;
    long local_8;
    long ret;
    int var4;
    int var8;
    // x86-64 prologue: save rbp, frame 32 bytes
    local_8 = (long)(0x28);
    value = 0;
    var4 = ua162_clamp((unsigned long)((unsigned int)(arg1)));
    limit = var4;
    if ((arg0 != 0)) {
        var8 = ua162_fits((unsigned long)((unsigned int)(limit)), (unsigned long)((unsigned int)(arg2)), 2);
        if (((unsigned long)((unsigned int)(var8)) != 0)) {
            value = *(short *)(((long)arg0 + (long)(arg2)));
            ret = (unsigned int)((unsigned short)((value & 0xffff)));
        } else {
            ret = 0xffffffff;
        }
    } else {
        ret = 0xffffffff;
    }
    if ((local_8 != 0x28)) {
        __stack_chk_fail();
    }
    // x86-64 epilogue: restore rbp
    return ret;
}
ua162_load_native32 pass 33 lines
// glaurung: ua162_load_native32 @ 0x11f2
uint32_t ua162_load_native32(const uint8_t * arg0, int32_t arg1, int32_t arg2) {
    extern __attribute__((noreturn)) void __stack_chk_fail(void);
    extern int ua162_clamp(int);
    extern int ua162_fits(int, int, int);
    unsigned int value;
    int limit;
    long local_8;
    long ret;
    int var4;
    int var8;
    // x86-64 prologue: save rbp, frame 32 bytes
    local_8 = (long)(0x28);
    value = 0;
    var4 = ua162_clamp((unsigned long)((unsigned int)(arg1)));
    limit = var4;
    if ((arg0 != 0)) {
        var8 = ua162_fits((unsigned long)((unsigned int)(limit)), (unsigned long)((unsigned int)(arg2)), 4);
        if (((unsigned long)((unsigned int)(var8)) != 0)) {
            value = *(int *)(((long)arg0 + (long)(arg2)));
            ret = (unsigned long)(value);
        } else {
            ret = 0xffffffff;
        }
    } else {
        ret = 0xffffffff;
    }
    if ((local_8 != 0x28)) {
        __stack_chk_fail();
    }
    // x86-64 epilogue: restore rbp
    return ret;
}
ua162_move_field32 pass 46 lines
// glaurung: ua162_move_field32 @ 0x14f2
int32_t ua162_move_field32(uint8_t * arg0, int32_t arg1, int32_t arg2, int32_t arg3) {
    extern __attribute__((noreturn)) void __stack_chk_fail(void);
    extern int ua162_clamp(int);
    extern int ua162_fits(int, int, int);
    unsigned int held;
    int limit;
    int sum;
    int i;
    long local_8;
    long ret;
    int var12;
    int var4;
    int var8;
    // x86-64 prologue: save rbp, frame 64 bytes
    local_8 = (long)(0x28);
    held = 0;
    var4 = ua162_clamp((unsigned long)((unsigned int)(arg1)));
    limit = var4;
    sum = 0;
    if ((arg0 != 0)) {
        var8 = ua162_fits((unsigned long)((unsigned int)(limit)), (unsigned long)((unsigned int)(arg2)), 4);
        if (((unsigned long)((unsigned int)(var8)) != 0)) {
            var12 = ua162_fits((unsigned long)((unsigned int)(limit)), (unsigned long)((unsigned int)(arg3)), 4);
            if (((unsigned long)((unsigned int)(var12)) != 0)) {
                held = *(int *)(((long)arg0 + (long)(arg2)));
                *(int *)(((long)(arg3) + (long)arg0)) = held;
                for (i = 0; (i < limit); i++) {
                    sum = (sum + (unsigned int)((unsigned char)(((unsigned int)((unsigned char)(arg0[i])) & 255))));
                }
                ret = (unsigned long)((unsigned int)(sum));
            } else {
                ret = 0xfffffffd;
            }
        } else {
            ret = 0xfffffffe;
        }
    } else {
        ret = 0xffffffff;
    }
    if ((local_8 != 0x28)) {
        __stack_chk_fail();
    }
    // x86-64 epilogue: restore rbp
    return ret;
}
ua162_roundtrip pass 47 lines
// glaurung: ua162_roundtrip @ 0x15ec
int32_t ua162_roundtrip(int32_t arg0, uint32_t arg1) {
    extern __attribute__((noreturn)) void __stack_chk_fail(void);
    extern unsigned int ua162_load_be32(char *, int, int);
    extern unsigned int ua162_load_native32(char *, int, int);
    extern int ua162_store_be32(char *, int, int, unsigned int);
    extern int ua162_store_native32(char *, int, int, unsigned int);
    int result;
    int i;
    unsigned char local_20[16];
    long local_8;
    long ret;
    int var12;
    unsigned int var15;
    int var6;
    unsigned int var9;
    // x86-64 prologue: save rbp, frame 64 bytes
    local_8 = (long)(0x28);
    result = 0;
    for (i = 0; ((((unsigned long)((unsigned int)(i)) == 15) | ((long)(i) < 15)) != 0); i++) {
        *(signed char *)((&local_20[0] + (long)(i))) = 0;
    }
    var6 = ua162_store_native32((char *)(&local_20[0]), 16, (unsigned long)((unsigned int)(arg0)), arg1);
    if ((0 <= (long)((int)(var6)))) {
        var9 = ua162_load_native32((char *)(&local_20[0]), 16, (unsigned long)((unsigned int)(arg0)));
        if ((arg1 == var9)) {
            result = (result + 1);
        }
        var12 = ua162_store_be32((char *)(&local_20[0]), 16, (unsigned long)((unsigned int)(arg0)), arg1);
        if ((0 <= (long)((int)(var12)))) {
            var15 = ua162_load_be32((char *)(&local_20[0]), 16, (unsigned long)((unsigned int)(arg0)));
            if ((arg1 == var15)) {
                result = (result + 2);
            }
            ret = (unsigned long)((unsigned int)(result));
        } else {
            ret = 0xfffffffe;
        }
    } else {
        ret = 0xffffffff;
    }
    if ((local_8 != 0x28)) {
        __stack_chk_fail();
    }
    // x86-64 epilogue: restore rbp
    return ret;
}
ua162_store_be32 pass 36 lines
// glaurung: ua162_store_be32 @ 0x1441
int32_t ua162_store_be32(uint8_t * arg0, int32_t arg1, int32_t arg2, uint32_t arg3) {
    extern __attribute__((noreturn)) void __stack_chk_fail(void);
    extern int ua162_clamp(int);
    extern int ua162_fits(int, int, int);
    int limit;
    long local_8;
    unsigned char local_c[4];
    long ret;
    int var4;
    int var8;
    // x86-64 prologue: save rbp, frame 48 bytes
    local_8 = (long)(0x28);
    var4 = ua162_clamp((unsigned long)((unsigned int)(arg1)));
    limit = var4;
    if ((arg0 != 0)) {
        var8 = ua162_fits((unsigned long)((unsigned int)(limit)), (unsigned long)((unsigned int)(arg2)), 4);
        if (((unsigned long)((unsigned int)(var8)) != 0)) {
            *(signed char *)(&local_c[0]) = ((unsigned int)(arg3) >> 24);
            *(signed char *)((&local_c[0] + 1)) = ((unsigned int)(arg3) >> 16);
            *(signed char *)((&local_c[0] + 2)) = ((unsigned int)(arg3) >> 8);
            *(signed char *)((&local_c[0] + 3)) = arg3;
            *(int *)(((long)(arg2) + (long)arg0)) = *(int *)(&local_c[0]);
            ret = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg2)) + 4)));
        } else {
            ret = 0xfffffffe;
        }
    } else {
        ret = 0xffffffff;
    }
    if ((local_8 != 0x28)) {
        __stack_chk_fail();
    }
    // x86-64 epilogue: restore rbp
    return ret;
}
ua162_store_native32 pass 22 lines
// glaurung: ua162_store_native32 @ 0x13d4
int32_t ua162_store_native32(uint8_t * arg0, int32_t arg1, int32_t arg2, uint32_t arg3) {
    extern int ua162_clamp(int);
    extern int ua162_fits(int, int, int);
    int limit;
    int var1;
    int var5;
    // x86-64 prologue: save rbp, frame 40 bytes
    var1 = ua162_clamp((unsigned long)((unsigned int)(arg1)));
    limit = var1;
    if ((arg0 != 0)) {
        var5 = ua162_fits((unsigned long)((unsigned int)(limit)), (unsigned long)((unsigned int)(arg2)), 4);
        if (((unsigned long)((unsigned int)(var5)) != 0)) {
            *(int *)(((long)(arg2) + (long)arg0)) = arg3;
            return (unsigned int)(((unsigned long)((unsigned int)(arg2)) + 4));
        } else {
            return 0xfffffffe;
        }
    } else {
        return 0xffffffff;
    }
}

← 213 fixtures