MESC TOOL NEWS:
MESCT-NC79WA-980916D
NC79WA V.3.00 Release 1
ご使用上のお願い
|
この度、7900シリーズ用Cコンパイラ(アセンブラ・統合化開発環境付き)NC79WA V.3.00 Release 1をご使用される際の注意事項をご連絡致します。本件につきましては誠に申し訳ございませんが、 本資料に示します回避策で対応くださいますようお願い致します。
far型配列に対して正しくアクセスできない場合がある
- 概 要
データサイズが「32Kバイトより大きく、かつ64Kバイト以下」のfar型配列に対して正しくアクセスできない場合があります。
- 発生条件
以下の条件を同時に満たす場合のみ発生します。
- 多次元配列、構造体のメンバが配列、もしくは配列へのポインタである。
- 配列(多次元配列の部分配列を含む)の大きさが32Kバイトより大きく、かつ64Kバイト以下である。
- 配列の添字式の型がsigned char, unsigned char, signed int型のいずれかである。
- 配列の先頭から32Kバイトより大きく64Kバイト以内の要素にアクセスする。
- 発生現象
配列の先頭から32Kバイトより大きく64Kバイト以内の要素にアクセスしようとすると、他のアドレスにアクセスしてしまいます。
- 発生例
[Cソースファイル]
-----------------------------------------------------------------------
typedef struct {
char ch[256];
} mytype;
far mytype array[0xc0];
far struct {
mytype array[0xc0];
} st, *pst;
far mytype array2[2][0xc0];
far mytype (*p2a)[0xc0];
signed int iii;
signed int jjj, kkk;
void func(void)
{
array[iii]; /* OK */
/* 構造体のメンバが配列 */
st.array[iii]; /* NG */
pst->array[iii]; /* NG */
/* 多次元配列
(補足)
配列 array2 の大きさ = 2*192*256 = 0x18000
配列 array2[jjj] の大きさ = 192*256 = 0xc000
array2 の大きさは 64K を越えますが、 array2[jjj] の大きさが
32K から 64K の間なので不具合に該当します。
*/
(*array2)[kkk]; /* NG */
array2[jjj][kkk]; /* NG */
/* 配列へのポインタ */
(*p2a)[kkk]; /* NG */
p2a[jjj][kkk]; /* NG */
}
-----------------------------------------------------------------------
- 回避策
配列の添字式を(unsigned int)にキャストしてください。
例) st.array[(unsigned int)iii];
pst->array[(unsigned int)iii];