2

グローバル変数を使用する C コードのテスト環境を作成しています。私はこの用語を使用して、C の外部関数 (static修飾子の有無にかかわらず) で宣言された任意の変数、および修飾子付きのローカル変数を参照していますstatic。一部のグローバルは明示的に初期化されず (したがって 0 に初期化されます)、その他は定数値に初期化されます。

main()テストされたコードの観点から再実行をシミュレートするために、コードからこれらのグローバルを のエントリ時の状態に再初期化する方法が必要です。

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

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

インストルメント化されたコードは、ソースとして利用でき (変更したり、調べたりしたくありません)、 および の標準 C99 ライブラリ関数に<string.h>加え<stdlib.h>て、ホストされた実装 ( <float.h><iso646.h><limits.h><stdarg.h><stdbool.h><stddef.h>および<stdint.h>) で利用できるものに制限されています。

私自身のコードはグローバルを使用していません。ヒープ/不正に配置された変数が再初期化後も存続する場合、それは素晴らしいことですが、絶対に必要というわけではありません (ローカル/スタック/自動変数に必要なものすべてを保存できます)。インストルメント化されたコードがすべてのヒープ変数の追跡を失うことを望みます (解放に失敗したヒープ変数がヒープの枯渇を引き起こす場合、それは機能と見なすことさえできます)。

私が漠然と考えたことの 1 つは、テスト済みコードを含む C ソース ファイルの最初と最後にダミーの変数宣言を追加し (ラッパーからコンパイルするのは簡単です)、そのテスト済みコードのすべてのグローバルが含まれていることを祈ることです。メモリ内の連続ブロック。このようにして、ダミー変数の場所からブロックを見つけて、自由に復元できます。それは確実に機能しますか?

ティア

4

1 に答える 1

1

forkの先頭でを使用して、いつでもいくつかのプロセスを生成できますmain。このようにして、各プロセスはグローバル変数の独自のコピーを持ちます。

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

于 2012-04-23T18:08:44.637 に答える