1

我在嵌入式设备上遇到了一个问题,我认为这可能与堆栈溢出有关。

为了测试这一点,我计划用魔法字节填充堆栈,然后通过检查有多少魔法字节完好无损,定期检查堆栈是否溢出。

但我无法让标记堆栈工作的例程。该应用程序不断崩溃。这就是我在程序入口处所做的。

    //fill most of stack with magic bytes
    int stackvar = 0;
    int stackAddr = (int)&stackvar;
    int stackAddrEnd = stackAddr - 25000;
    BYTE* stackEnd = (BYTE*) stackAddrEnd;

    for(int i = 0; i < 25000; ++i)
    {
        *(stackEnd + i) = 0xFA;
    }

请注意,分配的堆栈大于 25k。所以我指望此时已经使用了一些堆栈空间。另请注意,堆栈从较高地址向较低地址增长,这就是我尝试从底部向上填充的原因。

但正如我所说,这将崩溃。我一定在这里遗漏了一些东西。

4

2 回答 2

2

据我所知,您可能很容易stackEnd在循环的最后几次迭代中覆盖变量的内容。这显然是一件坏事,因为您在同一个循环中使用它。在你的循环中停止,比如说24900,有帮助吗?

我建议根据您平台上整数的大小在一个计算良好的值处停止循环。

于 2012-11-01T17:02:45.067 回答
1

正如其他人已经指出的那样,您覆盖stackEnd. 根据您的字节顺序,最终会得到一个指向 0xXXXXFAFA 的指针,该指针已经比 25000 大(64250)或指向其他地方的 0xFAFAXXXX 的指针。

由于这是一个嵌入式设备,因此是与 i386 完全不同的架构,因此堆栈很有可能向上而不是向下增长。

于 2012-11-01T17:12:33.257 回答