警告 C26487

関数が、正式な 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のような、他の種類の無効なポインターと区別される点です。

関連項目