我有一个复杂的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("%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或在调试器中运行程序.或者,如果您的系统允许,您可能在程序被杀死的时候有内存转储.您也可以在调试器中查看此内存转储.