MESC TOOL NEWS:
MESCT-CC16-980216D
この度M16ファミリ用クロスツールキットCC16に含まれるCコンパイラcc16での使用上の注意事項についてご連絡ご連絡致します。
- 該当バージョン
全バージョンが該当します。
- ビットフィールド変数を参照する場合の注意事項
- 2.1 問題内容
- 以下に示す「問題発生条件」(1)~(7)をすべて満たす場合、ビットフィールド変数を正しく参照できない場合があります。
- 2.2 問題発生条件
| (1) | コンパイル時に最適化レベル2を含むオプション (-O2, -O3, -O6, -O7, -O, -Otime のみ、-Ospace のみ) を指定している。 |
| (2) | ビットフィールド変数に、定数または変数(演算結果を含む) を代入している。 |
| (3) | 上記(2)のビットフィールド変数の型が、char型、unsigned char型、short型、unsigned short型である。 |
| (4) | 上記(2)のビットフィールド幅が、1~7、9~15である。 |
| (5) | 上記(2)のビットフィールド変数を参照している。 |
| (6) | 上記(2)の代入と(5)の参照の間に、関数呼び出しや分岐する文がない。 |
| (7) | 上記(2)の代入と(5)の参照の間に、他のビットフィールド変数への代入がない。 |
- 2.3 記述例
--------------------------------------------------------
struct bit {
unsigned char x: 2; /* ←条件(3),(4) */
} st;
int tmp;
void foo( void )
{
st.x = tmp; /* ←条件(2) */
/* ←条件(6),(7) */
if( st.x ) { /* ←条件(5):ビットフィールド変数が
正しく参照できない場合があります。*/
~
}
}
--------------------------------------------------------
- 2.4 回避方法
- 以下に示す(1)~(3)の何れかの方法で回避してください。
| (1) | 最適化オプションとして、最適化レベル2を含まないオプション (-O0, -O1, -O4, -O5) を指定してコンパイルする。 |
| (2) | ビットフィールド変数の型を、char型またはshort型の場合はint型に変更し、unsigned char型またはunsigned short型の場合はunsigned int型に変更する。
--------------------------------------------------------
struct bit {
unsigned int x: 2; /*←unsigned int型に変更します。*/
} st;
int tmp;
void foo( void )
{
st.x = tmp;
if( st.x ) {
~
}
}
-------------------------------------------------------- |
| (3) | ビットフィールド変数を参照する際、そのフィールド幅の最大値でAND演算を行う。
--------------------------------------------------------
struct bit {
unsigned char x: 2;
} st;
int tmp;
void foo( void )
{
st.x = tmp;
if( st.x & 3 ) { /* ビットフィールド幅の最大値(この
場合3)でAND演算を行ます。*/
~
}
}
-------------------------------------------------------- |