[petsc-dev] Function pointer conversion: undefined behavior
Karl Rupp
rupp at mcs.anl.gov
Fri Jan 25 10:26:11 CST 2013
Hi,
the Nightly test results improved slightly:
http://krupp.iue.tuwien.ac.at/petsc-test/
However, the custom Fortran stuff in C89 logs here:
http://ftp.mcs.anl.gov/pub/petsc/nightlylogs/build_arch-linux-c89_thrash.log
seem to be quite hard to fix:
warning: ISO C forbids conversion of function pointer
to object pointer type [-pedantic]
These warnings are caused by assignments of the form
void * ptr = f;
where f is a function pointer argument:
void (PETSC_STDCALL *f)(TS*,double*,Vec*,Vec*,void*,PetscErrorCode*)
A similar warning is obtained when assigning an instance of void* to
such a function pointer.
As an example, let's take the following function in
mat/matfd/ftn-custom/zfdmatrixf.c:
void PETSC_STDCALL matfdcoloringsetfunctionts_(
MatFDColoring *fd,
void (PETSC_STDCALL *f)(TS*,double*,Vec*,Vec*,void*,PetscErrorCode*))
{
(*fd)->ftn_func_pointer = (void*) f;
...
}
A look at MatFDColoring shows
struct _p_MatFDColoring{
...
void *ftn_func_pointer,*ftn_func_cntx;
};
so the only fix I can think of is to replace void* with e.g.
void (*ftn_func_pointer)(void);
in order to remain in the 'function pointer world'. This is,
nevertheless, still fairly ugly. Does anyone have a better solution for
this?
Best regards,
Karli
More information about the petsc-dev
mailing list