1. ホーム
  2. c++

[解決済み】「Stack smashing detected」をデバッグする方法とは?[クローズド]

2022-02-06 05:35:44

質問

私は複雑なc++のコードを持っています。 これはFastCGIプログラムである。 FastCGI C++ クラスライブラリ .

非常に長いurlを要求すると、私は得る。

*** stack smashing detected ***: ./tileserve terminated
Erreur de segmentation

実際の用途では、そんなに長いURLは使わないので問題ないのですが、これでは誰でも私のサーバーを終了させることができることになります...。それは嫌ですね。

この問題の発生箇所を調べるツールはありますか? また、どのように使用すればよいのでしょうか?

編集部:解決済み

こんなことしてました。

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文字しか入らないので、残りの文字はバッファの終端を越えて書き込まれます。これは スタックスマッシュ , そして 未定義の動作 .

ランタイムライブラリやOSの実装の中には、条件によってはこの状況を検知してプログラムを終了させるものが多数あります。

どちらか あなた が間違っているか ライブラリ があります。

問題を見つけるには、Valgrindを使うか、デバッガでプログラムを走らせるとよいでしょう。あるいは、もしあなたのシステムがそれを許すなら、プログラムが強制終了した瞬間のメモリダンプがあるかもしれません。このメモリーダンプはデバッガーで見ることもできます。