[解決済み】「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を使うか、デバッガでプログラムを走らせるとよいでしょう。あるいは、もしあなたのシステムがそれを許すなら、プログラムが強制終了した瞬間のメモリダンプがあるかもしれません。このメモリーダンプはデバッガーで見ることもできます。
関連
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】'std::cout'への未定義の参照