【问题标题】:Segfault in atoi(str)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复制粘贴即可

标签: c++ segmentation-fault atoi


【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多