RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

Similar documents
SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い

Cコンパイラパッケージお知らせ

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

02: 変数と標準入出力

SuperH RISC engine C/C++ コンパイラ Ver.7 不具合内容 - 過去のお知らせ SuperH RISC engine C/C++ コンパイラ Ver.7 台における不具合内容を以下に示します のチェックツールをルネサスエレクトロニクス株式会社のホームページ

PowerPoint プレゼンテーション

02: 変数と標準入出力

02: 変数と標準入出力

Prog1_10th

Microsoft Word - Cプログラミング演習(11)

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

Microsoft PowerPoint - 13th.ppt [互換モード]

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

Microsoft PowerPoint - CproNt02.ppt [互換モード]

02: 変数と標準入出力

02: 変数と標準入出力

02: 変数と標準入出力

JavaプログラミングⅠ

Microsoft PowerPoint pptx

02: 変数と標準入出力

memo

02: 変数と標準入出力

memo

プログラミング及び演習 第1回 講義概容・実行制御

Microsoft PowerPoint - 09.pptx

02: 変数と標準入出力

Microsoft PowerPoint - 5Chap15.ppt

情報処理Ⅰ演習

Taro-ポインタ変数Ⅰ(公開版).j

(2) 構造体変数の宣言 文法は次のとおり. struct 構造体タグ名構造体変数名 ; (1) と (2) は同時に行える. struct 構造体タグ名 { データ型変数 1; データ型変数 2;... 構造体変数名 ; 例 : struct STUDENT{ stdata; int id; do

02: 変数と標準入出力

第2回

Microsoft PowerPoint - kougi8.ppt

演算増幅器

Microsoft Word - Cプログラミング演習(10)

Microsoft PowerPoint - lec10.ppt

Microsoft PowerPoint - 計算機言語 第7回.ppt

Microsoft Word - Cプログラミング演習(12)

02: 変数と標準入出力

< F2D837C E95CF CF68A4A94C5816A2E6A>

PowerPoint Presentation

プログラミングI第5回

Microsoft PowerPoint ppt

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

gengo1-11

講習No.12

Microsoft Word - 3new.doc

プログラミングI第10回

Microsoft PowerPoint - 6.pptx

R2.7 ポインタの型に気を付ける R2.7.1 (1) ポインタ型は 他のポインタ型及び整数型と相互に変換してはならない ただし データへのポインタ型における void* 型との相互変換は除く (2) ポインタ型は 他のポインタ型 及びポインタ型のデータ幅未満の整数型と相互に変換してはならない た

プログラミング演習3 - Cプログラミング -

memo

Microsoft PowerPoint - 13.ppt [互換モード]

プログラミング実習I

Microsoft PowerPoint - 12.ppt [互換モード]

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Microsoft PowerPoint - 11.ppt [互換モード]

Microsoft PowerPoint - prog06.ppt

PowerPoint プレゼンテーション

プログラミング演習3 - Cプログラミング -

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ

概要 プログラミング論 構造体 構造体 複数の変数を組合わせて, ひとまとめにしたもの 簡単 重要 自己参照型, リスト 重要, 難しい S-1 S-2 新しい構造体の宣言 struct 構造体名 { データ型メ

関数の動作 / printhw(); 7 printf(" n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 (

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

数値計算

C 資料 電脳梁山泊烏賊塾 構造体 C++ の構造体 初めに 此処では Visual Studio 2017 を起動し 新しいプロジェクトで Visual C++ の Windows デスクトップを選択し Windows コンソールアプリケーションを作成する 定義と変数宣言 C++ に

Microsoft Word - Cプログラミング演習(7)

DVIOUT

プログラミング基礎

基礎プログラミング2015

目次

プログラミング基礎

ファイル入出力

第3回 配列とリスト

PowerPoint プレゼンテーション

Microsoft Word - no12.doc

Microsoft PowerPoint - 11.pptx

Microsoft Word - Training10_プリプロセッサ.docx

Microsoft PowerPoint - handout07.ppt [互換モード]

Taro-リストⅢ(公開版).jtd

Microsoft PowerPoint pptx

PowerPoint プレゼンテーション

<4D F736F F D20438CBE8CEA8D758DC03389F0939A82C282AB2E646F63>

JavaプログラミングⅠ

模擬試験問題(第1章~第3章)

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

Undestand の解析 Understand の C 言語で抽出できない依存関係について サンプルコードを用いて説明します 確認バージョン Understand 3.0 (Build 640) Understand 3.1 (Build 700) Understand 4.0 (Build 78

Prog1_6th

program7app.ppt

計算機プログラミング

Microsoft Word - no15.docx

gengo1-12

Taro-リストⅠ(公開版).jtd

Microsoft PowerPoint - 12.ppt [互換モード]

講習No.9

講習No.12

ファイル入出力

第2回講義:まとめ

Slide 1

Transcription:

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用体型のローカル変数を文字列操作関数で操作する場合の注意事項 (RXC#013) 配列型構造体または共用体の配列型メンバから読み出した値を動的初期化に用いる場合の注意事項 (RXC#014) 構造体または共用体の配列型メンバを指すポインタを使用して配列型メンバの配列を参照し さらに配 列の要素である別の構造体のメンバを参照する場合の注意事項 (RXC#015) 1. 該当製品 4 件すべての問題に以下の製品が該当します RX ファミリ用 C/C++ コンパイラパッケージ V.1.00 Release 01 ~ V.1.00 Release 02 2. #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 2.1 内容 #pragma option を使用している場合 戻り値として 1 または 2 バイトの整数型を返 す関数が 1 または 2 バイトで表現できない値を返す場合があります 2.2 発生条件以下の条件をすべて満たす場合に発生します (1) 1 または 2 バイトの整数型を戻り値として返す関数がある

(2) (1) の関数を含むコンパイル単位内に #pragma option があり その #pragma option で最適化オプション A を指定している コンパイル単位とは ソースファイルと それにインクルードされるファイルを意味します (3) #pragma option の前のソースコードに対して有効なオプション群のうち最適化オプション A に変化するオプションがある (4) (1) の関数に対して コマンドラインによって optimize=2 または optimize=max が指定されているか または #pragma option によって optimize=2 が指定されている 発生例 sample1.c: - int b; unsigned short func_ushort(unsigned short a) /* 発生条件 (1) */ unsigned short tmp; tmp = a + b + 1; return tmp; void fun(void)... #pragma option optimize=1 /* 発生条件 (2) のオプション A */ void dummy(void) - コマンドライン例 : - ccrx -output=src-optimize=2 sample1.c /* 発生条件 (4) */ /* 発生例で示した関数 func_ushort に対して有効 */ -

2.3 回避策以下のいずれかの方法で回避してください (1) 関数の戻り値を volatile 修飾した整数型の変数に一旦代入して使用する 発生例の回避例 : - int b; unsigned short func_ushort(unsigned short a) volatile unsigned short tmp; /* volatile 修飾した変数に代入 */ tmp = a + b + 1; return tmp; #pragma option optimize=1 void dummy(void) - (2) 発生条件 (1) の関数を #pragma option がない他のファイルに移動する (3) コマンドラインもしくは #pragma option を用いて 発生条件 (1) の関数に対して optimize=0 か optimize=1 が有効になるようにする 3. 共用体型のローカル変数を文字列操作関数で操作する場合の注意事項 (RXC#013) 3.1 内容共用体型のローカル変数があり その共用体のメンバを文字列操作関数で読み 書きすると 読み書きの順序を誤る場合があります 3.2 発生条件以下の条件をすべて満たす場合に 発生することがあります (1) コンパイルオプション optimize=2 または =max が有効である 注 : デフォルトでは optimize=2 が有効になっています (2) コンパイルオプション library=intrinsic が有効である 注 : デフォルトでは library=intrinsic が有効になっています

(3) 共用体型のローカル変数がある (4) 文字列操作関数 memcpy, strcpy および strncpy のいずれかを使用した (3) の共用体メンバのメモリ領域の読み出しまたは書き込みがある (5) (4) の関数は 以下を満たしている - memcpyの場合 第 3 引数 ( 転送サイズ ) が 1 以上の定数である - strncpyの場合 第 3 引数 ( 転送サイズ ) が 1 以上の定数で かつ第 2 引数 ( コピー元 ) が第 3 引数のバイト数以上のバイト数 (NULL 文字を含む ) の文字列リテラルである - strcpyの場合 第 2 引数 ( コピー元 ) が 1 バイト以上 (NULL 文字を含む ) の文字列リテラルである (6) 以下のいずれかを満たしている (a) コンパイルオプションspeedが有効である (b) コンパイルオプションsizeが有効であり (5) の転送サイズが 1,2または4バイトのいずれかである 注 : sizeはデフォルトでは有効になっています (7) (4) と同じ共用体内の領域が重なっている別のメンバに対し 読み出しまたは書き込みを行っている (8) (7) のメンバのアドレスが取得されていない memcpy の場合の発生例 : -------- - #include <string.h> union U char a[4]; long b; u1, u2; void main(char *p) union U u0; /* 条件 (3)*/ u1.b = u0.b; p+=4; memcpy(u0.a, p, 4); /* 条件 (4)(5) および (6)*/ u2.b = u0.b; /* 条件 (7)(8)*/

-------- - 問題が発生すると 条件 (4) と (7) の処理順序が入れ替わります 生成コード例 : -------- - _main: SUB #04H,R0 MOV.L [R0],R4 ; 発生例の発生条件 (7) にあたる u0.b の値を R4に格納... A MOV.L #_u1,r5 MOV.L R4,[R5] MOV.L #_u2,r5 MOV.L 04H[R1],[R0] ; 条件 (4) のmemcpy MOV.L R4,[R5] ; 発生条件 (7) の読み出し ; memcpy 関数で読み出した値ではなく A の値を 使う RTSD #04H -------- - 3.3 回避策以下のいずれかの方法で回避してください (1) 該当の文字列操作関数を使用している関数内で 発生条件 (7) で読み出し または書き出したメンバのアドレスを参照する 発生例の場合の回避例 : 以下を関数内の任意の場所に追加する &u0.b; (2) 発生条件 (3) の変数を volatile 修飾する (3) コンパイル時に -library=function を使用する (4) コンパイル時に -optimize=0 または =1 を使用する

4. 配列型構造体または共用体の配列型メンバから読み出した値を動的初期化に用いる場合の注意事項 (RXC#014) 4.1 内容動的初期化に含まれる初期化式 ( 右辺 ) が 変数を含む式を添え字とする配列 型構造体または共用体の配列型メンバの読み出しをする場合 間違ったアドレス から読み出すことがあります 4.2 発生条件以下の条件をすべて満たす場合に発生します (1) 配列型メンバを持つ配列型構造体または共用体がある (2) n(1) の配列型メンバと配列型構造体または共用体とで 互いの要素の数が 異なる (3) 変数 n を用いた動的な初期化式があり その式は (1) の配列型メンバの要素 を以下のいずれかの方法で読み出す演算式を含む (a) 添え字を n としたメンバ配列参照 (b) 配列型メンバ名のアドレスに 変数 n を加算したアドレスで間接参照 (c) 配列型メンバ名のアドレスに定数を加減算して 変数 n を加算したアド レスでポインタ間接参照 (4) 変数 n が 0 の場合 (3) で読み出される配列型メンバの要素のアドレスが 配 列型構造体または共用体の先頭アドレスと同じである (5) n(3) の配列型メンバは 配列型構造体または共用体からメンバ演算子 (. ま たは ->) を用い ポインタ型変数等を経由せずに直接指し示されている (6) コード実行時 変数 n が 0 ではない 発生条件を満たすと 条件 (3) の演算式で配列型メンバを読み出すとき 配列要 素のアドレスが正しく計算されず 間違ったアドレスから読み出します 発生例 1 ( 発生条件 (3)(a) に該当する場合 ): union short a[3]; /* 条件 (1) および (2)*/ s1[2]; /* 条件 (1) および (2)*/ int func01(int n)

int ret = s1[0].a[n]; /* 条件 (3)(a),(4) および (5)*/ return ret; 発生例 2 ( 発生条件 (3)(b) に該当する場合 ): struct short a[3]; /* 条件 (1) および (2)*/ s2[2]; /* 条件 (1) および (2)*/ int ans02; void func02(int n) int ret = *(s2->a + n); /* 条件 (3)(b),(4) および (5) */ ans02 = ret + 1; 発生例 3 ( 発生条件 (3)(c) に該当する場合 ): struct char a,b; short c[3]; /* 条件 (1) および (2)*/ s3[2]; /* 条件 (1) および (2)*/ int ans03; void func03(int n) int ret = *(s3->c - 1 + n); /* 条件 (3)(c),(4) および (5) */ ans03 = ret + 1; 4.3 回避策以下のいずれかの方法で回避してください (1) 動的初期化を用いない 発生例 1 の回避例 :

------------------------------------------------------------ union short a[3]; s1[2]; int func01(int n) int ret; ret = s1[0].a[n]; /* 初期化式ではなく代入式にする */ return ret; ------------------------------------------------------------ (2) 配列型構造体の場合 発生条件 (4) を満たさないように配列型メンバの位置を変更する 発生例 2の回避例 : ------------------------------------------------------------ struct int dummy; /* メンバの位置を変更する */ short a[3]; s2[2]; int ans02; void func02(int n) int ret = *(s2->a + n); ans02 = ret + 1; ------------------------------------------------------------ (3) 発生条件 (3)(c) に該当する場合 演算式中の定数を変数に置き換える 発生例 3の回避例 : struct char a,b; short c[3]; s3[2]; int ans03;

void func03(int n) int x = -1; int ret = *(s3->c + x + n); /* 演算式中の定数式を変数に置き換える */ ans03 = ret + 1; 5. 構造体または共用体の配列型メンバを指すポインタを使用して配列型メンバの配列を参照し さらに配列の要素である別の構造体のメンバを参照する場合の注意事項 (RXC#015) 5.1 内容構造体または共用体 (A) に配列型メンバがあり その配列型メンバの配列の各要 素が構造体 (B) のとき 構造体または共用体 (A) の配列型メンバのアドレスをポイ ンタとして使用して ( または配列型メンバを指すポインタを使用して ) 配列型メンバ を配列参照し さらに構造体 (B) のメンバを参照すると誤ったアドレスを参照する 場合があります 5.2 発生条件以下の条件をすべて満たす場合に発生します (1) 配列型メンバを持つ構造体 (A) または共用体 (A) がある (2) A のメンバのアドレスを 以下のいずれかを用いて取得している (a) メンバ名 (b) メンバ名または配列参照にアドレス演算子 (&) を適用 (3) 以下のいずれかの式がある (a) (2) の式にオフセットを加算している (b) (2) の式を配列参照に使用している (c) (2) の式を構造体 B へのポインタにキャストし オフセットを加算している (d) (2) の式を構造体 B へのポインタにキャストし 配列参照している (4) (3) の式に適用するメンバ演算子 (. または ->) によって メンバ参照して いる (5) (4) の式を用いて 書き込みまたは読み出しを行っている

発生例 1 ( 発生条件 (2)(a) および (3)(a) に該当する場合 ): struct BS long a; ; struct ST long a; struct BS st[3]; at[1] = 1,2, 3, 4; /* 条件 (1)*/ long x; func() x = (((struct BS*)at->st) + 1)->a; /* 条件 (2a),(3a),(4) および (5) */ xには正しくは3が入りますが 参照アドレスを誤るため2が入ります 発生例 2 ( 発生条件 (2)(b) および (3)(b) に該当する場合 ): struct BS int a; ; struct ST int a; struct BS st[4]; at = 1,2, 3, 4, 5; /* 条件 (1)*/ int x; func() x = ((struct BS*)&at.st[0])[1].a; /* 条件 (2b),(3b),(4),(5) */ xには正しくは3が入りますが 参照アドレスを誤るため4が入ります 発生例 3 ( 発生条件 (2)(b) および (3)(c) に該当する場合 ): struct BS long a,b; ; struct ST long a[2],b,c,d; at = 1, 2, 3, 4, 5; /* 条件 (1)*/ func() ((struct BS*)&at.a + 1)->b = 9; /* 条件 (2b),(3c),(4),(5)*/

4が格納されている領域を正しくは 9 に変更しますが 書き込み領域を誤るため 3が格納されている領域が 9 に書き変わります 5.3 回避策アドレス参照の結果を 別のポインタ型の変数に代入して使用してください 発生例 1 の回避例 : struct BS long a; ; struct ST long a; struct BS st[3]; at[1] = 1, 2, 3, 4; */ long x; func() struct BS *ptr; ptr = (struct BS*)at->st + 1; /* アドレス計算の部分をポインタに代入して それを使用 x = ptr->a; 発生例 2の回避例 : struct BS int a; ; struct ST int a; struct BS st[4]; at = 1,2, 3, 4, 5; int x; func() struct BS *ptr = &at.st[0];

*/ /* アドレス計算の部分をポインタに代入して それを使用 x = ptr[1].a; */ 発生例 3の回避例 : struct BS long a,b; ; struct ST long a[2],b,c,d; at = 1, 2, 3, 4, 5; func() struct BS *ptr; ptr = (struct BS*)&at.a + 1; /* アドレス計算の部分をポインタに代入して それを使用 ptr->b = 9; 6. 恒久対策 4 件の問題はすべて V.1.01 Release 00 で改修済みです V.1.01 Release 00 の詳細は <RX ファミリ用 C/C++ コンパイラ V.1.01 Release 00 へのリビジョンアップのお知らせ>を参照ください 以下の URL でも参照できます (7 月 15 日から公開予定 ) http://hitachisoft.jp/products/rx-c/news/doc/revup_rxcv10100.pdf