C, C++の障害(実行結果の異常)について
翻訳時オプション-Kunrollが有効な場合に、実行結果に誤りが生じることがあります。
障害番号 | PH04411 |
システム | CX400, FX10 |
言語 | C, C++ |
影響期間 | FX10: 未定 CX400: 2015/4 修正予定 |
現象と条件
以下の条件をすべて満たした場合、実行結果に誤りが生じることがあります。
- 以下の翻訳時オプションが全て有効である。
- "-O2"以上 (*1)
- "-Krdconv" (*1)
- "-Klib" (*1)
- "-Kunroll" (1,2)
- ソースプログラムにループが存在する。
- 条件2のループ制御変数がlong型またはunsigned long型で宣言されている。
- 条件2のループ中にchar型またはunsigned char型の配列に対するメモリアクセスが存在する。
- 条件4の配列アクセスは条件3のループ制御変数に依存している。
- 条件2のループ中にmemcpy関数を使用している。
- 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 ***と表示されると思われます。