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.
/* 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/7ua162_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/7ua162_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/7ua162_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/7ua162_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;
}
}