我可以通过这种方式在静态分析中消除指针的使用吗?

时间:2014-04-13 17:46:27

标签: c pointers code-analysis static-analysis

所以基本上我使用CIL(编写一些CIL扩展)来简化一些C代码,而我想要做的是消除指针的使用(因为指针的使用可能会在下一步中引起很多麻烦分析)

以下是代码:

void foo()
{
  int a = 1;
  int* p = &a;
  int c = *p;
  *p = 3;
}

我想在我的CIL扩展中维护一个指针引用关系的映射,简化的C代码可以是:

void foo()
{
   int a = 1;
  // int *p = &a; // map:  {p : a}  just eliminate this code, and create new entry in map
   int c = a;      // substitute based on map
   a = 3;          // substitute based on map
}

这是最容易的情况,看起来很有希望。

但事情可能变得复杂,例如返回一个指针(然后必须改变这个函数的类型,当然它在CIL中也很简单)

所以我的问题是:

  • 以这种方式消除指针是否普遍可行?

  • 有任何不确定的情况吗?

1 个答案:

答案 0 :(得分:2)

我不确定你实际想要实现什么,但是消除所有指针使用几乎是不可能的。你可能能够消除一些用途(比如你的例子中相当简单的代码),但你很可能无法消除所有这些用法,因为间接用法是以很多有趣的方式使用的。

以链表为例。如果您尝试消除链接列表的指针,则需要为程序创建的每个列表节点指定一个名称。当然,您可以用数组替换列表(它涉及自己的指针算法),但这对二进制树没有帮助。这不是它的结束,有哈希表,在面向对象编程等对象之间实际上是任意链接。