C-在运行时或全局/静态变量的静态分析时重新定位全局/静态内存



问题

我正在研究大量使用全球变量的大型C项目(C99((我知道(。该程序运行良好,但最初是为运行一次并退出的设计。

因此,它依赖于它的全局/静态内存来初始化0(或声明的任何值(,在运行时,它会修改这些变量(就像大多数程序一样(。

但是,我不想在完成后退出,而是要再次运行该程序。我想制作一个对这个大程序具有控制和可见性的父程程序。对运行程序具有完全的可见性非常重要。

解决方案需要在MacOS,Linux和Windows上使用。

我已经考虑过:

1。分叉

制作一个用作" shell"的小包装程序,并根据需要执行大型程序。

PROS

  • OS在将内存重置为正确的值的艰苦工作
  • 保证按预期运行

cons

  • 失去对程序的可见性
  • 无法在运行时检查包装程序执行程序的内存,在启动之前很难调整设置,很难收集运行时信息
  • 需要实现一个系统以将内部数据输入/退出程序,可能会触摸大量代码
  • 统一的经验更加艰难(共享GUI窗口等(

2。识别手动结构

仔细阅读源,多次运行程序,等待程序在理智检查或不良内存访问中爆炸。

PROS

  • 容易做
  • 易于启动
  • 高知名度,代码共享和统一

cons

  • 不会抓住所有情况,非常拼凑的
  • 耗时

3。重构

将所有Globals收集到memset的单个结构中,为具有值初始化的变量创建初始化器。逐案处理静态。

PROS

  • 概念上容易,大锤方法
  • 高知名度,代码共享和统一

cons

  • 非常耗时,代码库大,几乎可以触摸一切

4。魔术棒

告诉OS重新初始化全局/静态内存。如果我需要保存一个值,我将在本地存储,然后在完成后将其重写。

PROS

  • 主要是完美的:(

cons

  • 不存在(?(
  • 非常黑魔法
  • 可能不是跨平台
  • 可能会愤怒第三方libs

我现在在做什么

我现在正在使用选项2,只是通过代码浏览我的方式,依靠程序崩溃并指向正确的方向。

我会说这种方法使我大约在那里的80%。我已经确定并重新定义了足够的事物,以至于该程序或多或少可以重新运行。它并不像我想的那样普遍,它给了我很多希望。

有时会发生奇怪的事情,或者它没有按预期运行,但也不会崩溃。这使得对其进行追踪更加困难。

我只需要一些东西才能让我最后20%。也许是某种静态分析工具,或者可以帮助我浏览源并查看全球范围的地方。

要轻松检测全局和静态变量,您可以尝试使用cppdepdepdepde,并执行像这样的cqlinq查询

from f in Fields where f.IsGlobal || f.IsStatic
select f

,如果您想要Speific函数或特定文件中使用的变量,也可以修改查询。

最新更新