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_ptr및 vector. 자세한 내용은 스마트 포인터 및C++ 표준 라이브러리를 참조하세요.
경험적 학습
레거시 코드의 경고 수를 줄이는 데 사용되는 추론은 포인터NULLNULL가 아닌 것으로 가정합니다. 지금까지 본 예제에서는 할당이 실패할 수 있기 때문에 반환되거나 malloc 반환된 new 포인터일 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 경고를 수정할 수 있습니다.