atoi(str) 中的段错误
Posted
技术标签:
【中文标题】atoi(str) 中的段错误【英文标题】:Segfault in atoi(str) 【发布时间】:2009-12-20 19:23:26 【问题描述】:我是 C/C++ 游戏的新手,所以我认为我犯了一个新手错误:
int main()
char* clen;
clen = getenv("CONTENT_LENGTH");
if (clen==NULL)
cout << "No such ENV var: CONTENT_LENGTH"<<endl;
exit(0);
int cl = 0;
cl = atoi(clen);
if (cl < 1)
return inputPage();
// if there is no content, we assume that this is a fresh request,
// so we showed the input page, otherwise, we'll return dispatch to
//the processing code.
postTest(clen);
这应该是一个 CGI 脚本。据我所知,使用 GDB、打印语句等,此代码段错误位于“cl = atoi(clen);”行我不知道为什么会这样。 K&R 认为这是正确的。我基本上从其他六个在线教程中复制了这一行。它似乎在昨晚工作!我完全被难住了。
【问题讨论】:
您发布的代码看起来不错,但它是真实的代码吗?您是复制粘贴到 SO 中,还是重新输入? 复制粘贴,直接从emacs复制粘贴即可 【参考方案1】:我不相信它真的会在 atoi() 上崩溃
你能试试这个代码吗?
#include <iostream>
#include <stdlib.h>
#ifndef NULL
#define NULL 0
#endif
using namespace std;
int main()
char* clen;
clen = getenv("CONTENT_LENGTH");
if (clen==NULL)
cout << "No such ENV var: CONTENT_LENGTH"<<endl;
exit(0);
int cl = 0;
cl = atoi(clen);
if (cl < 1)
std::cout << "return inputPage();" << std::endl;
return 0;
std::cout << "postTest();" << std::endl;
编译它,例如到“应用程序”并使用 CONTENT_LENGTH 的一些变体运行它,例如
./app
CONTENT_LENGTH=4 ./app
CONTENT_LENGTH=-4 ./app
CONTENT_LENGTH=a ./app
【讨论】:
好的,看起来这个想法就是我需要的线索。对于那些对家里感兴趣的人,我在学校集群上运行它,并且似乎无法访问我需要的 apache 日志而不追踪教授,而在本学期的这个时候,这是一个棘手的问题任务。不过,谢谢,我认为情况正在好转……【参考方案2】:除非编译器错误和错误的 getenv() 实现,我会说该代码不可能在 cl = atoi(clen)
上出现段错误。这是因为 getenv() 返回 NULL 或指向以空字符结尾的字符数组的有效指针(这只是说 C 字符串的一种奇特方式)。
由于检查了 NULL 情况,很可能程序(它不是“脚本”)在其他地方崩溃。
编辑:你怎么知道它甚至会崩溃?它是否显示 HTTP 500 错误?如果是,很可能您只是忘记了cout << "Content-type: text/html\n\n"
。网络服务器日志说明了什么?
EDIT2:与您的问题无关,但通常不赞成使用 atoi()
等 C 函数;首选 C++ 版本 lexical_cast
(在 TR1 和 boost 中实现)。
【讨论】:
是的,500 错误。好吧,这不是剧本,很公平。感谢 lexical_cast 的提示,但我不得不说,在我编程的世界里,C++ 是不受欢迎的...... ;)【参考方案3】:您写道,您一直在使用 GDB 研究它。难道不应该只是挖掘(步骤)到 atoi() 函数调用以更好地了解正在发生的事情吗?我假设您确保它永远不会到达 atoi() 调用之后的行?
【讨论】:
【参考方案4】:事实证明,这绝不是 atoi 或一般 C++ 的问题。问题是我忘记了一个非常基本的 CGI 点,即 GET 中没有 CONTENT_LENGTH,这是浏览器第一次调用不可避免的。因此,我试图摆弄为空的 clen。一旦发现没有 CONTENT_LENGTH 属性,我只需要返回 inputPage。
【讨论】:
以上是关于atoi(str) 中的段错误的主要内容,如果未能解决你的问题,请参考以下文章