【问题标题】:GCC/MINGW C: re-initialize globals as on entry of main()GCC/MINGW C:在 main() 的入口处重新初始化全局变量
【发布时间】:2012-05-04 08:34:03
【问题描述】:

我正在为使用全局变量的 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>)。

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

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

TIA

【问题讨论】:

  • 也许您可以使用 -g 编译并利用调试器符号来定位全局变量?
  • 你说“我想在 LInux32/Linux64 下保持与 gcc 的兼容”你适合 linux 系统解决方案吗?
  • @DavidGelhar:好主意,谢谢。那可以自动化。但这适用于具有静态限定符的局部变量吗?如前所述,这些是我的目标的一部分。
  • @PavanManjunath:是的,如果这比在 MinGW 下更容易,我可以使用 Linux,但这是第二选择。
  • 尝试在 Linux 中阅读/proc/PID/maps,第三行是您的全局变量和静态局部变量所在的位置。您可以在main() 启动之前将此区域复制到堆中,并在需要时恢复它。

标签: c gcc mingw mingw32


【解决方案1】:

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

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

【讨论】:

  • 我在 MinGW 下看不到 fork()。除此之外,这是一个好主意,尽管我仍然需要一种方法将数据表单/传输到测试代码。
  • 对,对不起。对于 Windows,它是 CreateProcess,它不是一个可移植的解决方案。哦,好吧...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 2020-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多