求一个简单的c函数,里面没有数组/指针的越界,没有奇葩的地址操作和访问,但是可能会导致堆栈破坏或不平衡。
有可能吗? 本人想知道通常什么情况,除了写访问越界操作以外,何时堆栈可能被破坏,或不平衡?
什么时候VC的chkesp能捕捉到这样的错误,各位遇到过这种情况吗?
纯技术探讨,本人抛砖引玉了。
有可能吗? 本人想知道通常什么情况,除了写访问越界操作以外,何时堆栈可能被破坏,或不平衡?
什么时候VC的chkesp能捕捉到这样的错误,各位遇到过这种情况吗?
纯技术探讨,本人抛砖引玉了。
解决方案
20
5
struct big_struct {
int a[1000000]; // 足够大
};
void func (struct big_struct param)
{
return;
}
在某些调用协议、CPU、编译器下,假如 sizeof(struct big_struct) 足够大,返回的时候堆栈会直接坏掉。
int a[1000000]; // 足够大
};
void func (struct big_struct param)
{
return;
}
在某些调用协议、CPU、编译器下,假如 sizeof(struct big_struct) 足够大,返回的时候堆栈会直接坏掉。
10
无限递归会导致栈溢出
5
其实都是越界操作, 越界操作还不算啥, 这可能修改到已存在的数据, 很难检查出来.
#include <iostream> #include <functional> auto f() { int a = 0; return std::function<void()>([&]() { a = 1; }); } auto test(std::function<void()> func) { int tmp[10] = { 0 }; func(); } int main() { test(f()); return 0; }
5
x86上调用约定不一样也会, 不过这个调试模式下, 也是函数返回时直接报错, 错误信息也是非常清楚..