0

我有一个 C 函数指针数组:

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

在代码的其他地方(使用第三方工具),我在使用函数数组之前破坏了它的内容。所以,

result = functions[0]();

应该导致不可定义的行为(甚至中止正在运行的程序)。但事实并非如此。结果就好像破坏从未发生过一样。

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

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

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

如何防止编译器内联函数数组的内容?

4

2 回答 2

2

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

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

为确保您的编译器将其他地方的更改考虑在内,您必须添加volatile.

于 2017-12-14T10:31:15.110 回答
0

你的错误场景对我来说没有多大意义,但如果我们忽略它,你可以防止像这样内联:

typedef int func_t (void);

volatile func_t* const[] = {f1, f2};

这意味着编译器不能期望数组的第一项总是f1,从而无法进行优化。volatile在调用它之前强制读取函数指针地址,这意味着必须有一个地址,这意味着内联是不可能的,因为内联函数没有地址。

于 2017-12-14T10:35:38.787 回答