【问题标题】:C function pointer type compatibilityC 函数指针类型兼容性
【发布时间】:2015-03-02 06:35:07
【问题描述】:

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

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

基本上,按照我的理解,如果参数的类型是兼容的,那就意味着函数指针类型也是兼容的,应该没有问题。

现在,我有 3 个问题。

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

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

第三:我哪里不能逃脱?

【问题讨论】:

  • @iharob 但是您传递给这些函数的函数指针必须采用void 指针,否则您有未定义的行为。可以在函数内部强制转换指针,但参数应该是指定的。
  • 第一个问题:是的。第二个问题:无处不在。第三个问题:无处(除了当你回答 SO 问题时,这里的人喜欢 UB,如果你没有在需要的地方提到它,就会给你投反对票)。
  • @barakmanos:所以,我可能应该警告用户技术上,这会导致 UB,但实际上不会?谢谢! =)
  • 好吧,我不太明白你为什么不使用确切的函数原型。
  • @barakmanos:这个故事有点太长了,无法在 SO 评论中解释,而且不是很有趣 =)

标签: c pointers function-pointers undefined-behavior pointer-conversion


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 2013-11-06
    • 2021-11-23
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 2021-02-26
    相关资源
    最近更新 更多