グローバル変数を使用する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
-gでコンパイルして、デバッガシンボルを利用してグローバルを見つけることはできますか? –
あなたは「LInux32/Linux64の下でgccと互換性を保ちたい」と言っています。Linuxシステムソリューションでも問題ありませんか? –
@DavidGelhar:良いアイデア、ありがとう。それは自動化することができます。しかし、それは静的な修飾子を持つローカル変数のために働くでしょうか?述べたように、これらは私の目標の一部です。 – fgrieu