加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何调试“Stack smashing detected”?

发布时间:2020-12-16 06:01:22 所属栏目:百科 来源:网络整理
导读:我有一个复杂的c代码. 这是一个FastCGI程序,使用http://althenia.net/fcgicc 当我要求它是一个无聊的url,我得到 *** stack smashing detected ***: ./tileserve terminatedErreur de segmentation 对于现实生活,这不是一个问题,因为我从来没有使用这么长的网
我有一个复杂的c代码.

这是一个FastCGI程序,使用http://althenia.net/fcgicc

当我要求它是一个无聊的url,我得到

*** stack smashing detected ***: ./tileserve terminated
Erreur de segmentation

对于现实生活,这不是一个问题,因为我从来没有使用这么长的网址,但这意味着任何人都可以终止我的服务器….我不喜欢这样.

有没有工具(以及如何使用它?)来查找问题出现在哪里?

编辑:解决

好的解决了

我在做

int len;
char uri[200];

len = strlen(request.params[std::string("REQUEST_URI")].c_str());
printf("%dn",len);

if (len > 200) return 1;

strcpy(uri,request.params[std::string("REQUEST_URI")].c_str());

看起来,200是太高的len测试.
实际上在194没有.

所以我做了 :

if (len > 190) return 1;

现在没关系

解决方法

如果您阅读该网站,您将意识到这是一个简单的C包装C库.

C库的一个典型问题是缓冲区溢出:

#include <cstring>
#include <cstdio>

int main(int argc,char* argv[]) {
  char buffer[16]; // ought to be sufficient

  strcpy(buffer,argv[1]);
  printf("%s",buffer);
}

尝试这个程序:

> ./test "a"
a
> ./test "abcdefghijklmnoprqstuvwxyz"
???

因为缓冲区只能包含16个字符,所以其余的字符将被写入其结尾.这是堆栈粉碎和未定义的行为.

运行时库或操作系统的许多实现可能会在某些情况下检测到这种情况,并终止程序.

要么你做错事,要么是图书馆.

要找到问题,您可以使用Valgrind或在调试器中运行程序.或者,如果您的系统允许,您可能在程序被杀死的时候有内存转储.您也可以在调试器中查看此内存转储.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读