2

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?

7
  • @iharob But the function pointers you pass to those functions must take void pointers or you have undefined behavior. It's okay to cast the pointers inside the functions, but the arguments should be as specified. Commented Jan 4, 2015 at 16:05
  • 4
    First question: yes. Second question: everywhere. Third question: nowhere (except for when you're answering SO questions, people here love UB and down-vote you if you don't mention it where needed). Commented Jan 4, 2015 at 16:05
  • @barakmanos: so, I should probably just warn users that technically, this can cause UB, but in reality won't? Thanks! =) Commented Jan 4, 2015 at 16:10
  • Well, I don't quite understand why you're not using the exact function prototype to begin with. Commented Jan 4, 2015 at 16:11
  • @barakmanos: that's a bit too long a story to explain in an SO comment, and it's not really interesting =) Commented Jan 4, 2015 at 16:15

1 Answer 1

2
  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.
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.