Search code examples
cpointersfunction-pointersundefined-behaviorpointer-conversion

C function pointer type compatibility


Writing a library that works with function callbacks, I've frequently type-casted (and called) function pointers to types with the same calling convention and same signatures, but with one exception: they had parameters pointing to different types (all data), or void pointers.

Recently, I discovered that it might not be that safe, according to this: https://stackoverflow.com/a/14044244/3079266

Basically, as I understood it, if the types of the arguments are compatible, that means the function pointer types are also compatible, and there should be no problem.

Now, I've got 3 questions.

First: does this mean that, since pointers to different types are technically incompatible, what I am doing can cause undefined behaviour?

Second: where (on what architectures) can I get away with it? Are Windows x86 or x64 versions among them?

Third: where can I NOT get away with it?


Solution

    1. Yes, this is UB by itself
    2. You probably can get away with this in non-optimized non-debug builds. An optimizer may take advantage of pointer types to figure out whether two pointers can be aliased, logic which may fail if you're lying about the actual types. Debug builds of course can just check outright if there's a type mismatch.
    3. Windows is not a compiler, so that's not a sensible question as-is. Common Windows compilers do optimize builds, and ICC especially is known to have advanced optimizations.