------- Comment #5 from matz at gcc dot gnu dot org 2010-08-15 21:07 ------- First, yes, the work-around from the official POSIX man-pages is alias-unsafe. They added this example because ISO C doesn't allow conversion of void* pointers to function pointer, but dlsym returns a void* pointer.
There are two possibilities to use dlsym: 1) ptrtofntype f = (ptrtofntype) dlsym (...); 2) *(void**)&f = dlsym (...); The former is invalid ISO C (conversion between void* and function pointer not allowed), the latter is invalid ISO C (alias violation). So they were between a rock and a hard place, the dlsym interface was impossible to use with a strict ISO C compiler when it was used to get at addresses of functions. That's why they added language to POSIX 2008 to make conversions between void* and function-pointer types valid. They could have added a new interface in parallel to dlsym that would return a function pointer from the start. Well, they chose to add a new requirement for POSIX systems making variant (1) valid. GCC, at least on POSIX systems, should reflect this, and also make this conversion valid. In fact we're already doing the right thing for such conversions, so we only need to specify that this isn't going to change in the future and disable the warning even in pedantic mode. That means we wouldn't be a strict ISO compiler in this mode anymore. It's what happen when there are two standards in conflict with each other. I think that by default, even with -pedantic, we should not warn for the void* <-> fnptr conversion (note that POSIX only specifically allows the conversion from/to void*, not to any arbitrary data pointer type). -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45289