C, C++の障害(実行結果の異常)について

翻訳時オプション-Kunrollが有効な場合に、実行結果に誤りが生じることがあります。

障害番号 PH04411
システム CX400, FX10
言語 C, C++
影響期間 FX10: 未定
CX400: 2015/4 修正予定

現象と条件

以下の条件をすべて満たした場合、実行結果に誤りが生じることがあります。

  1. 以下の翻訳時オプションが全て有効である。
    • "-O2"以上 (*1)
    • "-Krdconv" (*1)
    • "-Klib" (*1)
    • "-Kunroll" (1,2)
  2. ソースプログラムにループが存在する。
  3. 条件2のループ制御変数がlong型またはunsigned long型で宣言されている。
  4. 条件2のループ中にchar型またはunsigned char型の配列に対するメモリアクセスが存在する。
  5. 条件4の配列アクセスは条件3のループ制御変数に依存している。
  6. 条件2のループ中にmemcpy関数を使用している。
  7. memcpy関数の第3引数に、条件5と同一のループ制御変数を指定している。

*1: 翻訳時オプション-Kfastで誘導されます。

*2: 翻訳時オプション-O2以上で誘導されます。

<プログラム例>

void foo(char *x, char *y, char *z, int n) {
   long i;             /* 条件(3) */
   /* ループA */
   for (i=0; i<n; ++i {
      z[i]=1;          /* 条件(4),(5) */
      memcpy(x,y,i);     /* 条件(6),(7) */
   }
}

原因

コンパイラのループアンローリング後のアドレス計算の最適化に誤りがありました。

回避方法

以下のいずれかの回避方法を実施してください。

a) 翻訳時オプション-Knounrollを指定する。

b) 翻訳時オプション-Knordconvを指定する。

c) 翻訳時オプション-Knolibを指定する。

d) 翻訳時オプション-Koclを有効とし、かつソースプログラムの対象ループに最適化指示子nounrollを追記する。

チェックツール

チェックコンパイラのツールを以下に格納しております。

/center/local/chkcmp/SPC-246-1
+ FX10_check_compiler_cross  ← FX10 クロス版
+ FX10_check_compiler_own    ← FX10 オウン版
+ PCC_check_compiler       ← CX400版

使用方法につきましては、各ディレクトリーのREADMEファイルの【スクリプトファイルを使用しない】をご参照してください。

→ 例題の-Y0オプションの /tmp/check_compiler の部分は、上記の格納ディレクトリーをご指定下さい。

使用例 (CX400の場合)

※チェックするプログラムについては、お客様のプログラムで実施いただく必要がございます。 本障害用のサンプルプログラムはございません。ご了承ください。 下記は「PH04411.c」の例となります。

[cx01 ~]$ ls -l /center/local/chkcmp/SPC-246-1/PCC_V10_checkcompiler/sample/PH04411.c
-rw-r--r-- 1 xxxxxx center 638 Nov 10 15:33 /center/local/chkcmp/SPC-242-1/PCC_V10_checkcompiler/sample/PH04411.c
[cx01 ~]$ cd /center/local/chkcmp/SPC-246-1/PCC_V10_checkcompiler/sample
[cx01 sample]$ fcc -O2 -Krdconv -Klib -Kunroll -Y0,/center/local/chkcmp/SPC-246-1/PCC_V10_checkcompiler/lib PH04411.c
***** PH04411 found ***** "PH04411.c", line 11
***** PH04411 found ***** "PH04411.c", line 11 → 該当する場合、上記、形式でメッセージが出力されます。

※本障害の場合、*** PH04155 found ***と表示されると思われます。