我试图使我的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);
}