我正在为使用全局变量的 C 代码创建一个测试环境。我使用该术语来指代在 C 外部函数中声明的任何变量(带有或不带有static
限定符),以及带有static
限定符的局部变量。一些全局变量未显式初始化(因此初始化为 0),其他全局变量初始化为常量值。
我想要一种将这些全局变量从我的代码重新初始化到它们进入时的状态的方法main()
,以从测试代码的角度模拟重新运行。
到目前为止,我所做的实际上是终止正在测试的代码,并使用驱动程序调用立即重新运行它system()
。这很笨拙而且有点慢(我猜是因为检测的可执行文件必须将上下文保存到磁盘/从磁盘恢复)。我正在寻找更好的方法。如果有一些运行时函数可以被调用并完成工作,我想知道!
我的环境是MinGW32,我想在Linux32/Linux64下保持与gcc的兼容。
检测代码作为源代码可供我使用(我不想修改甚至检查),并且仅限于 and 的标准 C99 库函数,<string.h>
以及<stdlib.h>
可用于托管实现的那些(<float.h>
、<iso646.h>
、<limits.h>
、<stdarg.h>
、<stdbool.h>
、<stddef.h>
和<stdint.h>
)。
我自己的代码不使用全局变量。如果我的堆/分配变量在重新初始化后仍然存在(我可以将所需的所有内容保存在本地/堆栈/自动变量中),那会很好,但不是绝对必要的。我希望检测代码能够跟踪其所有堆变量(如果未能释放的堆变量导致堆耗尽,它甚至可以被视为一个特性)。
我隐约想到的一件事是在带有测试代码的 C 源文件的开头和结尾添加虚拟变量声明(很容易从包装器编译它),并祈祷该测试代码的所有全局变量都在内存中的连续块;这样我可以从虚拟变量的位置定位块,并随意恢复它。那能可靠地工作吗?
TIA