3

私は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、printステートメントなどでわかる限り、このコードは「cl = atoi(clen);」の行でsegfaultsします。なぜなのかわかりません。K&Rは、これが正しいことを示唆しています。私は基本的に、この行を他の6つのオンラインチュートリアルからコピーしました。そして、それは昨夜働いているようでした!私は完全に困惑しています。

4

4 に答える 4

2

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;

}

たとえば「app」にコンパイルし、CONTENT_LENGTHのいくつかのバリエーションで実行します。

./app
CONTENT_LENGTH=4 ./app
CONTENT_LENGTH=-4 ./app
CONTENT_LENGTH=a ./app
于 2009-12-20T19:38:47.773 に答える
1

コンパイラのバグとバグのあるgetenv()の実装を除けば、そのコードがでセグメンテーション違反を起こすことは不可能だと思いますcl = atoi(clen)。これは、getenv()がNULLまたはnullで終了する文字配列への有効なポインターを返すためです(これは、C文字列を表すための空想的な方法です)。

NULLの場合がチェックされるため、プログラム(「スクリプト」ではない)が別の場所でクラッシュする可能性があります。

編集:それがクラッシュすることさえどうやって知っていますか?HTTP 500エラーが表示されますか?はいの場合、おそらくあなたは単に忘れcout << "Content-type: text/html\n\n"ました。Webサーバーのログは何と言っていますか?

EDIT2:あなたの問題とは無関係ですが、通常、のようなC関数を使用することatoi()は嫌われています。C ++バージョンlexical_cast(TR1およびboostで実装)が推奨されます。

于 2009-12-20T19:28:37.463 に答える
0

あなたはGDBでそれを見てきましたと書いています。何が起こっているのかをよりよく理解するために、atoi()関数呼び出しを掘り下げる(ステップする)ことは可能ではないでしょうか?atoi()呼び出しを過ぎてラインに到達しないことを確認したと思いますか?

于 2009-12-20T19:51:22.417 に答える
0

これは、atoiや一般的なC++の問題ではないことがわかりました。問題は、非常に基本的なCGIポイントを忘れていたことです。つまり、GETにCONTENT_LENGTHがないということです。これは、ブラウザーからの最初の呼び出しである必要があります。したがって、私はヌルであるクレンをいじろうとしていました。CONTENT_LENGTH属性がないことがわかったら、すぐにinputPageを返す必要がありました。

于 2009-12-22T16:42:32.007 に答える