경고 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 );
}
}
함수에는 조건의 속성을 사용하여 주석이 추가된 매개 변수가 Null
Pre
있을 수 있습니다. 매개 변수를 역참조하기 전에 이러한 함수 내에 메모리를 할당합니다. 다음 코드는 먼저 메모리를 할당하지 않고 함수 내에서 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_ptr
및 vector
. 자세한 내용은 스마트 포인터 및C++ 표준 라이브러리를 참조하세요.
경험적 학습
레거시 코드의 경고 수를 줄이는 데 사용되는 추론은 포인터NULL
NULL
가 아닌 것으로 가정합니다. 지금까지 본 예제에서는 할당이 실패할 수 있기 때문에 반환되거나 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
경고를 수정할 수 있습니다.
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기