2010/8/14 Philipp Thomas <Philipp.Thomas2@gmx.net>:
On Fri, 13 Aug 2010 19:44:38 +0200, Cristian Morales Vega <cmorve69@yahoo.es> wrote:
The thing is the offending code is
"*(void **)(&comp_compress) = dlsym(handle, "comp_compress");"
So, the question: could gcc -O2 really break that code? Or that's a false warning and I can be 100% safe ignoring it?
Yes, it can. The C compiler assumes the normal aliasing rules, i.e. that objects of one type can only be accessed through pointers of the same type or char/void pointers. Therefor the compiler will organize the code depending on whether it finds other accesses or not.
And before you remark it, there is a difference between 'void **' and 'void *' and the standard does only cover 'void *'. The only way I know of to correct the code would be to use a union, i.e. for the csine example
{ void *handle; double (*cosine)(double); char *error; union{ void *vp; double (*cos)(double); }pun.
handle = dlopen("libm.so", RTLD_LAZY);
if (!handle) { fprintf(stderr, "%s\n", dlerror()); exit(EXIT_FAILURE); }
dlerror(); /* Clear any existing error */
pun.vp = dlsym(handle, "cos); cosine = pun.cos.
if ((error = dlerror()) != NULL) { fprintf(stderr, "%s\n", error); exit(EXIT_FAILURE); }
GCC guarantees that the union trick works.
a) I hate the world b) It worked, thanks. Since I'm going to bookmark this for future reference, for completeness: any idea about if this is different in C++? Is there "void *" to a function pointer defined? Also, I'm not sure about how the Single UNIX Specification, IEEE and The Open Group are mixed. But at http://www.opengroup.org/onlinepubs/009695399/functions/dlsym.html it says "Due to the problem noted here, a future version may either add a new function to return function pointers, or the current interface may be deprecated in favor of two new functions: one that returns data pointers and the other that returns function pointers." And at the header it says "IEEE Std 1003.1, 2004 Edition". Wikipedia says there exists POSIX:2008... so, there is any new function that returns function pointers? -- To unsubscribe, e-mail: opensuse-packaging+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-packaging+help@opensuse.org