使用函数指针返回结构 - 指针被破坏

时间:2014-07-08 12:19:27

标签: c pointers memory-management stack function-pointers

我正在尝试将模块用于单元测试。 我正在删除的模块使用包含一组函数指针的结构。 它还提供了API,它为struct指定了所需的函数指针,并返回结构返回给用户的指针。

我的问题是在用户层函数指针中指向垃圾(除了存根层之外的其他东西)。但是,如果我将指向包含函数指针的结构的指针传递回存根层,它们是正确的,我可以调用这些函数。

module_A.c:

struct generic_intf {
    int (*open)(struct generic_intf *intf);
    void (*close)(struct generic_intf *intf);
};

struct generic_intf *intf = intf_load(some_enum);

printf( "user addr of intf: %p\n", ( void * )intf);
printf( "user addr of intf->open: %p\n", ( void * )intf->open);

helper_function(intf);    

intf->open(intf); //fatal: Illegal Instruction Signal

stub.c:

static int dummy_open(struct ipmi_intf *intf);
static void dummy_close(struct ipmi_intf *intf);

struct generic_intf dummy_intf = {
    open:       dummy_open,
    close:      dummy_close,
};

struct generic_intf *intf_load(enum)
{
    //switch case on enum
        return &dummy_intf;
}

void helper_function(struct generic_intf *intf)
{
    printf( "stub addr of intf: %p\n", ( void * )intf);
    printf( "stub addr of intf->open: %p\n", ( void * )intf->open);
    intf->open(intf); //works just as intended
}

作为输出,我会得到一些东西:

user addr of intf: 0x612560
user addr of intf->open: 0x40ef23
stub addr of intf: 0x612560
stub addr of intf->open: 0x404556

这与堆栈有关吗?但那么实际模块如何正常工作,我的UT会遇到这个问题呢?

0 个答案:

没有答案