[解決済み】スタックスマッシュを検出しました
2022-02-11 21:58:08
質問
a.outファイルを実行しているところです。実行後、プログラムがしばらく実行され、メッセージが表示され終了してしまいます。
**** stack smashing detected ***: ./a.out terminated*
*======= Backtrace: =========*
*/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x48)Aborted*
この場合、どのような原因が考えられるでしょうか。また、どのように修正したらよいでしょうか。
解決方法は?
スタックスマッシングは、バッファオーバーフローエラーを検出するためにgccが使用する保護メカニズムが原因で発生します。例えば、次のようなスニペットです。
#include <stdio.h>
void func()
{
char array[10];
gets(array);
}
int main(int argc, char **argv)
{
func();
}
コンパイラ(この場合gcc)は、既知の値を持つ保護変数(カナリアと呼ばれる)を追加します。10を超える文字列を入力すると、この変数が破壊され、SIGABRTが発生してプログラムが終了します。
gccのこの保護機能を無効にするには、オプションの
-fno-stack-protector
をコンパイルしてください。この場合、別のエラーが表示されます。おそらく、不正なメモリ位置にアクセスしようとしているため、セグメンテーション・フォールトが発生するのでしょう。 なお
-fstack-protector
セキュリティのため、リリースビルドでは常にオンにしておく必要があります。
デバッガでプログラムを実行することで、オーバーフローのポイントについてある程度の情報を得ることができます。Valgrind はスタック関連のエラーではうまく機能しませんが、デバッガのように、クラッシュの場所と理由をピンポイントで特定するのに役立つかもしれません。
関連
-
[解決済み】Cコンパイルエラー。"変数サイズのオブジェクトが初期化されていない可能性がある"
-
[解決済み】ポインタと整数の比較で警告が出る
-
[解決済み】ポインタへの代入時に互換性のないポインタ型からの初期化警告が発生した
-
[解決済み】警告。この関数ではXが初期化されていない状態で使用される可能性があります。
-
[解決済み】 switch case: error: case label does not reduce to an integer constant
-
[解決済み】「構造体でもユニオンでもないものにメンバー'*******'を要求する」とはどういう意味ですか?
-
[解決済み】警告:組み込み関数'printf'の非互換な暗黙の宣言(デフォルトで有効]
-
[解決済み】サイズ8の無効な読み取り - Valgrind + C
-
[解決済み】0LLや0x0ULの意味は何ですか?
-
[解決済み】makefile:4。*** missing separator. 停止する
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C 言語の添え字で配列の要素値を代入すると、配列でもポインタでもベクトルでもない値になる
-
[解決済み】 strcpyとstrdupの比較
-
[解決済み】警告。この関数ではXが初期化されていない状態で使用される可能性があります。
-
[解決済み】C言語で浮動小数点例外(コアダンプ)発生
-
[解決済み] [Solved] なぜこのようなエラーが発生するのでしょうか。「データ定義に型またはストレージクラスがない」?
-
[解決済み】argv[]をint型として取得するには?
-
[解決済み】エラー:不明な型名'bool'
-
[解決済み] Cプログラムで「配列の添え字が整数でない」。
-
[解決済み】警告:式の結果が未使用の場合
-
[解決済み】Linuxソケットのwrite()でBad File Descriptorが発生するC