On Jun 5, 2015, at 3:50 AM, Anders Broman <anders.broman@xxxxxxxxxxxx> wrote:
> in_cksum.c(92): error C2220: warning treated as error - no 'object' file generated
> in_cksum.c(92): warning C4311: 'type cast': pointer truncation from 'const guint16 *' to 'unsigned long'
This is trying to do 2-byte operations with word loads/stores/arithmetic instructions, but to do it safely, so that we don't do those with unaligned pointers. It's testing the low-order bit of the pointer.
On ILP32 platforms, such as 32-bit UN*Xes and 32-bit Windows, an int, a long, and a pointer are all 32 bits, so you can just cast a pointer to an int or a long.
On LP64 platforms, such as all the 64-bit UN*Xes we support, a long and a pointer are both 64 bits, so you can just cast a pointer to a long.
On LLP64 platforms, such as 64-bit Windows, an int and a long are both 32 bits, and a long long and a pointer are both 64 bits, so you can't just cast a pointer to a long without throwing away bits. Those bits don't actually *matter* in this case, but the compiler still warns.
C99 has an intptr_t type, but C90 doesn't. MSVC has it at least as far back as Visual Studio .NET 2003:
https://msdn.microsoft.com/en-us/library/323b6b3k(v=vs.71).aspx
I don't know whether any UN*X platforms we support don't have it; I suspect most if not all of them have adopted it.
Alternatively, GLib 2.18 and later have gintptr, although configure.ac currently only requires 2.16 or later.