我正在尝试将模块用于单元测试。 我正在删除的模块使用包含一组函数指针的结构。 它还提供了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会遇到这个问题呢?