sizeof(function pointer)
Johannes Totz
johannes at jo-t.de
Wed Jun 8 01:25:08 UTC 2011
On 01/06/2011 00:07, mdf at FreeBSD.org wrote:
> I am looking into potentially MFC'ing r212367 and related, that adds
> drains to sbufs. The reason for MFC is that several pieces of new
> code in CURRENT are using the drain functionality and it would make
> MFCing those changes much easier.
>
> The problem is that r212367 added a pointer to a drain function in the
> sbuf (it replaced a pointer to void). The C standard doesn't
> guarantee that a void * and a function pointer have the same size,
> though its true on amd64, i386 and I believe PPC. What I'm wondering
> is, though not guaranteed by the standard, is it *practically* true
> that sizeof(void *) == sizeof(int(*)(void)), such that an MFC won't
> break binary compatibility for any supported architecture? (The
> standard does guarantee, though not in words, that all function
> pointers have the same size, since it guarantees that pointers to
> functions can be cast to other pointers to functions and back without
> changing the value).
>
> Another possibility is to malloc a blob that is sizeof(int(*)(void))
> and store that in a renamed s_unused; this is a bit messier but
> guaranteed to work. I'd just rather the code be an MCF instead of a
> partial re-write.
You could add a static-assert to check for this at compile-time:
http://stackoverflow.com/questions/3385515/static-assert-in-c
e.g. something like:
STATIC_ASSERT(sizeof(void *) ==
sizeof(int(*)(void)),ptr_to_func_expected_to_be_same_size_as_data_ptr);
I've only used static-assert-like constructs in C++, so don't know how
well they behave in C...
--
Sent from my <insert random gadget here>
More information about the freebsd-hackers
mailing list