gpt4 book ai didi

c++ - 如何调试 'Stack smashing detected' ?

转载 作者:IT老高 更新时间:2023-10-28 22:13:53 24 4
gpt4 key购买 nike

我有一个复杂的 C++ 代码。这是一个 FastCGI 程序,使用 FastCGI C++ Class library .

当我要求它提供一个非常长的网址时,我得到:

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

对于现实生活中的应用程序,这不是问题,因为我从不使用这么长的 URL,但这意味着任何人都可以终止我的服务器......我不喜欢那样。

有没有工具可以找出这个问题出现在哪里?如何使用它?

编辑:已解决

我正在这样做:

int len;
char uri[200];

len = strlen(request.params[std::string("REQUEST_URI")].c_str());
printf("%d\n", 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 或在调试器中运行您的程序。或者,如果您的系统允许,您可能会在程序被终止时进行内存转储。您还可以在调试器中查看此内存转储。

关于c++ - 如何调试 'Stack smashing detected' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10087804/

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