RENESAS TOOL NEWS 2005年11月01日 : RSO-H8C-051101D
H8SX, H8S およびH8ファミリ
C/C++コンパイラパッケージ V.4~V.6
ご使用上のお願い |
H8SX, H8S およびH8用 C/C++コンパイラパッケージ V.4~V.6 の使用上の注意事項を連絡します。
- 繰り返しおよび条件分岐ブロックの前後にある代入式に関する注意事項(H8C-0027)
- 該当製品
Renesas C/C++ Compiler Package for H8, H8S and H8SX family
V.4.0~V.4.0.09
V.5.0~V.5.0.06
V.6.00 Release 00 ~ V.6.01 Release 01
製品型名:
| |
V.4 |
V.5 |
V.6 |
| Windows版 | PS008CAS4-MWR | PS008CAS5-MWR | R0C40008XSW06R |
| Solaris版 | PS008CAS4-SLR | - | R0C40008XSS06R |
| HP-UX版 | PS008CAS4-H7R | - | R0C40008XSH06R |
- 内容
繰り返し文および条件分岐の実行文中に関数呼び出しがあり、
その前後に同一定数または同一変数を代入する式がある場合に、
間違った値を代入することがあります。
| 2.1 |
|
発生条件
以下の条件を全て満たした場合に発生します。
| (1) |
|
コンパイラのoptimize=1オプションを選択している |
| (2) |
|
コンパイラのgoptimizeオプションを選択している |
| (3) |
|
繰り返し制御文、または条件分岐文の実行文中に関数呼び出しがある |
| (4) |
|
(3)の繰り返しまたは条件分岐ブロックの前および後に同一の定数または変数を任意の変数に代入する式がある |
| (5) |
|
最適化リンケージエディタのoptimize=registerオプションが有効になっている |
|
| 2.2 |
|
発生例
----------------------------------------------------------
void foo(void){
a = 1; // 条件(4):同じ定数の代入がある
for( i = 0; i < 10; i++){
func(); // 条件(3):繰り返し文の中に関数呼び出しがある
}
b = 1; // 条件(4):同じ定数の代入がある
}
---------------------------------------------------------- |
- 回避策
以下のいずれかの方法で回避することができます。
| (1) |
|
コンパイラのgoptimizeオプションを選択しない |
| (2) |
|
最適化リンケージエディタのoptimize=registerオプションを有効にしない |
| (3) |
|
コンパイラのoptimize=0オプションを選択する。または、条件に該当する記述を含む関数(発生例のfoo)に対して#pragma option nooptimizeを指定する |
| (4) |
|
コンパイラのcode=asmオプションを選択する |
| (5) |
|
繰り返し文、および条件分岐文の直前にダミー関数呼び出しを挿入する
例:
----------------------------------------------------------
void dmy(){}
void foo(void){
a = 1;
dmy(); //繰り返し文の前にダミー関数呼び出し式を挿入
for( i = 0; i < 10; i++){
func();
}
b = 1;
}
---------------------------------------------------------- |
- 恒久対策
次期リビジョンで改修する予定です。(2006年1Qリリース予定)