メインコンテンツ

スコープ外のスタック ポインター デリファレンスを検出 (-detect-pointer-escape)

関数がそれ自体のローカル変数の 1 つを指すポインターを返すケースを検索

説明

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

ダングリング ポインターによってスコープ外の変数にアクセスするケースが、検証で検出されなければならないことを指定します。たとえば、関数がローカル変数を指すポインターを返し、その関数の外部でそのポインターをデリファレンスする際に、このようなアクセスが行われます。ポインターが指すローカル変数が関数の外部には存在しないため、このデリファレンスにより未定義の動作になります。

オプションの設定

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

  • Polyspace® ユーザー インターフェイス (デスクトップ製品のみ): プロジェクト構成で [チェック動作] ノードを選択してから、このオプションを選択します。

  • Polyspace Platform ユーザー インターフェイス (デスクトップ製品のみ): プロジェクト構成の [静的解析] タブで [実行時エラー][チェック動作] ノードを選択してから、このオプションを選択します。

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

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

このオプションを使用して、ポインター エスケープの検出を有効にします。

設定

オン

[不適切にデリファレンスされたポインター] チェックでは、通常の仕様以外に追加のタスクが実行されます。ポインターをデリファレンスするとき、チェックでは、ポインターによってスコープ外の変数にアクセスしているかどうかも判断されます。チェックは次のようになります。

  • レッド、ポインターが指す変数がすべてスコープ外でアクセスされている場合。

    たとえば、関数 func でポインター ptr をデリファレンスし、その関数がコードで 2 回呼び出されるとします。どちらの呼び出しでも、デリファレンス *ptr を実行すると、ptr はスコープ外の変数を指しています。したがって、[不適切にデリファレンスされたポインター] チェックがレッドになります。

  • オレンジ、ポインターが指す変数の一部のみがスコープ外でアクセスされている場合。

  • グリーン、ポインターが指すすべての変数がスコープ外でアクセスされておらず、チェックの他の要件も満たされている場合。

次のコードでこのオプションを有効にすると、Polyspace Code Prover™ では *ptr に対する [不適切にデリファレンスされたポインター] チェックはレッドになります。それ以外の場合は、*ptr に対する [不適切にデリファレンスされたポインター] チェックはグリーンになります。

void func2(int *ptr) {
    *ptr = 0; 
}

int* func1(void) {
    int ret = 0;
    return &ret ;
}
void main(void) {
    int* ptr = func1() ;
    func2(ptr) ;
}
[結果の詳細] ペインには、ret がスコープ外でアクセスされたことを示すメッセージが表示されます。

オフ (既定の設定)

ポインターをデリファレンスするとき、[不適切にデリファレンスされたポインター] チェックでは、スコープ外の変数にアクセスしているかどうかがチェックされません。ポインターのデリファレンスが変数スコープ外であるとしても、次の要件を満たす限り、チェックはグリーンになります。

  • ポインターが NULL ではない。

  • ポインターがメモリ バッファー内を指している。

ヒント

スタック ポインターのデリファレンスがスコープ外であるかどうかの検出は、特定のタイプのポインターには適用されません。具体的な制限については、Polyspace 検証の制限事項を参照してください。

コマンド ライン情報

パラメーター: -detect-pointer-escape
既定値: オフ
例 (Code Prover): polyspace-code-prover -sources file_name -detect-pointer-escape
例 (Code Prover Server): polyspace-code-prover-server -sources file_name -detect-pointer-escape

バージョン履歴

R2015a で導入