But this means that two distinct function pointers might compare equal when converted to void*, unless the type is somehow encoded.
This is the first I'm hearing that arbitrary function pointers converted to void* should be distinct on POSIX - do you have a reference?
Pointers to different objects should not compare equal in C (or at least in C++, can't remember if this is also a rule in C). Then again, functions are not objects.