确定呼叫功能后ARM堆栈中使用的绝对数量



我试图使我的C代码免受覆盆子pi上的堆栈溢出。我是这个初学者,所以对我有一段时间。有人告诉我,通过调用函数使用的字节数量的一种方法是通过填充知识值(例如0xFF)来初始化堆栈上的空间。然后运行该函数,然后向后搜索以查看已知值中有多少堆栈。通过在第一个不变值之前取原始的堆栈深度和堆栈深度,我可以确定该功能使用的堆栈量。听起来很合理。

我的问题是,这种装配的东西确实使我感到困惑。我一直在阅读,可以使用ASM()将ARM组件代码嵌入C代码中,但是我不确定如何初始化堆栈内存,然后返回并检查它。我可以看一下可以帮助的资源吗?我对集会非常了解,以至于我什至不知道如何形成一个很好的搜索词。

谢谢。

这应该在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放在某个文件中say fill_stack.s,然后使用您的C程序将该文件添加到编译器命令行中(或者如果不使用C编译器,将其单独组装到对象并链接)。内联装配更艰难,不值得努力。

我认为您不需要在汇编中执行此操作:您可以在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);
}

最新更新