グローバル変数を使用する 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 ソース ファイルの最初と最後にダミーの変数宣言を追加し (ラッパーからコンパイルするのは簡単です)、そのテスト済みコードのすべてのグローバルが含まれていることを祈ることです。メモリ内の連続ブロック。このようにして、ダミー変数の場所からブロックを見つけて、自由に復元できます。それは確実に機能しますか?
ティア