경고 C6101

초기화되지 않은 메모리 'parameter-name'을 반환합니다.

함수를 통한 성공적인 경로는 주석이 추가된 매개 변수를 _Out_ 설정하지 않습니다.

설명

이 경고의 목적은 함수의 호출자가 초기화되지 않은 값을 사용하지 않도록 하는 것입니다. 분석기는 호출자가 함수 호출 전에 주석이 추가된 매개 변수를 _Out_ 초기화하지 않고 함수가 해당 매개 변수를 초기화하는 검사 가정합니다. 함수가 오류가 있거나 성공하지 못했음을 나타내는 값을 반환하는 경우 분석기는 이 경고를 내보내지 않습니다. 이 문제를 해결하려면 성공한 모든 반환 경로에서 매개 변수를 _Out_ 초기화해야 합니다. 오류 메시지에는 매개 변수를 초기화하지 않는 예제 경로의 줄 번호가 포함됩니다.

초기화 동작이 의도적으로 수행된 경우 잘못된 또는 누락된 SAL 주석이 경고의 원인일 수 있습니다. 일반적으로 이러한 경우는 두 가지 방법 중 하나로 해결할 수 있습니다. 즉, 더 적절한 주석으로 변경 _Out_ 하거나 주석을 사용하여 _Success_() 함수의 성공/오류 상태를 정의할 수 있습니다. 정적 분석 도구는 함수의 호출 사이트를 분석할 때 함수에 올바른 주석이 있어야 합니다.

매개 변수 주석을 변경하여 수정

매개 변수가 이미 초기화된 상태이고 함수가 조건부로 수정하는 경우 주석이 _Inout_ 더 적합할 수 있습니다. 의도한 동작에 맞는 다른 상위 수준 주석이 없으면 다음과 _Pre_satisfies_()같은 _Pre_null_하위 수준 주석을 사용할 수 있으며 _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
}

솔루션을 더 흥미롭게 만들기 위해 초기화하는 outputinput0것은 유효하지 않다고 가정합니다. 한 가지 방법은 함수 반환 값을 다음과 같은 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 주석 사용