MAEC TOOL NEWS:
MAECT-M3T-NC30WA-020801D
M3T-NC30WA V.5.00 Release 1
ご使用上のお願い
|
M16C/60, M16C/30, M16C/20, M16C/10シリーズ用Cコンパイラ (アセンブラ・統合化開発環境付き) M3T-NC30WA V.5.00 Release 1の使用上の注意事項を連絡します。
- 条件式が同じである2つのif文が連続している場合の注意事項
- 最適化により不正にif文等の条件文のコードを削除する場合があります
- 条件式が同じである2つのif文が連続している場合の注意事項
- 1.1 内容
- 条件式が同じである2つのif文が連続している場合、「System Error」が発生する、または不正なコードを出力する場合があります。
- 1.2 発生条件
- 以下の条件をすべて満たす場合に発生します。
| (1) |
最適化オプション -O、-O[3-5]、-OR、または -OS のうち、1つ以上を使用していて、かつ -ONBSD(-Ono_break_source_debug)を使用していない。 |
| (2) |
条件式が同じである2つのif文が連続していて、そのif文とif文の間には処理の記述がない。
(以降、最初のif文をif文Aとし、後のif文をif文Bとする。) |
| (3) | (2)の条件式に使用される変数は、自動変数あるいは関数の引数である。 |
| (4) | if文Aの実行文中の最後にif文がある。 |
| (5) | if文Bの実行文中の最初にif文がある。 |
| (6) |
(5)のif文の条件式の先頭に使用されている変数が、(4)のif文の条件式にも使用されている。 |
| (7) | (6)の変数は、以下の条件をすべて満たす。
...・global変数あるいはstatic変数である。
...・volatile修飾子で宣言されていない。
...・型が以下のいずれかである
_Bool
signed char unsigned char
signed int unsigned int
signed short unsigned short
signed long unsigned long
|
- 1.3 発生例
-------------------------------------------------------------------------
int gi1; /* 発生条件(7) */
int gi2;
char gc;
void func(void)
{
int ac = gc + 2;
┌ if(ac){ /* 発生条件(2)(3) */
| :
| if(gi2 == 7 && gi1 == 6){ /* 発生条件(4)(6) */
A gi1 = 3;
| }
| }
└ /* 発生条件(2) */
┌ if(ac){ /* 発生条件(2)(3) */
| if(gi1 == 5 && gi2 == 8){ /* 発生条件(5)(6) */
| gi1 = 5;
B }
| :
| }
└
}
---------------------------------------------------------------------------
- 1.4 回避策
- 以下のいずれかの方法で回避してください。
- (1)発生条件(2)のif文Aとif文Bの間に、ダミーのasm関数を記述する。
- (2)最適化オプション -ONBSD(-Ono_break_source_debug)を使用してコンパイルする。
[例]
-------------------------------------------------------------------------
int gi1;
int gi2;
char gc;
void func(void)
{
int ac = gc + 2;
┌ if(ac){
| :
| if(gi2 == 7 && gi1 == 6){
A gi1 = 3;
| }
| }
└
asm(); /* ダミーのasm関数を記述する */
┌ if(ac){
| if(gi1 == 5 && gi2 == 8){
| gi1 = 5;
B }
| :
| }
└
}
---------------------------------------------------------------------------
- 1.5 恒久対策
- 本内容は、次期バージョンにて改修する予定です。
M3T-NC30WA V.5.00 Release 1 ご使用上のお願い
MAECT-M3T-NC30WA-020801D
- 最適化により不正にif文等の条件文のコードを削除する場合があります
- 2.1 内容
- 最適化オプションを使用して、if-else文をコンパイルすると、if-else文の条件文に対するコードが不正に削除される場合があります。
- 2.2 発生条件
- 以下の条件をすべて満たす場合に発生します。
| (1) |
最適化オプション -O、-O[1-5]、-OR、および -OS のうち、1つ以上を使用している。 |
| (2) | if-else文がある。 |
| (3) | (2)のif-else文節の後に別の条件文 (switch文を含む) または繰り返し文 (for, while, do-while) があり、その条件判定では自動変数が使用されている。 |
| (4) | (2)のif-else文のif節またはelse節中のいずれか一方に条件文がある。 |
| (5) |
(2)のif-else文のif節およびelse節中の両方に、同じ自動変数への代入文があり、いずれか一方は(4)の条件文の判定により実行される。 |
| (6) | (5)の代入文は、(3)の条件判定の結果をすべて同一にする。 |
| (7) |
(2)のif-else文と(3)の条件文または繰り返し文の間に、(5)の自動変数を参照する文がない。 |
- 2.3 発生例
[例1]
-------------------------------------------------------------------------
void func(void) {
int k; /* 発生条件 (5) */
k = 0;
┌ if(i == 0){
│ k = 1; /* 発生条件 (5)(6) */
│ }else{
│ if(j == 0){ /* 発生条件 (4) */
(2) k = 1; /* 発生条件 (5)(6) */
│ }
│ if(j == 1){ /* 発生条件 (4) */
│ k = 1; /* 発生条件 (5)(6) */
│ }
└ }
/* 発生条件 (7) */
┌ if(k == 1) /* 発生条件 (3) */
│ gi++;
(3) :
│ :
└ }
-------------------------------------------------------------------------
[例2]
-------------------------------------------------------------------------
void func(void) {
int k; /* 発生条件 (5) */
k = 0;
┌ if(i == 0){
│ k = 1; /* 発生条件 (5)(6) */
│ }else{
│ switch(j){ /* 発生条件 (4) */
│ case 0:
│ case 1:
(2) k = 1; /* 発生条件 (5)(6) */
│ break;
│ }
│ if(j == 1){ /* 発生条件 (4) */
│ k = 1; /* 発生条件 (5)(6) */
│ }
└ }
/* 発生条件 (7) */
┌ if(k == 1) { /* 発生条件 (3) */
│ gi++;
(3) :
│ :
└ }
-------------------------------------------------------------------------
- 例1、2のようなソースファイルでは発生条件(3)の条件式に対するコードが削除されます。
| 理由: |
発生条件(2)のif-else文の変数kに、即値1が代入されない場合でもM3T-NC30WAは発生条件(3)の条件式において変数kの値は即値1であると判断してしまい、その結果、コードが不正に削除されます。 |
- 2.4 回避策
- 削除される条件文の直前にダミーのasm関数を挿入してください。
----------------------------------------------------------
void func(void) {
int k;
k = 0;
if(i == 0){
k = 1;
}else{
if(j == 0){
k = 1;
}
if(j == 1){
k = 1;
}
}
asm(); /* ダミーasm関数 */
if(k == 1)
gi++;
}
----------------------------------------------------------
- 2.5 恒久対策
- 本内容は、次期バージョンにて改修する予定です。