2012-04-23 15 views
2

グローバル変数を使用するCコード用のテスト環境を作成しています。私はこの用語をC外部関数(static修飾子の有無にかかわらず)で宣言された変数と、static修飾子を持つローカル変数を参照するために使用しています。一部のグローバルは明示的に初期化されていないため(0に初期化されます)、その他のグローバルは定数値に初期化されます。GCC/MINGW C:main()のエントリ時にグローバルを再初期化する

これらのグローバルを自分のコードから、main()のエントリにある状態に再初期化して、テストされたコードの観点から再実行をシミュレートしたいと思います。

これまでのところ、私が実際にテストしているコードを終了し、ドライバプログラムsystem()を使ってすぐに再実行します。これは不器用で少し遅いです(私は、インストルメントされた実行可能ファイルがディスクに/からコンテキストを保存/復元する必要があるためです)。私はより良い方法を探しています。呼び出すことができ、ジョブを実行するいくつかのランタイム関数がある場合、私は知りたい!

私の環境はMinGW32です。Linux32/Linux64ではgccとの互換性を維持したいと考えています。

インストルメントコードは(私は、変更あるいは検討ませんしたいこと)源として、私には利用可能で、<string.h><stdlib.h>の標準C99ライブラリ関数に制限され、プラスホストされた実装に利用可能なもの(<float.h><iso646.h><limits.h>,<stdarg.h>,<stdbool.h>,<stddef.h>および<stdint.h>)。

私自身のコードではグローバルは使用されません。私のヒープ/ mallocated変数が再初期化で生き残っていればいいですが(私はローカル/スタック/自動変数に必要なものすべてを保存することができます)。実装されたコードでは、すべてのヒープ変数を追跡する必要があります(ヒープ変数が空いていないとヒープ枯渇の原因となった場合でもフィーチャと見なすことができます)。

私が漠然と考えていたことの1つは、Cソースファイルの先頭と末尾にテスト済みコードを追加することです(ラッパーからコンパイルするのは簡単です)。テストされたコードはメモリ内の連続ブロックにあります。この方法で、ダミー変数の場所からブロックを見つけて自由に復元することができます。それは確実に機能するでしょうか?あなたはいつもあなたのmainの先頭にforkを使用して、いくつかのプロセスを起動することができます

TIA

+1

-gでコンパイルして、デバッガシンボルを利用してグローバルを見つけることはできますか? –

+0

あなたは「LInux32/Linux64の下でgccと互換性を保ちたい」と言っています。Linuxシステムソリューションでも問題ありませんか? –

+0

@DavidGelhar:良いアイデア、ありがとう。それは自動化することができます。しかし、それは静的な修飾子を持つローカル変数のために働くでしょうか?述べたように、これらは私の目標の一部です。 – fgrieu

答えて

1

、この方法は、各プロセスは、グローバル変数の独自のコピーを持っています。

それ以外は、すべてのグローバルが1つのプロセス内からリセットされることを保証するソリューションはないと思います。

+0

MinGWの下にfork()はありません。それ以外にも、私はまだデータフォームをテストされたコードにトンネリングする方法が必要ですが、それは良いアイデアです。 – fgrieu

+1

よろしくお願いいたします。それはWindows用の 'CreateProcess'であり、移植可能な解決策ではありません。しかたがない... – mihai

関連する問題