ネイティブコンパイラGCC-4.0.2のテストによリ生じた問題


以下のようなtestgenテストスイートの問題点が見られた。

  1. 副作用の実装依存


     上図はFAILの原因となる、gcc.2-1-19ディレクトリのt029_extern_unsigned.cを簡略化したものである。
     ここではaの期待値を1としているが、このプログラムを-O0オプションでコンパイルして実行するとaは0となるので、
     FAILが発生する。
     しかし、最終的なaの値は1でも0でも言語仕様に適合しており、FAILが発生してはならない。
     これは、「二つの副作用完了点の間で起こる全てのことは不特定の手順で起こる」
     (詳細はhttp://gcc.gnu.org/bugs.html#nonbugs_c)  からである。
     即ち、式(a = 2)の評価結果は2であるが、副作用(aへの2の代入)は図中の二つの副作用完了点の間のどこで起きても良いので、
     最終的なaの値は1でも0でも良い。
     従って、1のみを期待値としているテストプログラムに問題があるということになる。


  2. レジスタ変数への&修飾子
     gcc.2-2-01ディレクトリでレジスタ修飾子で定義されている変数に、&修飾子をつけてしまっているテストプログラムがある。
     これは、シンタックスエラーである。


  3. 関数内で関数のstatic宣言
     gcc.4-2-04ディレクトリで関数内で関数のstatic宣言をしてしまっているテストプログラムがある。
     これも、シンタックスエラーである。


  4. float型変数の内部表現
     

     上図はgcc.4-4-02ディレクトリのfn005ディレクトリを簡略化したものである。
     float型変数やdouble型変数は、オプションやアセンブリコードの表現や環境などによって値が変わることがある。
     よって上図の比較の方法はふさわしくないのでテストプログラムに問題があるということになる。

FAIL一覧