*** stack smashing detected *** 是什么意思?怎么破

一、问题来源?这是什么?

首先这个错误提示是linux上,c/c++程序中linux上运行时出错的问题。

二、这样的崩溃不处理行不行?

首先,某些测试用例对这样的崩溃不处理是可以完全通过的。但是通常情况下。这种问题必须要处理。否则你的程序移植性很差。

而且你不知道什么时候就会崩溃。

三、什么样的问题会导致这样的崩溃?

网上一搜一大把,都说访问数组越界,巴拉巴拉。那么很多人都会把重心放在数组越界上。并且这种错误一般情况下很难发现。尤其是代码量很大很大,就会非常难以发现。

四、解决这个问题的正确步骤应该是什么?

解决方案:首先要了解这个问题是什么: 属于程序访问了非法的栈空间。

访问了非法的栈空间分几种情况。

1>:数组越界。

2>:临时变量已经释放了,但是还在访问这块内存。

关于第一点:数组越界,有两种,1:普通数组越界。主要是访问下标越界

2:字符串数组越界,是不是遗漏了字符串最后面的\0

#include <iostream>
using namespace std;

int main()
{
    int a[3] = { 1, 2, 3};
    cout << a[3] << endl; //下标越界。

    char b[5] = {'c','h', 'i', 'n', 'a'};

    int len = strlen(b); // 字符串没有结尾\0
}

如果你的代码根本没有用到数组,或者和字符串都已经确保\0结束了,Name就得考虑下面这种情况。

针对第二种情况访问已经释放了的栈空间。就更加隐蔽了。当然下面例子中都是比较简单的模型。在实际代码中,几十万行代码中查找到这种错误是很困难的。

#include <iostream>
using namespace std;

bool Init(int* p)
{
    *p = 1;
    return true;
}

int main()
{
    int *p = NULL;
    {
        int a = 10;
        p = &a;
    }
    bool bl = Init(p);//访问了非法的栈空间,【栈空间已经释放】

    cout << *p << endl;
//上面小例子,部分编译器会正确输出结果,但是并不代表上述情况是正确的。
//是因为编译器还没有来得及完全释放临时变量,导致结果可能正确。
//但是实际项目中,系统非常复杂。内存的申请和释放非常的频繁。所以复杂的系统才更容易重现上述问题。

    return 0;
}
发布了20 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qd1308504206/article/details/103273447
今日推荐