C でスタック破壊が検出されたエラー

Mehvish Ashiq 2023年10月12日
  1. stack smashing detected C のエラー
  2. C の stack smashing detected エラーを修正
C でスタック破壊が検出されたエラー

このチュートリアルでは、原因を強調し、C の stack smashing detected エラーを解決します。

この問題に直面している人は、メモリとスタック レイアウトの分割を理解する必要があります。 C プログラミングでのコーディング中に、このエラーの原因を特定するのに役立ちます。

stack smashing detected C のエラー

通常、コンパイラ (ここでは GCC コンパイラについて説明します) は、バッファ オーバーフローを防ぐためにこのエラーを生成します。 バッファ オーバーフローは、ユーザー入力がバッファ (一時記憶域) の容量を超えるたびに発生します。

その場合、コンパイラはスタック破壊が検出されましたというエラーをスローします。 次のコード スニペットを参照してください。ユーザーが 10 文字を超える文字を入力すると、スタック破壊が検出されましたというエラーが発生します。

コード例:

#include <stdio.h>

int main(int argc, char **argv) {
  char array[10];
  printf("Please enter your username.");
  gets(array);
  return 0;
}

このエラーはバッファ オーバーフローとスタックの概念を取り囲んでいるため、メモリとスタック レイアウトの分割を理解することが重要です こちら

バッファ オーバーフローは危険なプロセスであるため、コンパイラはさまざまな保護メカニズムを利用してこのエラーを防ぎます。 メカニズムの 1つは、ランダムに生成された値である カナリア として知られています。

コンパイラ (GCC) は、既知の値を持つ保護変数 (カナリアと呼ばれる) を追加します。 バッファがオーバーフローすると、カナリアが上書きされます。

さらに、コンパイラは既知の値と比較してスタックが侵害されていることを識別し、スタック破壊が検出されましたというエラーを生成します。

バッファオーバーフロー保 変数を防ぎ、いくつかの洞察を得るために、コンパイル中に -fno-stack-protector を使用して GCC の保護を無効にすることができます。 たとえば、$ gcc -o filename -fno-stack-protector.

この方法では、不正なメモリ位置にアクセスしようとするため、segmentation fault エラーが発生する可能性が高くなります。 fstack-protector はセキュリティ機能であるため、リリース ビルドではオンにする必要があることに注意してください。

C の stack smashing detected エラーを修正

では、このエラーを修正してプログラムをスムーズに実行するにはどうすればよいでしょうか。

スタック プロテクターを防止することがこの問題の解決策であるとは言えませんが、このエラーを修正するために使用できるいくつかの洞察を見つけるのに役立ちます. デバッガーでプログラムを実行することにより、オーバーフローの原因に関する詳細を取得することもできます。

Valgrind は、スタック関連の問題やエラーに対してはうまく機能しませんが、デバッガーは、クラッシュの理由と場所を特定するのに役立つ場合があります。 バグのあるコードを見つけて修正し、深刻なセキュリティの脆弱性を回避してください。

著者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

関連記事 - C Error