MAEC TOOL NEWS:
MAECT-NC30WA-010816D
M16C/60, N16C/20シリーズ用Cコンパイラ (アセンブラ・統合化開発環境付き) NC30WAの使用上の注意事項を連絡します。
- 2ビット以上のビットフィールドと即値0(zero)との比較(==,!=)に関する注意事項
- 該当製品
NC30WA V.2.00 Release 1 ~ V.4.00 Release 2
- 内容
signed long型またはunsigned long型の2ビット以上のビットフィールドと即値0(ゼロ)とを比較した場合、不正なコードが生成される場合があります。
- 発生条件
- 以下2点の条件をすべて満たす場合に発生します。
- (1) 16ビット境界をまたいでいるunsigned long型またはsigned long型の2ビット以上のビットフィールドが存在する。
- (2) 条件文 (if, while, for) の条件式中で(1)の条件を満たすビットフィールドと即値0(ゼロ)との比較(==,!=)を行っている。
- 発生例
---------------------------------------------------------------
struct _BitF {
long b1:10; /* 発生条件(1) */
long b2:10;
long b2:12;
} bf;
void func(void)
{
if(bf.b2 != 0){ /* 発生条件(2) */
:
}
}
---------------------------------------------------------------
- 回避策
対象となるビットフィールドをテンポラリ変数に代入し、そのテンポラリ変数と即値 0(ゼロ)とを比較するようにしてください。
[例]
---------------------------------------------------------------
void func(void){
unsigned long tmp;
tmp = bf.b2; // テンポラリ変数に代入
if(tmp != 0){ // テンポラリ変数と即値0との条件比較
:
}
}
---------------------------------------------------------------
- 恒久対策
本内容は、次期バージョンアップ時に改修する予定です。