On Mon, May 15, 2017 at 03:13:44PM -0400, Ben Peart wrote: > + istate->last_update = (time_t)ntohll(*(uint64_t *)index); > + index += sizeof(uint64_t); > + > + ewah_size = ntohl(*(uint32_t *)index); > + index += sizeof(uint32_t); To answer the question you asked in your cover letter, you cannot write this unless you can guarantee (((uintptr_t)index & 7) == 0) is true. Otherwise, this will produce a SIGBUS on SPARC, Alpha, MIPS, and some ARM systems, and it will perform poorly on PowerPC and other ARM systems[0]. If you got that pointer from malloc and have only indexed multiples of 8 on it, you're good. But if you're not sure, you probably want to use memcpy. If the compiler can determine that it's not necessary, it will omit the copy and perform a direct load. [0] To be technically correct, all of those systems except SPARC can have unaligned access fixed up automatically, depending on the kernel settings. But such a fixup involves taking a trap into the kernel, performing two aligned loads and bit shifting, and returning to userspace, which performs about as well as you'd expect. For that reason, Debian build machines have such fixups turned off and will just SIGBUS. -- brian m. carlson / brian with sandals: Houston, Texas, US +1 832 623 2791 | https://www.crustytoothpaste.net/~bmc | My opinion only OpenPGP: https://keybase.io/bk2204
Attachment:
signature.asc
Description: PGP signature