sizeof(function pointer)

Nathan Whitehorn nwhitehorn at freebsd.org
Wed Jun 1 00:41:57 UTC 2011


On 05/31/11 18:18, Warner Losh wrote:
> On May 31, 2011, at 5:07 PM, 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.
> It is the same on MIPS too for all three ABIs that we support (and all ABIs that I know about).  It is true on ARM as well.
>
> Usually it is different only on segmented architectures like 16-bit x86.

It is also true on ARM, PPC, PPC64, and ia64, which I just tested. I 
think you're safe.
-Nathan


More information about the freebsd-hackers mailing list