경고 C6011

NULL 포인터 'pointer-name'을 역참조합니다.

설명

이 경고는 코드가 잠재적으로 null 포인터를 역참조함을 나타냅니다. 포인터 값이 잘못된 경우 결과가 정의되지 않습니다. 이 문제를 해결하려면 사용하기 전에 포인터의 유효성을 검사합니다.

코드 분석 이름: DEREF_NULL_PTR

예시

다음 코드에서는 메모리가 부족한 경우 null을 반환할 malloc 수 있으므로 이 경고를 생성합니다.

#include <malloc.h>

void f( )
{
  char *p = ( char * ) malloc( 10 );
  *p = '\0';

  // code ...
 free( p );
}

이 경고를 수정하려면 다음 코드와 같이 null 값에 대한 포인터를 검사합니다.

#include <malloc.h>
void f( )
{
  char *p = ( char * )malloc ( 10 );
  if ( p )
  {
    *p = '\0';
    // code ...

    free( p );
  }
}

함수에는 조건의 속성을 사용하여 주석이 추가된 매개 변수가 NullPre 있을 수 있습니다. 매개 변수를 역참조하기 전에 이러한 함수 내에 메모리를 할당합니다. 다음 코드는 먼저 메모리를 할당하지 않고 함수 내에서 null 포인터(pc)를 역참조하려고 하기 때문에 경고 C6011을 생성합니다.

#include <sal.h>
using namespace vc_attributes;
void f([Pre(Null=Yes)] char* pc)
{
  *pc='\0'; // warning C6011 - pc is null
  // code ...
}

부주의한 malloc 사용으로 free 인해 메모리 누수 및 예외가 발생합니다. 이러한 종류의 누수 및 예외 문제를 최소화하려면 원시 메모리를 직접 할당하지 마세요. 대신 C++ STL(표준 라이브러리)에서 제공하는 메커니즘을 사용합니다. 포함 shared_ptr, unique_ptrvector. 자세한 내용은 스마트 포인터 및C++ 표준 라이브러리를 참조하세요.

경험적 학습

레거시 코드의 경고 수를 줄이는 데 사용되는 추론은 포인터NULLNULL가 아닌 것으로 가정합니다. 지금까지 본 예제에서는 할당이 실패할 수 있기 때문에 반환되거나 new 반환된 malloc 포인터일 NULL 수 있습니다. 분석 엔진이 null 허용 여부를 증명으로 사용하는 또 다른 특징은 프로그램이 명시적으로 검사 NULL경우입니다. 다음 예제에 나와 있습니다.

void f(int* n)
{
  *n = 1; // Does not warn, n is assumed to be non-null
}

void f(int* n)
{
  if (n) {
    (*n)++;
  }
  *n = 1; // Warns because the earlier conditional shows that n might be null
}

두 번째 경우 사용자는 if 블록 내에서 선을 이동하여 *n = 1 경고를 수정할 수 있습니다.

참고 항목