大きいオブジェクトに関する Polyspace コンパイル エラーの修正
問題
コンパイル中に解析が停止し、オブジェクトが大きすぎるとのメッセージが示されます。
原因
このエラーは、選択されたターゲットのポインター サイズには大きすぎるオブジェクト (配列、共用体、構造体、クラスなど) が検出された場合に発生します。
たとえば、次の例では、「Limitation: struct or union is too large
」というメッセージが表示されます。ポインター サイズは 16 ビットと指定されています。ポインターに割り当てられるオブジェクトの最大サイズにより、オブジェクトで許容される最大サイズは、216-1 バイトとなります。しかし、構造体は次のように宣言されています。
struct S { char tab[65536]; }s;
struct S { char tab[65534]; int val; }s;
解決法
指定のポインター サイズを、ターゲット プロセッサ タイプによってチェックします。詳細は、
ターゲット プロセッサ タイプ (-target)
を参照してください。たとえば、次のように、カスタム ターゲット
My_target
のポインター サイズが 16 ビットであるとします。コードを変更するか、異なるポインター サイズを指定します。
たとえば、次のようにします。
構造体で宣言する配列のサイズを小さくします。
事前定義されたターゲット プロセッサ タイプが使用されている場合、ポインター サイズは、ターゲット アーキテクチャでのポインター サイズと同じになるとみられます。したがって、こうした宣言により、ターゲット アーキテクチャでエラーが発生する可能性があります。
可能であれば、指定のターゲット プロセッサ タイプのポインター サイズを変更します。
それ以外の場合は、ポインター サイズがより大きい別のターゲット プロセッサ タイプを指定するか、独自のターゲット プロセッサ タイプを定義します。独自のプロセッサ タイプの定義についての詳細は、
汎用ターゲット オプション
を参照してください。メモ
Polyspace® では、データ構造体のサイズに 128 MB の内部制限が課されています。これより大きいサイズのデータ構造体がターゲット プロセッサ タイプの仕様で許容されている場合でも、データ構造体のサイズはこの内部制限による制約を受けます。