c - 海湾合作委员会/MINGW C : re-initialize globals as on entry of main()

标签 c gcc mingw mingw32

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

我想要一种方法来从我的代码中重新初始化这些全局变量,使其进入 main() 时的状态。 , 从测试代码的角度模拟重新运行。

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

我的环境是MinGW32,我想在Linux32/Linux64下继续兼容gcc。

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

我自己的代码不使用全局变量。如果我的堆/分配变量在重新初始化后仍然存在(我可以将我需要的一切保存在本地/堆栈/自动变量中),那会很好,但不是绝对必要的。我希望经过检测的代码对其所有堆变量失去跟踪(如果未能释放的堆变量导致堆耗尽,它甚至可以被视为一项功能)。

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

TIA

最佳答案

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

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

关于c - 海湾合作委员会/MINGW C : re-initialize globals as on entry of main(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10285497/

相关文章:

C 编译器和链接器节命名

c - 使用动态内存分配的插入排序

c++ - 关于C++中float数据类型声明的困惑

java - 从 C 调用 MATLAB

c - 了解取消引用未初始化指针的 C 的未优化 asm,导致段错误

c++ - MinGW 4.6.2 std::原子指针

c - (a/b) mod n 用于大数?

C,符号常量定义中出现错误(可能在函数参数中)

c - autoconf 仅在必要时设置 -fPIC

c++ - _O_WTEXT、_O_U16TEXT、_O_U8TEXT - 这些模式在 mingw 编译器中是否可行,是否有任何解决方法?