RENESAS TOOL NEWS 2006年08月01日 : 060801/tn2
M16Cファミリ用Cコンパイラパッケージ
ご使用上のお願い
--繰り返し文にアドレス計算がある場合の注意事項-- |
M16Cファミリ用Cコンパイラパッケージ(M3T-NC308WAおよびM3T-NC30WA)の使用上の注意事項を連絡します。
- 該当製品
M32C/90, M32C/80, M16C/80, および M16C/70シリーズ用
Cコンパイラパッケージ(M3T-NC308WA)
V.1.00 Release 1 ~ V.5.40 Release 00
M16C/60, M16C/30, M16C/20, M16C/10, M16C/Tiny, および R8C/Tiny用
Cコンパイラパッケージ(M3T-NC30WA)
V.1.00 Release 1 ~ V.5.40 Release 00A
- 内容
繰り返し文にアドレス計算がある場合、ループカウンタの増分値が2以上で
あるとアドレス計算を誤ります。
- 発生条件
以下の条件をすべて満たす場合に発生します。
| (1) |
|
for文またはwhile文の繰り返し文がある。 |
| (2) |
|
ループカウンタはsigned int, unsigned int, signed shortおよびunsigned shortのいずれかである。 |
| (3) |
|
ループカウンタの増分値が2以上である。 |
| (4) |
|
繰り返し文中に配列の参照などのアドレス計算がある。 なお、その配列は signed int, unsigned int, signed shortおよびunsigned short のいずれかである。 |
| (5) |
|
繰り返し文の条件式に比較演算式があり、比較対象は定数式である。 |
| (6) |
|
繰り返し文のループカウンタやアドレス計算で使用する変数はスタックフレーム上に領域が確保された変数である。 |
| (7) |
|
最適化オプション-OSもしくは、-OS_MAX(-OSM)を使用している。 |
発生例:
------------------------------------------------
unsigned char buf[]; /* 発生条件(4) */
unsigned char *p;
for ( i=0; i<2; i+=2 ) { /* 発生条件(1)、(2)、(3)(i+=2部分)および(5) */
p = buf + i*2; /* 発生条件(4) */
*p=0x00;
}
------------------------------------------------
- 回避策
繰り返し文中にダミーのasm関数を挿入してください。
発生例の回避例:
------------------------------------------------
unsigned char buf[];
unsigned char *p;
for ( i=0; i<2; i+=2 ) {
asm(); /* ダミーのasm関数を挿入 */
p = buf + i*2;
*p=0x00;
}
------------------------------------------------
- 恒久対策
次期バージョンで改修する予定です。