スコープ外のスタック ポインター デリファレンスを検出 (-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 |
例 (Code Prover Server): polyspace-code-prover-server -sources |
バージョン履歴
R2015a で導入