メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

フィールド間のポインター演算を有効にする (-allow-ptr-arith-on-struct)

構造体フィールドへのポインターの演算で別のフィールドを指すように許可

説明

このオプションは Code Prover 解析のみに影響します。

構造体フィールドに割り当てられたポインターは、その構造体内を指すかぎり、境界外を指すことができると指定します。

オプションの設定

以下のいずれかの方法を使用してオプションを設定します。

  • Polyspace® ユーザー インターフェイス (デスクトップ製品のみ): プロジェクト構成で [チェック動作] ノードを選択してから、このオプションを選択します。同時に有効にしなければならない他のオプションについては、依存関係を参照してください。

  • Polyspace Platform ユーザー インターフェイス (デスクトップ製品のみ): プロジェクト構成の [静的解析] タブで [実行時エラー][チェック動作] ノードを選択してから、このオプションを選択します。同時に有効にしなければならない他のオプションについては、依存関係を参照してください。

  • コマンド ラインとオプション ファイル: オプション -allow-ptr-arith-on-struct を使用します。コマンド ライン情報を参照してください。

このオプションを使用する理由

このオプションを使用して、不適切にデリファレンスされたポインターのチェックを緩和します。構造体フィールドへのポインターを割り当てると、ポインター演算を実行し、その結果を使用して別の構造体フィールドにアクセスできます。

設定

オン

構造体フィールドに割り当てられたポインターは、その構造体内を指すかぎり、フィールドで定められた境界の外部を指すことができます。たとえば次のコードでは、このオプションを使用しないかぎり、検証により Illegally dereferenced pointer のレッド チェックが生成されます。

void main(void) {
struct S {char a; char b; int c;} x;
char *ptr = &x.b;
ptr ++;
*ptr = 1; // Red on the dereference, because ptr points outside x.b
}
オフ (既定の設定)

構造体フィールドに割り当てられたポインターは、フィールドで定められた境界の内部のみを指すことができます。

ヒント

  • 検証では、負のオフセット値をもつポインターは許可されません。この動作は、[フィールド間のポインター演算を有効にする] オプションを選択するかどうかに関係なく発生します。

  • このオプションを使用すると、オレンジ チェックの数が若干増加する可能性があります。このオプションは、構造体フィールドへのポインターが、その構造体の他のフィールドを指すことができない制約を緩和します。この制約が緩和される代わりに、検証では構造体内のフィールドの境界に対する精度が低下し、その構造体が全体として扱われます。以前グリーンだったポインター デリファレンスが、オレンジになる可能性があります。

    レッド チェックのみを確認するポリシーに従っていて、構造体内でのポインター演算でレッド チェックを回避する必要がある場合、このオプションを使用します。

  • このオプションを使用する前に、構造体のさまざまなフィールド間でポインター演算を使用するコストについて考えます。

    配列とは異なり、構造体のメンバーは異なるデータ型をもつことができます。効率的な格納のために、構造体ではパディングを使用してこの差を調整します。構造体メンバーを指すポインターをインクリメントするときに、次のメンバーがポイントされないことがあります。このポインターをデリファレンスする場合、読み取り先または書き込み先を使用できません。

依存関係

このオプションは、[ソース コードの言語] (-lang)[C] に設定されている場合にのみ使用できます。

コマンド ライン情報

パラメーター: -allow-ptr-arith-on-struct
既定値: オフ
例 (Code Prover): polyspace-code-prover -sources file_name -allow-ptr-arith-on-struct
例 (Code Prover Server): polyspace-code-prover-server -sources file_name -allow-ptr-arith-on-struct