gpt4 book ai didi

c - Solaris 64 位上的函数指针导致堆损坏

转载 作者:行者123 更新时间:2023-11-30 20:26:12 26 4
gpt4 key购买 nike

我在 Solaris 5.10 64 位上有以下 C 代码,使用 CC 5.10 编译,带有标志 -m64 -KPIC -x04

header.h

typedef struct functions
{
double (* pfComputeGeneric) (myStruct *, myStruct *, double, double *, int);
} functions;

...

double myCompute(myStruct *, myStruct *, double, double *, int);

source.c

double myCompute(myStruct * px1, myStruct *px2, double d1, double *pd1, int i1)
{
// Do stuff with px1
}

...

myStruct *pxStruct = alloc(...);
functions *pxFunctions = alloc(...);
pxFunctions->pfComputeGeneric = myCompute;

...

double dResult += pxFunctions->pfComputeGeneric(pxStruct, pxStruct, 0.0, NULL, 0);

source.c 中的代码运行良好(没什么奇怪的),直到我通过函数指针 pfCompute 输入进入 myCompute,其中 >px1 被损坏。我不知道为什么。

通过直接调用 myCompute 替换通过 pfCompute 的调用可以解决该问题。

删除 -x04 选项也可以解决该问题。

我看了this question的答案但我确信我不会弄乱指针的大小。

最佳答案

我认为这确实是-x04的问题。当我查看汇编调用时,我看到:

...
0x0000000000987eb2: myCaller+0x081a: movq 0xfffffffffffffe28(%rbp),%rcx
0x0000000000987eb9: myCaller+0x0821: movq $0x0000000000000006,%rax
0x0000000000987ec0: myCaller+0x0828: movq 0xfffffffffffffe08(%rbp),%rdi
0x0000000000987ec7: myCaller+0x082f: call *0x0000000000000018(%rdi)
0x0000000000987eca: myCaller+0x0832: addq $0x0000000000000010,%rsp

因此编译器使用%rdi (!)从pxFunctions获取myCompute的真实地址。在 64 位中,%rdi 用于存储函数的第一个参数,从而进行更改。

关于c - Solaris 64 位上的函数指针导致堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26409827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com