c++ - 将 Thumb 函数指针转换为 int 并返回

标签 c++

<分区>

将函数指针转换为 int 然后将其转换回去并进行间接调用是否是 C++ 中的未定义行为?像这样:

void f()
{
    puts("Hello\n");
}


int pf = (int)f;
//...some time later
typedef void (*PVoidFunc)();
(*(PVoidFunc)pf)();

假设 int 和 pointer 的大小相同。

编辑:架构是 32 位的——它是普通的 Android。

不过重要的是,我们讨论的是函数指针,而不是数据指针。根本问题与 Thumb 函数具有两个地址的方式有关——它们的真实起始地址(2 对齐)和需要 BLX 到的值(地址或 1)。我认为 GCC 试图在这方面变得聪明,但结果却相当虚假。

自然地,问题是这在特定情况下对我不起作用,但在非常相似的情况下有效 :) 但我想知道这是否是编译器错误,编译器试图解决棘手的底层问题问题,或未定义的未定义行为。

最佳答案

答案取决于语言(C 与 C++)、语言版本(C++98/03 与 C++11)、其他标准(例如 POSIX)和编译器。

在 C99 和更早的版本中,将函数指针转换为 void* 指针是未定义的行为。 UB 可能是一个巨大的负面影响,但在这种情况下,它意味着一个实现可以自由地提供在函数指针和指针之间转换的能力,而无需任何诊断。

在 POSIX 中,将函数指针转换为 void* 指针是必需的行为。这与 C 一起工作得很好,因为对于未定义的行为不需要诊断。

在 C++98/03 中,将函数指针转换为 void* 指针是非法行为。兼容的实现可以生成执行作者想要的代码,但它也必须发出某种诊断。

在 C++11 中,将函数指针转换为 void* 指针是有条件支持的行为。支持这些转换的实现无需任何诊断即可实现。不支持的实现(例如,哈佛架构机器的编译器)可能会立即拒绝它。


转换为/自 int?这很可疑。您应该使用可以处理 void* 指针的类型,而不是 int

关于c++ - 将 Thumb 函数指针转换为 int 并返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22107838/

相关文章:

C++ `using {var}` 不是 {child class} 的成员 - 在 MSVC 或 Clang 中使用 `std::deque` 时

c++ - 如何阻止 `/Gm-` 从 CMake 传递给 clang_cl.exe

c++ - 两个日期之间的月数 - 使用 boost 的日期

c++ - 具有不同返回类型的函数重载

c++ - 多线程客户端服务器

C++ 程序返回数字而不是 Char

c++ - 如何正确返回具有 A 类元素的 vector ?

c++ - FTP 客户端中的 recv()

c++ - 在空 map 上调用 clear 时崩溃

c++ - 如何在同一级别的大括号​​之间提取字符串?