2010-12-04 29 views
5

有没有一种工具可以使我的c代码溢出?在c代码中显示溢出的工具

我的意思是看看代码块有可能使寄存器移动到内存。

编辑:什么是泄漏:

在在某些时候编译代码的过程中,你将不得不做寄存器分配。编译器将执行一个干扰图(“变量”是节点,如果它们同时处于活动状态,它们将连接)。从这一点出发,有一个线性过程可以进行图着色:对于每个变量,分配一个不会干扰其他变量的寄存器......如果没有足够的寄存器对图进行着色,算法将失败 和变量(寄存器)将被溢出(移至内存)。

从软件工程的角度来看,这意味着您应该始终最小化活动变量,以便尽可能减少发生泄漏的可能性。

如果你想优化代码,你应该寻找这些东西,因为泄漏会给读/写内存带来额外的时间。我正在寻找一个工具或编译器的标志,可以告诉我哪里溢出,所以我可以优化。

+4

什么是泄漏? – 2010-12-04 19:11:57

+1

看看我的编辑:-) – 2010-12-04 20:47:56

回答

4

我知道没有这样的工具。

由于对泄漏决定从编译器编译器,甚至由给定的编译器的特定版本中设置的编译器和版本不同,任何这样的工具都必须紧密耦合到一个编译器和可能仅支持一个。

另一方面,您可以随时查看生成的程序集并查看给定的变量是否溢出。

0

一般反汇编或编译为汇编代替对象。

对于特定的编译器,如gcc和llvm(你有源代码并且可以轻松地重新编译编译器),修改编译器打印某种输出以表明它有多少次泄漏,就像你说的那样,记忆。也许在您找到寄存器分配例程时,您可能会发现编译器已经有了这样的输出。就我个人而言,我只是反汇编或编译为汇编程序。

一个通用的汇编器分析工具是可能的,但它是值得的努力?你会想知道函数/优化边界在哪里。你会想区分易失性变量,或硬件寄存器写入ram是故意的。你只能寻找基于堆栈的写入。或者查找写入堆栈的情况,这不是一次推送,其中寄存器在下一条指令中被销毁。实际上,搜索对堆栈指针相对地址的写操作是相当容易的,下一条指令销毁寄存器,并且该堆栈的相对地址在相邻的执行路径中被读回,堆栈帧尚未被清理那个执行路径。我知道这样的工具吗?不。