RENESAS TOOL NEWS 2008年06月16日 : 080616/tn3
| M16Cファミリ用Cコンパイラパッケージ ご使用上のお願い
--メンバ選択演算子でvolatile修飾した変数を 使用する際の注意事項 |
M16Cファミリ用Cコンパイラパッケージの使用上の注意事項を連絡します。
- メンバ選択演算子でvolatile修飾した変数を使用する際の注意事項
1. 該当製品
(1) R32C/100シリーズ用Cコンパイラパッケージ V.1.01 Release 00
(2) M32Cシリーズ*1用Cコンパイラパッケージ(M3T-NC308WA)
V.1.00 Release 1 ~ V.5.41 Release 01
(3) M16Cシリーズ*2用Cコンパイラパッケージ(M3T-NC30WA)
V.1.00 Release 1 ~ V.5.44 Release 00
*1 M32C/80、M16C/80、およびM16C/70シリーズの総称です。
*2 M16C/60、/30、/20、/10、/Tiny、およびR8C/Tinyシリーズの総称です。
2. 内容
メンバ選択演算子(->)を使用して演算子の左辺である参照先(構造体)、右辺
(メンバ)、またはそれら両方をvolatile修飾している式を記述したときに、
非volatile変数として扱った、誤ったコードを生成する場合があります。
2.1 発生条件
以下の条件をすべて満たす場合に発生します。
(1) ->演算子を使用している。
(2) (1)の演算子の左辺である参照先(構造体)、右辺(メンバ)、またはそれら
両方をvolatile修飾している
(3) (1)の左辺の型がvolatile修飾したポインタ型ではない。
2.2 発生例
------------------------------------------------------------------------
struct S1 {
int m;
};
struct S1 volatile *p;
void func(void)
{
p->m; // volatileオブジェクトの参照
}
------------------------------------------------------------------------
volatileオブジェクトを参照するコードを生成しません。
3. 回避策
ポインタにvolatile修飾子をつけてください。
例)
------------------------------------------------------------------------
struct S1 {
int m;
};
struct S1 volatile * volatile p;
void func(void)
{
p->m;
}
------------------------------------------------------------------------
4. 恒久対策
次バージョンで修正する予定です。