RENESAS TOOL NEWS 2008年06月16日 : 080616/tn2
| M16Cファミリ用Cコンパイラパッケージ ご使用上のお願い
--ビットフィールド比較をする際の注意事項 |
M16Cファミリ用Cコンパイラパッケージの使用上の注意事項を連絡します。
1. 該当製品
(1) R32C/100シリーズ用Cコンパイラパッケージ V.1.01 Release 00
(2) M32Cシリーズ*1用Cコンパイラパッケージ(M3T-NC308WA)
V.1.00 Release 1 ~ V.5.10 Release 1
V.5.40 Release 00 ~ V.5.41 Release 01
(3) M16Cシリーズ*2用Cコンパイラパッケージ(M3T-NC30WA)
V.2.00 Release 1 ~ V.5.20 Release 1
V.5.40 Release 00 ~ V.5.44 Release 00
*1 M32C/80、M16C/80、およびM16C/70シリーズの総称です。
*2 M16C/60、/30、/20、/10、/Tiny、およびR8C/Tinyシリーズの総称です。
2. 内容
if-else文で1ビットのビットフィールド変数を定数の1または0と”==”または
”!=”演算子で比較し、その比較結果により代入した値を使用すると誤った
コードを生成する場合があります。
2.1 発生条件
以下の条件すべてに該当する場合に発生します。
(1) 生成コード変更オプション -fenable_register(-fER)を使用している。
(2) if-else文で1ビットのビットフィールドを、定数1またはゼロと比較
している。
(3) (2)で記載の比較に、"=="または"!="演算子を使用している。
(4) (2)で記載の定数比較で使用している定数と同じ定数を、if側またはelse
側の実行文で変数に代入している。
(5) (4)で記載の変数を、(4)で記載の代入とは別の箇所で、1回だけ使用して
いる。
2.2 発生例
------------------------------------------------------------------------
#pragma BIT s
#pragma BIT gi
extern struct {
unsigned int b0:1;
} s;
extern unsigned int gi;
void func(void)
{
register unsigned int t;
if (s.b0 == 1) {
t = 1;
} else {
t = 0;
}
t = gi; // ビットフィールドへの代入(s.b0 = gi;)のコードを生成する
}
------------------------------------------------------------------------
3. 回避策
該当するif-else文の、if側またはelse側にasm()を挿入してください。
4. 恒久対策
次バージョンで修正する予定です。