假如不涉及数组/指针越界的话,栈有没有可能损坏

C语言 码拜 7年前 (2017-04-25) 993次浏览
求一个简单的c函数,里面没有数组/指针的越界,没有奇葩的地址操作和访问,但是可能会导致堆栈破坏或不平衡。
有可能吗? 本人想知道通常什么情况,除了写访问越界操作以外,何时堆栈可能被破坏,或不平衡?
什么时候VC的chkesp能捕捉到这样的错误,各位遇到过这种情况吗?
纯技术探讨,本人抛砖引玉了。
解决方案

20

5

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上调用约定不一样也会, 不过这个调试模式下, 也是函数返回时直接报错, 错误信息也是非常清楚..

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明假如不涉及数组/指针越界的话,栈有没有可能损坏
喜欢 (0)
[1034331897@qq.com]
分享 (0)