0

我正在尝试使我的 c 代码免受 Raspberry Pi 上的堆栈溢出的影响。我是这方面的初学者,所以请耐心等待。有人告诉我,确定调用函数使用的字节量的一种方法是通过用已知值(例如 0xff)填充堆栈空间来初始化堆栈空间。然后运行该函数,然后向后搜索以查看有多少堆栈从已知值更改。通过获取原始堆栈深度和第一个未更改值之前的堆栈深度,我可以确定该函数使用的堆栈数量。对我来说听起来很合理。

我的问题是这个组装的东西让我很困惑。我一直在阅读我可以使用 asm() 将 ARM 汇编代码嵌入到我的 c 代码中,但我不确定如何初始化堆栈内存,然后返回并检查它。有没有我可以查看的资源会有所帮助?我对汇编知之甚少,以至于我什至不知道如何形成一个很好的搜索词。

谢谢。

4

2 回答 2

2

这在 asm 中应该很容易做到,前提是您很清楚可以安全地走多远(您甚至可以将其作为参数传递)

.globl fill_stack
fill_stack:
  mov r2,sp
  mvn r3,#0
fsloop:
  stmdb r2!,{r3}
  subs r0,r0,#1
  bne fsloop
  bx lr

上面的C原型是

void fill_stack ( unsigned int );

其中参数是要填充的 32 位字数。

将 asm 放在某个文件中,比如 fill_stack.s 并将该文件与您的 c 程序一起添加到您的编译器命令行中(或者如果您不以这种方式使用 c 编译器,则将其单独组装到对象和链接中)。内联汇编更难,不值得努力。

于 2012-11-01T00:40:18.540 回答
0

我认为您不需要在汇编中执行此操作:您可以在 C 中执行此操作

void stack_init(unsigned int size)
{
        int i;
        unsigned char mem[size];

        for (i = 0; i < size; i++)
                mem[i] = 0xAA; /* Best not to use 0 or all ones */
}

unsigned int stack_check(unsigned int max)
{
        int i;
        unsigned char mem[max];

        for (i = max - 1; i >= 0; --i) {
                if (mem[i] != 0xAA)
                        break;
        }
        return i + sizeof(int);
}
于 2012-10-31T23:07:53.703 回答