RENESAS TOOL NEWS 2004年12月16日 : RSO-M3T-NC308WA_1-041216D
M3T-NC308WA および M3T-NC30WA
ご使用上のお願い
-- if文の制御式中にある配列要素の評価について --
|
Cコンパイラパッケージ M3T-NC308WAおよびM3T-NC30WA の使用上の注意事項を連絡します。
- if文の制御式中にある配列要素の評価に関する注意事項
- 該当製品
M32C/90, M32C/80シリーズ, M16C/80 およびM16C/70シリーズ用:
M3T-NC308WA V.3.10 Release 1 ~ V.5.10 Release 1
M16C/60, M16C/30, M16C/Tiny, M16C/20, M16C/10, およびR8C/Tinyシリーズ用:
M3T-NC30WA V.5.00 Release 1 および V.5.10 Release 1
- 内容
If文の制御式の中に、配列の要素と定数との等不等の評価式が複数ある場合、不正なコードを生成します。
- 発生条件
以下の条件をすべて満たす場合に発生します。
| (1) | if文の制御式中に配列の要素と定数を比較する条件式が複数ある。 |
| (2) | (1)の条件式は "==" または "!=" で比較している。 |
| (3) | (1)の配列はunsigned char型、またはsigned char型である。 |
| (4) | (1)の配列の要素に対する添え字は連続している。 |
| (5) | (1)の条件式はすべてOR演算子で結合されている。 |
| (6) | コンパイルオプション-O4または-O5を指定している。または-O1、-O2、-O3、-OR、および-OSのいずれかひとつ以上の指定に加えて-Ocompare_byte_to_word(-OCBTW)を指定している。 |
発生例
-------------------------------------------------------------------------
int i;
char c[10]; /* 発生条件(3)および(4) */
void func(void)
{
if( c[0] == 0x1 || c[1] == 0x0 ) /* 発生条件(1),(2)および(5) */
i = 1;
else
i = 0;
}
-------------------------------------------------------------------------
- 回避策
以下の方法で回避してください。
| (1) |
コンパイルオプション-O4または-O5を指定している場合は、OR演算子で結合している条件式を分割してください。
例
-----------------------------------------------------------------------
int i;
char c[10];
void func(void)
{
if( c[0] == 0x1 )
i = 1;
else if( c[1] == 0x0 )
i = 1;
else
i = 0;
}
----------------------------------------------------------------------- |
| (2) |
-O1、-O2、-O3、-OR、および-OSのうちひとつ以上の指定に加えて-OCBTWを指定している場合は、-OCBTWを指定しないでください。 |
- 恒久対策
M3T-NC308WA V.5.20 Release 1およびM3T-NC30WA V.5.20 Release 1以降では発生しません。
M3T-NC308WAおよびM3T-NC30WAはこちらからオンラインバージョンアップできます。