Renesas Synergy™

FAQ 1007969 : CA850でコンパイルすると、メッセージ W2231:Initialization of non-auto pointer using non-number initializer is not position independent. が表示されます。

回答

このメッセージは、 自動変数でないポインタ変数の値以外の初期値を用いた初期化の指示に対するコードが存在する場合に表示されます。
ポジション・インディペンデント・コード(PIC)用にサポートされたワーニングです。

例) int *ip = &i;

上記の初期化は、ipが自動変数ならば、実行時に値が代入されるのでPICとなります。
ipが自動変数でなければ、コンパイル時に値が決まり、PICにはならないので、 ワーニングが表示されます。

CA850で、プログラムをTEXTセグメント、変数をDATAセグメントに配置した場合、 プログラムの分岐や、変数の参照はTPレジスタ、GPレジスタ相対のコードになります。
これは、実行時、リンク時に配置したアドレスとは異なるアドレスにコピーされたとしても、 TPレジスタ、GPレジスタの値を設定し直せば、正常に動作するプログラムになります。

PICとは、配置されたアドレスに依存しないコードのことになります。
そのため、外部変数であるポインタ変数にアドレスを初期値として代入する場合には、 リンク時のアドレスが代入されてしまうために、実行時にアドレスが変更されると、正常に動作しません。
つまり、PICにはならないので、上記のワーニングを表示するような仕様になっています。
ただし、r0相対(CONSTセグメントなど)が使用されている場合には、 アドレスが絶対番地(0番地からの相対のため)になるため、PICにはなりません。

 

 

適用製品

V850用コンパイラパッケージ [CA850]

 

他にご質問がございましたら、リクエストを送信してください