MAEC TOOL NEWS:
MAECT-M3T-NC308WA_2-020916D
M3T-NC308WA V.5.00 Release 1
M3T-NC30WA V.5.00 Release 1
ご使用上のお願い
|
Cコンパイラ(アセンブラ・統合化開発環境付き) M3T-NC308WA, M3T-NC30WAの使用上の注意事項を連絡します。
- if文またはswitch文を記述した場合の注意事項
- 該当製品
- M32C/80, M16C/80, M16C/70シリーズ用
- M3T-NC308WA V.5.00 Release 1
- M16C/60, M16C/30, M16C/20, M16C/10シリーズ用
- M3T-NC30WA V.5.00 Release 1
- 内容
ある値が格納されている自動変数をif文あるいはswitch文の実行文中で別の値に更新している場合、自動変数のレジスタへの割り当てが正しく行われない場合があります。
- 発生条件
- 以下の条件をすべて満たす場合に発生することがあります。
| (1) | -O、-O[3-5]、-OR、-OSオプションのうち1つ以上を指定している。 |
| (2) | -ONBSD(-Ono_break_source_debug)オプションを使用していない。 |
| (3) | レジスタに割り当てられている自動変数がある。 |
| (4) | (3)の自動変数への代入文aがある。 |
| (5) |
if文またはswitch文の条件文があり、その条件式で評価される変数はレジスタに割り当てられている。 |
| (6) | (5)の条件文の、以下のいずれか1箇所に、(3)の自動変数への代入文bがある。
| ・ | if-else文のif節あるいはelse節の実行文のどちらか一方。 |
| ・ | if文のif節の実行文。 |
| ・ | switch文のcaseラベルおよびdefaultラベルの実行文のうち1箇所以上。
ただし、すべてのcaseラベルおよびdefaultラベルの実行文には存在しない。 | |
| (7) | 代入文bの右辺は、(5)の条件式で評価されている変数である。 |
| (8) | (5)の条件式から代入文bまでの間に(3)の自動変数へのアクセスがない。 |
| (9) | (5)の条件文の後で(3)の自動変数を参照している。 |
- 発生例
-----------------------------------------------------------
char gc,gc2;
void func(void)
{
┌
a char c = 0; /* 発生条件(4) */
└
switch(gc){ /* 発生条件(5) */
case 1:
case 2:
┌
b c = gc; /* 発生条件(6),(7) */
└
break;
default:
break;
}
if(c != 0){ /* 発生条件 (9) */
gc2++;
}
}
-----------------------------------------------------------
- 回避策
- 以下のいずれかの方法で回避してください。
- (1) 使用している-O、-O[3-5]、-OR、-OSオプションを外してコンパイルする。
- (2) -ONBSD(-Ono_break_source_debug)を使用してコンパイルする。
- (3) if文あるいはswitch文の直前にダミーのasm関数を記述する。
[例]
-----------------------------------------------------------
char gc,gc2;
void func(void)
{
char c = 0;
asm(); /* ダミーのasm関数 */
switch(gc){
case 1:
case 2:
c = gc;
break;
default:
break;
}
if(c != 0){
gc2++;
}
}
-----------------------------------------------------------
- 恒久対策
M3T-NC308WAは、次期バージョンで改修する予定です。
M3T-NC30WA V.5.00 Release 2で改修済みです。