gpt4 book ai didi

c - 如何 stub 声明为 "extern void _x"的变量/函数

转载 作者:太空宇宙 更新时间:2023-11-04 04:31:30 24 4
gpt4 key购买 nike

我需要对一个 c 文件/模块进行单元测试,该文件包含:

/* Import the _x symbol from assem.S */
extern void _x;

该变量稍后在该文件中用作:

#define WHAT_EVER (int)&_x

汇编文件中的减速度为:

.global _x
.type _x, @function
_x:

我学会了here GCC 同意此声明。然而我学会了here我不能简单地声明:

void _x;

作为我的 stub ,因为这使得 _x 成为不完整的类型。实际上链接器会报错error: storage size of ‘_x’ isn't known 而链接器是正确的。

但是如果我声明:

int _x;

编译器给我错误:“_x”的类型冲突,这也是正确的。

软件的目标与我进行单元测试的主机不同,因此我无法包含 assem.S 文件(它不会在我的主机上编译和/或运行)。

有谁知道对这个变量 _x 进行 stub 的方法吗?

海湾合作委员会 5.3.1; std=gnu99 ; C代码

最佳答案

如果您可以选择修改引用了 _x 的文件,您应该将对此符号的访问提取到它自己的文件中。首先,我将解释如何做到这一点,其次,我将解释为什么应该这样做。

如何提取?在现有的被测文件中,您可以通过调用访问函数来替换对符号的所有访问。也就是说,不是使用宏 WHAT_EVER 的值来读取,而是调用 get_what_ever()。如果使用符号修改地址,则调用 set_what_ever(value)。这些 getter 和 setter 函数在单独的文件中实现(我们称它为 interface_to_assembly.c)。声明放在头文件 interface_to_assembly.h 中。现在,对于您的目标系统,您编译并链接修改后的文件和 interface_to_assembly.c。对于您的测试可执行文件,您可以为 interface_to_assembly.c 创建一个替代实现,也许是 interface_to_assembly_double.c。这些替代实现可以是虚拟、 stub 、 spy 、模拟或您测试所需的任何东西。

为什么这种分离是值得推荐的?首先,它消除了您要从汇编级别测试的代码与潜在的硬件之间的紧密耦合。其次,它用更好的可控函数接口(interface)取代了对全局变量的访问。但是请注意,文件 interface_to_assembly.c 中的小软件仍然不会比以前更好地测试(也就是说,它将成为目标系统上集成测试的候选者)。但是,对于其余代码(可能占大多数),可测试性大大提高:提取变量访问并将其替换为函数使得无需任何汇编级代码即可编译代码成为可能。它允许控制每个值访问。例如,可以创建一个测试设置,以便对 getter 的连续调用传递不同的值(如果您想模拟硬件设备的并发事件,这很重要)。

关于c - 如何 stub 声明为 "extern void _x"的变量/函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35829120/

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