2

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

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

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

现在,我有 3 个问题。

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

第二:我可以在哪里(在什么架构上)摆脱它?其中是 Windows x86 还是 x64 版本?

第三:我在哪里不能逃脱它?

4

1 回答 1

2
  1. 是的,这本身就是 UB
  2. 您可能可以在未优化的非调试版本中摆脱这种情况。优化器可能会利用指针类型来确定两个指针是否可以别名,如果您对实际类型撒谎,逻辑可能会失败。调试版本当然可以直接检查是否存在类型不匹配。
  3. Windows 不是编译器,所以这不是一个明智的问题。常见的 Windows 编译器会优化构建,尤其是众所周知的 ICC 具有高级优化。
于 2015-01-04T16:36:21.407 回答