警告 C6101

初期化されていないメモリ 'parameter-name' を返します

関数のパスが成功しても、注釈付きパラメーターは _Out_ 設定されません。

解説

この警告の目的は、関数の呼び出し元による初期化されていない値の使用を回避することです。 アナライザーは、呼び出し元が関数呼び出し前に注釈が付_Out_けられたパラメーターを初期化せず、関数がパラメーターを初期化することをチェックすることを前提としています。 エラーが発生したか成功しなかったことを示す値が関数から返された場合、アナライザーはこの警告を出力しません。 この問題を解決するには、成功したすべての戻りパスでパラメーターを _Out_ 初期化してください。 エラー メッセージには、パラメーターを初期化しないパスの例の行番号が含まれています。

初期化動作が仕様上の場合、SAL 注釈が正しくないか不足している可能性が警告の原因である可能性があります。 これらのケースは、通常、2 つの方法のいずれかで解決できます。より適切な注釈に変更 _Out_ するか、注釈を _Success_() 使用して関数の成功/エラー状態を定義します。 静的分析ツールでは、関数の呼び出しサイトを分析するときに、関数に正しい注釈を付ける必要があります。

パラメーター注釈の変更による修正

パラメーターが既に初期化済みの状態で、関数によって条件付きで変更される場合は、注釈の方が _Inout_ 適切な場合があります。 他の高レベル注釈が意図した動作に適合しない場合は、低レベルの注釈 (例: _Pre_null_) _Pre_satisfies_()を使用できます。これにより、 _Post_satisfies_() パラメーターの予想される状態に対する柔軟性と制御が向上します。 パラメーター注釈の詳細については、「関数パラメーターと戻り値に注釈を付ける」を参照してください

成功した戻りパスを定義して修正する

アナライザーは、コードが関数の成功パスでパラメーターを _Out_ 初期化しない場合にのみ、この警告を出力します。 注釈がなく _Success_ 、関数の戻り値の型注釈がない場合は、すべての戻りパスが成功したと見なされます。 同様の_Success_注釈の詳細については、「成功/失敗の注釈」を参照してください

コード分析名: RETURN_UNINIT_VAR

この警告が発生するコード例を次に示します。 関数が返 voidされるため、アナライザーはすべてのパスが成功したと見なされます。 この場合、正しい修正はおそらくステートメントのロジックを調整することですが、実際の if コードでは通常は単純ではなく、ソリューションは関数の意図した動作に依存します。

#include <sal.h>
void AlwaysInit(_Out_ int* output, int input) // : warning C6101: Returning uninitialized memory '*p'.: Lines: 2, 4, 9, 14, 2
{
  if( input > 0 )
  {
    *output = input;
    return;
  }
  else if( input < 0 )
  {
    *output = 0;
    return;
  }
  return; // Oops, input was 0
}

ソリューションをより興味深いものにするために、次の場合input0に初期化outputすることは有効ではないと仮定します。 1 つの方法は、関数の戻り値を別の型に変更することです bool。 次に、注釈を _Success_ 追加して、成功した戻りパスを定義します。

_Success_(return == true)
bool InitNotZero(_Out_ int* output, int input)
{
  if( input > 0 )
  {
    *output = input;
    return true;
  }
  else if( input < 0 )
  {
    *output = 0;
    return true;
  }
  return false;
}

コードベースでこのパターンが一般的な場合は、戻り値の型に注釈を追加できます。 Windows SDK の HRESULT などのエラー コードを使用すると、注釈の _Success_ 動作を各関数に追加する必要はありません。 戻り値の型として注釈付き型を既に使用していて、動作をオーバーライドする場合は、前の例に示すように、関数に注釈を追加します。

using SuccessWhenTrue = _Success_(return == true) bool;

SuccessWhenTrue InitNotZero(_Out_ int* output, int input)
{
  // ...
}

関連項目

C++ コードの規則セット
C/C++ コードの欠陥を減らすための SAL 注釈の使用