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 &lt;&lt; "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) 中的段错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 std::string.c_str() 作为另一个方法的参数时的段错误

getline 中的段错误

glGenFramebuffers 中的段错误

Windows:处理所有线程中的段错误

函数调用中的段错误

生产者消费者程序中的段错误