このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
スタック変数へのポインターまたは参照が範囲外
ローカル変数を指すポインターが変数スコープを逸脱している
説明
この欠陥は、ローカル変数へのポインターまたは参照が変数のスコープを逸脱している場合に発生します。次に例を示します。
関数が、ローカル変数を指すポインターを返す。
関数が代入
globPtr = &locVar
を実行する。globPtr
はグローバル ポインター変数、locVar
はローカル変数です。関数が代入
*paramPtr = &locVar
を実行する。paramPtr
は関数パラメーター (つまりint**
ポインターなど)、locVar
はローカルのint
変数です。C++ メソッドが代入
memPtr = &locVar
を実行する。memPtr
はメソッドが属するクラスのポインター データ メンバー、locVar
はメソッドから見てローカルな変数です。(C++11 以降) 関数が、参照によって関数のローカル変数を取得するラムダ式オブジェクトを返す。
欠陥は、関数 alloca
を使用して割り当てたメモリにも適用されます。この欠陥は静的なローカル変数には適用されません。Polyspace® は、関数定義に含まれるローカル オブジェクトは同じスコープ内にあると仮定します。
リスク
ローカル変数にはスタック上のアドレスが割り当てられます。ローカル変数のスコープがいったん終了すると、このアドレスは再利用可能になります。このアドレスを使用して変数のスコープ外にあるローカル変数値にアクセスすると、予期しない動作を引き起こす可能性があります。
ローカル変数を指すポインターが変数のスコープを逸脱していると、Polyspace Bug Finder™ によってその欠陥が強調表示されます。この欠陥は、ポインターに格納されているアドレスが使用されていない場合でも発生します。コードを保守可能なものにするため、ポインターが変数のスコープを逸脱しないようにすることをお勧めします。ポインター内のアドレスが現在使用されていない場合でも、関数の他の使用者がそのアドレスを使用することで動作が未定義となる可能性があります。
修正方法
ローカル変数へのポインターまたは参照が変数スコープを逸脱しないようにします。
例
結果情報
グループ: 静的メモリ |
言語: C | C++ |
既定値: 手書きコードはオン、生成コードはオフ |
コマンド ライン構文: LOCAL_ADDR_ESCAPE |
影響度: High |