GCC / MINGW C:在main()的入口处重新初始化全局变量

时间:2012-04-23 17:43:45

标签: c gcc mingw mingw32

我正在为使用全局变量的C代码创建一个测试环境。我正在使用该术语来引用在C外部函数中声明的任何变量(带或不带static限定符),以及带有static限定符的局部变量。某些全局变量未显式初始化(​​因此初始化为0),其他全局变量初始化为常量值。

我想要一种方法从我的代码重新初始化这些全局变量到main()条目的状态,以模拟从测试代码的角度重新运行。

到目前为止,我所做的实际上是终止正在测试的代码,并使用调用system()的驱动程序立即重新运行它。这很笨拙而且有点慢(我想因为检测的可执行文件必须保存/恢复磁盘上下文)。我正在寻找更好的方法。如果有一些可以调用的运行时函数并完成工作,我想知道!

我的环境是MinGW32,我想在Linux32 / Linux64下与gcc保持兼容。

我可以使用已检测的代码作为源代码(我不想修改甚至检查),并且仅限<string.h><stdlib.h>的标准C99库函数以及可用的代码托管实施(<float.h><iso646.h><limits.h><stdarg.h><stdbool.h><stddef.h><stdint.h>)。

我自己的代码不使用全局变量。如果我的堆/ mallocated变量在重新初始化后仍然存在(我可以在本地/堆栈/自动变量中保存我需要的所有内容),那将是很好的,但不是绝对必要的。我希望已检测的代码可以忽略所有堆变量(如果它未能释放的堆变量导致堆耗尽,它甚至可以看作是一个特性。)

我模糊地想到的一件事是在C源文件的开头和结尾添加虚拟变量声明和测试代码(很容易从包装器中编译),并祈祷测试的所有全局变量代码在内存中的连续块中;这样我就可以从虚拟变量的位置找到块,并随意恢复它。这可行吗?

TIA

1 个答案:

答案 0 :(得分:1)

您总是可以在fork的开头使用main生成一些进程,这样每个进程都有自己的全局变量副本。

除此之外,我认为没有一种解决方案可以确保所有全局变量都在一个进程内重置。