メインコンテンツ

大きいオブジェクトに関する 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; 
    

解決法

  1. 指定のポインター サイズを、ターゲット プロセッサ タイプによってチェックします。詳細は、ターゲット プロセッサ タイプ (-target) を参照してください。

    たとえば、次のように、カスタム ターゲット My_target のポインター サイズが 16 ビットであるとします。

  2. コードを変更するか、異なるポインター サイズを指定します。

    たとえば、次のようにします。

    • 構造体で宣言する配列のサイズを小さくします。

      事前定義されたターゲット プロセッサ タイプが使用されている場合、ポインター サイズは、ターゲット アーキテクチャでのポインター サイズと同じになるとみられます。したがって、こうした宣言により、ターゲット アーキテクチャでエラーが発生する可能性があります。

    • 可能であれば、指定のターゲット プロセッサ タイプのポインター サイズを変更します。

      それ以外の場合は、ポインター サイズがより大きい別のターゲット プロセッサ タイプを指定するか、独自のターゲット プロセッサ タイプを定義します。独自のプロセッサ タイプの定義についての詳細は、汎用ターゲット オプションを参照してください。

      メモ

      Polyspace® では、データ構造体のサイズに 128 MB の内部制限が課されています。これより大きいサイズのデータ構造体がターゲット プロセッサ タイプの仕様で許容されている場合でも、データ構造体のサイズはこの内部制限による制約を受けます。