强制C编译器不将阵列中的条目内联



我有一个c函数指针的数组:

int f1 (void) {
    return 1;
}
int f2 (void) {
    return 2;
}
int (*const functions[])(void) = {f1, f2};

代码中的其他位置(使用第三方工具),在使用它之前,我会销毁功能数组的内容。因此,

result = functions[0]();

应导致不可定义的行为(甚至是运行程序的流产)。但这不是。结果似乎是破坏从未发生过。

目前,我可以想象这种行为的两个错误来源:

  1. 破坏不会发生
  2. 编译器在编译时嵌入了数组的内容,因此,破坏没有效果。

到目前为止,第三方工具从未表现出不破坏它应该破坏的行为。因此,我必须假设后者。

我如何防止编译器嵌入函数数组的内容?

编译器可能会插入函数,因为您声明了数组const,而不是volatile。因此,根据抽象执行模型,它可以假设数组永远不会改变。

要确保您可以更改数组,必须删除const

要确保您的编译器从其他地方考虑更改,您必须添加volatile

您的错误场景对我来说没有多大意义,但是如果我们忽略了这一点,您可以防止这样的内部插入:

typedef int func_t (void);
volatile func_t* const[] = {f1, f2};

这意味着编译器不能期望数组的第一项始终为f1,因此优化不可能。 volatile在调用函数指针地址的读取,这意味着必须有一个地址,这意味着不可能,因为内线函数没有地址。

最新更新