On 13 Nov 2015, at 08:35, Konstantin Belousov <kostik...@gmail.com> wrote: > > On Fri, Nov 13, 2015 at 09:18:54AM +0100, Hans Petter Selasky wrote: >> Hi, >> >> On 11/12/15 18:17, Conrad Meyer wrote: >>> These should cast through (u)intptr_t rather than unsigned long. >>> >> >> This is Linux code, and they use "unsigned long" for pointer casts >> everywhere, trying to not break their style. >> >> BTW: I added to linux_compat.c: >> >> CTASSERT(sizeof(unsigned long) == sizeof(uintptr_t)); >> >> And it survived my "tinderbox" build and I was surprised! > > FreeBSD (at least currently) runs on two kinds of ABIs: ILP32 and LP64. > ILP32 means that sizeof(int) == sizeof(long) == sizeof(void *) == 4. > For LP64, sizeof(long) == sizeof(void *) == 8, while sizeof(int) == 4. > We do not support anything else.
Note that this is not true of all downstreams. We currently have 128 and 256-bit void*s with 64-bit longs on CHERI, and I believe that bde’s version has 32-bit longs on all platforms. This kind of code *is* broken for us and we’d greatly appreciate people not writing new code that intentionally relies on undefined behaviour (round tripping a pointer via any integer type other than intptr_t is undefined in C), when a well-defined mechanism exists, just because Linux decides to do the wrong thing. David _______________________________________________ svn-src-head@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"