NullCheck 규칙(storport)
NullCheck 규칙은 드라이버 코드 내의 NULL 값이 드라이버의 뒷부분에서 역참조되지 않는지 확인합니다. 이 규칙은 다음 조건 중 하나가 참인 경우 결함을 보고합니다.
- 나중에 역참조되는 NULL 할당이 있습니다.
- 나중에 역참조되는 NULL일 수 있는 드라이버의 프로시저에 전역/매개 변수가 있으며, 드라이버에는 포인터의 초기 값이 NULL일 수 있음을 시사하는 명시적 검사 있습니다.
NullCheck 규칙 위반을 사용하면 추적 트리 창에서 가장 관련성이 큰 코드 문이 강조 표시됩니다. 보고서 출력 작업에 대한 자세한 내용은 정적 드라이버 검증 도구 보고서 및 추적 뷰어 이해를 참조하세요.
구조체 예제
이 코드 조각은 구조체의 적절한 사용을 보여줍니다.
//Rule does not fail
typedef struct _B {
int *f;
} B;
void GoodStruc(B *x) {
B *y = x;
y->f = NULL; //assign NULL
if (x->f) {
*(x->f) = 1;
} //OK
}
이 코드 조각은 구조체의 부적절한 사용을 보여줍니다. 코드가 컴파일되지만 런타임 오류가 발생합니다.
//Rule fails
typedef struct _A {
int *f;
} A;
void BadStruc(A *x) {
A *y = x;
y->f = NULL; //assign NULL
*(x->f) = 1; //dereferencing NULL
}
함수 예제
이 예제에는 나중에 역참조되는 NULL일 수 있는 함수에 대한 매개 변수가 있습니다. 또한 포인터의 초기 값이 NULL일 수 있음을 암시하는 명시적 검사 있습니다.
//Rule fails
void Bad(int *x)
{
*x = 2; //Possibly dereferencing NULL
if (x != NULL) //checks for null on a parameter
*x = *x + 1;
}
이 예제에서는 매개 변수가 NULL로 예상되지 않는다는 암시적 전제 조건이 있을 수 있으므로 규칙 위반이 없습니다.
//Rule does not fail
void Good1(int *x)
{
*x = 2;
*x = *x + 1;
}
이 두 번째 예제에서는 매개 변수가 사용될 때마다 NULL에 대한 명시적 검사 있습니다.
//Rule does not fail
void Good2(int *x)
{
if (x != NULL)
*x = 2; // ok
if (x != NULL) //checks for null on a parameter
*x = *x + 1;
}
드라이버 모델: Storport
테스트 방법
컴파일 시 |
---|
정적 드라이버 검증 도구 를 실행하고 NullCheck 규칙을 지정합니다. 다음 단계를 사용하여 코드 분석을 실행합니다.자세한 내용은 정적 드라이버 검증 도구로 드라이버에서 결함 찾기를 참조하세요. |