gccでスタックオーバーフローのチェック - WindowsXP, MinGW gcc 3.3.3

このQ&Aのポイント
  • gccでスタックオーバーフローの検出を行いたいと思っています。オプションを指定して再帰プログラムを走らせてみましたが、終了してしまいます。
  • gccのオプション-fstack-checkを使用して、スタックオーバーフローのチェックを行いたいと思っています。しかし、指定してもプログラムは突然終了してしまいます。
  • WindowsXPでMinGW gcc 3.3.3を使用しています。gccでスタックオーバーフローの検出を試みましたが、オプションが機能していないようです。
回答を見る
  • ベストアンサー

gccでスタックオーバーフローのチェック

OS:WindowsXP コンパイラ: MinGW gcc 3.3.3 gccで、スタックオーバーフローの検出を行いたいと思っています。 gcc -v --helpで見ると > -fstack-check Insert stack checking code into the program と書かれているので、そのように指定して、無限に自分を呼び続ける再帰のプログラムを走らせてみました。 gcc -fstack-check testS2.c  ですが、オプションを指定しない時と同じように突然何の前触れもなく終了してしまいます。  このオプションはスタックを使い切るかどうかをチェックするオプションではないのでしょうか。  よろしくお願いいたします。

  • annyG
  • お礼率70% (67/95)

質問者が選んだベストアンサー

  • ベストアンサー
  • aigaion
  • ベストアンサー率47% (287/608)
回答No.1

ソースコードを静的に解析してスタックオーバーフローを事前に検知するオプションではなく 生成するプログラムにスタックオーバーフローを検知するプログラムを紛れ込ませて もし、スタックオーバーフローが起きたらプログラムを強制終了するというオプションだと思いますよ。 > Insert stack checking code into the program 説明として書いてありますしね。 WEB上から拾ってきた文献から察するに、マルチスレッド環境でスタックオーバーフローが 起きた際に正常にプログラムを強制終了させるためのオプションのようです。 シングルスレッドの場合はシステムが強制終了してくれるのでこのオプションをつける必要はないとも書いてありますね。 http://uw713doc.sco.com/cgi-bin/info2html?(gcc)Code%2520Gen%2520Options コンパイラに実装されているオーバーフロー関連のチェック機能は 仮にオーバーフローが起こっても安全にプログラムを終了させるような プログラムコードをコンパイル時に追加する手法が多いです。 (オーバーフローが起こったままプログラムが動作するのはとても危険です。 まじめに検知したいなら静的解析の専門ツール探した方が良いと思いますよ。 Splint http://lclint.cs.virginia.edu/

annyG
質問者

お礼

ありがとうございます。 説明が悪くて申し訳ありませんでした。 実際にコンパイルして実行しているのですが、そのときにオプションをつけてもつけなくても同じ結果だった、という意味でした。 ご回答からその理由がシングルスレッドだからだということがわかりました。(もっとも、メッセージの一つも出してほしい気はしますが、、これではスタックオーバーフローだから終了したかどうかわからないので。。) どうもありがとうございました。

その他の回答 (1)

noname#208124
noname#208124
回答No.2

何の例外をキャッチするようにしてます?

annyG
質問者

補足

書き忘れました。 Cで書いています。

関連するQ&A

  • C# 再帰よるスタックオーバーフローについて

    VB2008 C# でプログラムしていますが、 プログラムで再帰を多く行わなくてはならず、 スタックオーバーフローが出てしまいます。 スタックオーバーフローを解決するためには、アルゴリズムを変更し、 再帰の回数を減らすしか方法はないのでしょうか? もしスタックの上限を変更する方法などがありましたら教えてください。 VBは初心者なので、なるべく簡単にお願いします。

  • .NET(C#)でのスタックオーバーフロー回避方法

    ASP.NET初心者です。初めて質問させていただきます。 ASP.NET(C#)でwin32系の外部ライブラリを使用したいのですが、そのライブラリを読み込むところで スタックオーバーフローが発生してしまいます。 同じライブラリをWindowsアプリケーション(C#)で使用したところ問題なく実行できました。 ASP.NETで同じように使用しようとするとスタックオーバーフローが発生してしまう状態です。 [デバッグ中のエラーメッセージ] xxxx.dllを読み込めません。再帰が深すぎます。スタックがオーバーフローしました。 [イベントログ] 障害が発生しているアプリケーション名: w3wp.exe、バージョン: 7.5.7600.16385、タイム スタンプ: 0x4a5bcd2b 障害が発生しているモジュール名: xxxx.dll_unloaded、バージョン: 0.0.0.0、タイム スタンプ: 0x4d92e27c 例外コード: 0xc0000005 xxxx.dllは、今回使用したいDLLです。 過去の質問等でスタックオーバーフローが発生した場合の解決策を探してはみたのですが、見つけられた方法が以下の2つでどちらもうまくいきませんでした。 (1)スタック領域を大きくする →スレッドでスタック領域を指定して実行してみました。 (2)ライブラリの中身をスタックオーバーフローが起きないように変更する → ライブラリの中身は変更できない状態です。 (1)のほうは、指定方法間違えてるかもしれません。。。 Thread newthread = new Thread(new ThreadStart(init), 0); もしくは、w3wp.exeでエラーが発生しているということはIIS関係で何かおかしなことをしてしまってるのかもとか・・・。 根本から見方が間違ってるかもしれませんが、(1)の方法の正しいやり方、もしくはそれ以外の解決策をご教授頂きますようよろしくお願いいたします。

  • 最大スタックサイズを大きくすることの影響は?

    再帰呼び出しを行うプログラムでスタックオーバーフローが発生するようになりました。 そこで最大スタックサイズを変更しようと考えていますが 最大スタックサイズを大きくすることで何か影響があることはあるのでしょうか? 他アプリ等に影響が出ないかを懸念しています。 ※最大スタックサイズは最大で16Mらしく、現在は1Mです。  特に影響がないのであれば最初から16Mにしておけば良いような気もして疑問に思っています。

  • 組み込み用マイコンのスタックについて

    お世話になっております。 現在、ルネサスのH8マイコンの開発を勉強しております。 その一環として、以前に他の人が作ったプログラムを調べたりしているのですが、スタックサイズの計算方法が分かりません。 本来純正のコンパイラであるHEWを使っていれば、付属のツールでスタックの計算が出来ることは知っているのですが、それらのプログラムは、 ・秋月のAKI-H8についてくるCコンパイラ ・BestTechのgcc用コンパイラGDL などで開発されているので、統合開発環境であるHEWのように便利なツールはついていません。 とはいえ、本来、そんなツールが無くてもスタックの計算は必須事項だとは分かっているのですが、どうやって計算したものか悩んでいます。 ソースファイルをHEW用に書き直すという手もあるのですが、ツールに頼らない 根本的なスタックの計算手法を身につけたいと考えています。 上記のコンパイラを使った場合のスタック計算について、皆様のアドバイスを頂きたいと思います。 どうかよろしくお願い致します。

  • cc と gcc の違い

    CCとGCCの違いについて教えてください。 どちらも、コンパイラという点では同じだと思うのですが、なぜ2つの方式ができたのでしょうか?? 少し話がずれますが、プログラムを汎用性も持たせるなら、どのようなオプションをつけるべきでしょうか? -ansi とか -Wall あたりをつける癖をつけておけば十分なのでしょうか?? G++とGCCの違いについても知っていれば教えて下さい 初歩的な質問ですがお願いします

  • gccコンパイルできない原因は!?

    http://okwave.jp/qa/q8650877.html  の続きですが!  以上URLから  gccコンパイルエラーとなる原因はPathにあるのかと思い!  環境変数の  Pathを  現在以下へ変更しました。冒頭URL~    今日の作業は最後にあったC:\Program Files (x86)\mingw-w64\i686-4.9.0-posix-dwarf-rt_v3-rev2\mingw32\libexec\gcc\i686-w64-mingw32\4.9.0\    を削除後  新たに一番最後に gccコンパイルするファイルががある、examplel.cのPathであるC:\msys\1.0\home\Administrator\を   を追加しました。  以下今日(2014/6/26 5:24)のpathです。 C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live;C:\Program Files\Broadcom\Broadcom 802.11 Network Adapter\Driver;;;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;;;;;;;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;c:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\Binn\;C:\Program Files (x86)\Windows Live\Shared;C:\xampp\php;C:\Program Files (x86)\QuickTime\QTSystem\;c:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Program Files\Microsoft\Web Platform Installer\;C:\msys\1.0\home\Administrator\ しかし  msysエデタで 以下となりました。  $ ls examplel.c Administrator@ADMINISTRATOR ~ $ gcc exanplel.c sh: gcc: command not found 以上のエラーが出ます。 そもそも  gccコンパイラが働いていないからのエラーどと思われます!?  参考書付録のソフトを参考書の説明通りにインストールしました。   OSがXP時代は動いていましたが  7に変えたらgccのコンパイルができなくなりました。  原因は!OS7の影響でしょうか  以下が  作業をするうえで、参考書に付録していたCD-ROMの中身です。 binutils-2.16.91-20060119-1.tar.gz gcc-core-3.4.2-20040916-2.tar.gz gdb-5.2.1-1.exe mingw.ini MinGW-5.1.2.exe mingw-runtime-3.11.tar.gz MSYS-1.0.11-2004.04.30-1.exe w32api-3.8.tar.gz  以上ですが実際にインストールするのが MinGW-5.1.2.exe MSYS-1.0.11-2004.04.30-1.exe gdb-5.2.1-1.exe です。  以上gccコンパイルができません!?  原因を知りたいです。  よろしくお願いいたします。

  • Solaris10でCコンパイラが見つからない?

    Solaris 10 1/06 X86版にphp5.1.2をインストールしようとしているのですが、下記エラーが表示されてコンパイルが終了してしまいます。 エラー内容を見るとCコンパイラが見つからないといっているようなのですが、どう対応すればいいのでしょうか・・・ Solaris10にはgccコンパイラがインストールされていると思うのですが・・・ どなたかよろしくおねがいします。 # ./configure loading cache ./config.cache checking for Cygwin environment... no checking for mingw32 environment... no checking for egrep... egrep checking for a sed that does not truncate output... /usr/bin/sed checking host system type... i386-pc-solaris2.10 checking target system type... i386-pc-solaris2.10 checking for gcc... no checking for cc... no configure: error: no acceptable cc found in $PATH

  • gccのコマンド行オプションについて

    現在仕事で、HP-UX11iからLinuxにC言語プログラムを移行する作業を行っています。 そこで、質問なのですが、HP-UXでは"+unum"というコマンド行オプションがありました。 以下がccのマニュアルに記載されている説明です。 ------------------------------------------------------------------------------- ポインタは固有に境界整列していないデータにアクセスできる。 このオプションを使用することにより、コンパイラが間接参照されたデータにアクセスする方法 が変更できる。 また、このオプションを使用すると、生成されたコードの効率が低下することがある。 numについては次のように指定可能。  1:シングルバイトの境界整列を想定する。一連のシングルバイトのロードと保管によって 間接参照が実行される。  2:一連の2バイトのロードと保管によって間接参照が実行される。  4:一連の4バイトのロードと保管によって間接参照が実行される。 ------------------------------------------------------------------------------- この様に、アラインメントの設定だと思うのですが、"gcc"のオプションで同じ性能を持つものってあるのでしょうか? ネットなどで調べても出てこないので、もしご存知でしたら、ご教授ください。 OSの環境、gccのバージョンは以下の通りです。 OS:Red Hat Enterprise Linux AS release 4 (Nahant Update 5) gcc:gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-8) わかりにくい質問だとは思いますが、よろしくお願い致します。

  • VC++6.0 Stack Overflow !!

    私はVC++6.0で画像処理のプログラムを作っています。 再帰構造を用いたある関数を呼ぶと、対象の画像によって、スタックオーバーフローでプログラムが止まってしまいます。 これを避ける方法や、スタックのサイズの変更方法がありましたら教えてください。 なお、現在、VC++のメニューの「プロジェクト」→「設定」→「リンク」タブ→「アウトプット」カテゴリからスタックアロケーションの予約のところを適当な大きな数を入力しているのですが、効果はありません。

  • 再帰呼び出しになってしまうのをループの形にしたい

    VBで繰り返して実行するプログラムを作ったのですが、 スタック領域をオーバーしてしまいます。 再帰呼び出しになっているのはわかったのですが、 改善ができません。 簡略したら下記のような状態でした。 Sub test1()  test2 End Sub Sub test2()  test1 End Sub このtest1を実行して、繰り返し作動するようにしたのですが、 当然スタックオーバーフローになります。 簡単にループに変形できるのでしょうか?

専門家に質問してみよう