gpt4 book ai didi

c - 检测堆栈覆盖错误

转载 作者:太空宇宙 更新时间:2023-11-04 00:26:15 26 4
gpt4 key购买 nike

我正在为 Cortex-M3 嵌入式微 Controller (Atmel SAM3S) 开发软件我使用 IAR EWARM IDE 和编译器。我怀疑由于某种原因我有缓冲区溢出或内存泄漏,这会导致堆栈损坏,因为我突然发现自己卡在了我的代码空间之外。

我问这个问题的原因是,很难找出造成这种困惑的真正原因,我想知道当您想找出问题的原因时,您使用了哪些技术。

您是否使用内存调试器、在线跟踪调试硬件等

最佳答案

您应该尝试使用金丝雀值。这就是它的基本流程 - 假设您有一些 struct:

struct foo {
unsigned long bar;
void * baz;
};

修改它,让它看起来像这样:

struct foo {
unsigned long canary1;
unsigned long bar;
void * baz;
unsigned long canary2;
};

当您初始化struct 时,将一些任意值放入canary1canary2。每当您对 struct 执行某些操作时,请检查值是否保持不变。这样,如果您有缓冲区溢出或堆栈崩溃,您将检测到它。您可以使用自动变量在内部函数中执行相同的操作:

int foo(int bar) {
unsigned long canary1 = 0xDEADBABE;
char baz[20];
unsigned long canary2 = 0xBAD0C0DE;
...
}

等等。不要忘记在您返回 之前检查这些值是否保持不变。此外,如果您可以让您的代码始终跳转到同一位置,请尝试将一些代码放在那里(或断点)并获取堆栈跟踪。

GCC 自己知道如何添加这些金丝雀值,但我不知道你的编译器是否可以这样做。但您仍然可以手动完成。

关于c - 检测堆栈覆盖错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11082138/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com