C 函数指针类型兼容性
C function pointer type compatibility
编写一个使用函数回调的库,我经常将函数指针类型转换(和调用)到具有相同调用约定和相同签名的类型,但有一个例外:它们有指向不同类型的参数(所有数据),或空指针。
最近,我发现它可能不是那么安全,据此:
基本上按照我的理解,如果参数的类型是兼容的,那就意味着函数指针类型也是兼容的,应该没有问题。
现在,我有 3 个问题。
首先:这是否意味着,由于指向不同类型的指针在技术上是不兼容的,我正在做的事情会导致未定义的行为?
第二:我在哪里(在什么架构上)可以摆脱它? Windows 是 x86 还是 x64 版本?
第三:哪里逃不掉?
- 是的,这就是 UB
- 您可能可以在未优化的非调试版本中解决这个问题。优化器可能会利用指针类型来确定两个指针是否可以别名,如果您对实际类型撒谎,这种逻辑可能会失败。调试版本当然可以直接检查是否存在类型不匹配。
- Windows 不是编译器,所以这不是一个明智的问题。常见的 Windows 编译器会优化构建,尤其是 ICC 具有高级优化。
编写一个使用函数回调的库,我经常将函数指针类型转换(和调用)到具有相同调用约定和相同签名的类型,但有一个例外:它们有指向不同类型的参数(所有数据),或空指针。
最近,我发现它可能不是那么安全,据此:
基本上按照我的理解,如果参数的类型是兼容的,那就意味着函数指针类型也是兼容的,应该没有问题。
现在,我有 3 个问题。
首先:这是否意味着,由于指向不同类型的指针在技术上是不兼容的,我正在做的事情会导致未定义的行为?
第二:我在哪里(在什么架构上)可以摆脱它? Windows 是 x86 还是 x64 版本?
第三:哪里逃不掉?
- 是的,这就是 UB
- 您可能可以在未优化的非调试版本中解决这个问题。优化器可能会利用指针类型来确定两个指针是否可以别名,如果您对实际类型撒谎,这种逻辑可能会失败。调试版本当然可以直接检查是否存在类型不匹配。
- Windows 不是编译器,所以这不是一个明智的问题。常见的 Windows 编译器会优化构建,尤其是 ICC 具有高级优化。