MESC TOOL NEWS:
MESCT-CC16-981001D
この度、M16ファミリ用クロスツールキットCC16に含まれるCコンパイラcc16のご使用上の注意事項をご連絡いたします。
該当バージョン
本症状は全バージョンが該当します。
バージョン番号を調べるには、cc16に起動オプション"-V"を指定するとで確認できます。
ローカルな配列の参照が不正になる問題
- 問題内容
以下に示す問題発生条件(1)~(4)をすべて満たす場合、ローカルな配列の参照が不正となります。
- 問題発生条件
- コンパイル時に、最適化レベル4を含むオプション(-O4, -O5, -O6, -O7, -O, -Otimeのみ, -Ospaceのみ)を指定している。
- ローカルな配列変数がある。
- 関数呼び出しがあり、引数に(2)のアドレスを渡している。
- (3)の関数呼び出し以降に、(2)の参照を2回以上行っている。
- 記述例
----------------------------------------------------------------------
extern void foo2( int * );
extern int x;
extern int y;
void foo( void )
{
int mx[1]; /* 条件 (2) */
foo2( &mx[0] ); /* 条件 (3) */
x = mx[0]; /* 条件 (4) */
y = mx[0]; /* 条件 (4) */
}
----------------------------------------------------------------------
- 回避方法
以下に示す(1)~(4)の何れかの方法で回避してください。
- コンパイル時に、最適化レベル4を含むオプションを指定しない。
- 問題発生条件(2)の配列にvolatile宣言を行う。
--------------------------------------------------------------------
extern void foo2( volatile int * ); /* volatile を付加する。 */
extern int x;
extern int y;
void foo( void )
{
volatile int mx[1]; /* volatile を付加する。 */
foo2( &mx[0] );
x = mx[0];
y = mx[0];
}
--------------------------------------------------------------------
- 問題発生条件(2)の配列をグローバル変数にする。
--------------------------------------------------------------------
extern void foo2( int * );
extern int x;
extern int y;
int mx[1]; /* グローバル変数にする。 */
void foo( void )
{
foo2( &mx[0] );
x = mx[0];
y = mx[0];
}
--------------------------------------------------------------------
- ポインタ変数を用意して、ポインタにより参照する。
--------------------------------------------------------------------
extern void foo2( int * );
extern int x;
extern int y;
void foo( void )
{
int mx[1];
int *mp = mx; /* ポインタ変数を用意する。*/
foo2( mp ); /* ポインタ変数を使用する。 */
x = *mp; /* ポインタ変数を使用する。 */
y = *mp; /* ポインタ変数を使用する。 */
}
--------------------------------------------------------------------