関数が、正式な return ステートメントまたは出力パラメーターを使用して無効なポインターを返すのを許可しないでください。
int* ex1(int a)
{
return &a; // returns a dangling pointer to the stack variable 'a'
}
void ex2(int a, int** out)
{
*out = &a; // 'out' contains a dangling pointer to the stack variable 'a'
}
解説
C++ Core Guidelines からの有効期間のガイドラインには、コードが従うことができるコントラクトの概要が示されています。このコントラクトを使用すると、静的メモリ リークと宙ぶらりんのポインターの検出をさらに徹底できます。 このガイドラインの背後にある基本的な考え方は次のとおりです。
- 無効な (宙ぶらりんの) または既知の null ポインターを逆参照しない。
- 関数から、正式な return ステートメントまたは out パラメーターによって、宙ぶらりんのポインターを返さない。
- 無効な (ダングリング状態の) ポインターを関数に渡すことはない。
無効なポインターは、既にそこに存在しないものを指すときに宙ぶらりんになります。 たとえば、スコープ外に出た後のローカル変数またはパラメーターへのポインターがあります。 または、削除されたリソースへのポインターなどです。 値を使用する前に値が変更された場合、静的へのポインターでも宙ぶらりんになる可能性があります。 宙ぶらりんのポインターは以前は有効でした。これは、初期化されていないポインターやnullptrのような、他の種類の無効なポインターと区別される点です。