C 函数指针类型兼容性



编写一个使用函数回调的库时,我经常将函数指针类型转换为(和调用)到具有相同调用约定和相同签名的类型,但有一个例外:它们具有指向不同类型(所有数据)或 void 指针的参数。

最近,我发现它可能不是那么安全,根据这个:https://stackoverflow.com/a/14044244/3079266

基本上,据我了解,如果参数的类型是兼容的,这意味着函数指针类型也是兼容的,应该没有问题。

现在,我有3个问题。

首先:这是否意味着,由于指向不同类型的指针在技术上是不兼容的,我正在做的事情可能会导致未定义的行为?

第二:我在哪里(在什么架构上)可以侥幸逃脱?其中有Windows x86或x64版本吗?

第三:我哪里不能逃脱?

  1. 是的,这本身就是UB
  2. 您可能可以在未优化的非调试版本中解决此问题。优化器可能会利用指针类型来确定两个指针是否可以别名,如果您在实际类型上撒谎,逻辑可能会失败。调试版本当然可以直接检查是否存在类型不匹配。
  3. Windows不是编译器,所以这不是一个明智的问题。常见的Windows编译器确实会优化构建,特别是ICC具有高级优化。

相关内容

  • 没有找到相关文章

最新更新