다음을 통해 공유


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 규칙을 지정합니다.

다음 단계를 사용하여 코드 분석을 실행합니다.
  1. 코드를 준비합니다(역할 형식 선언 사용).
  2. 정적 드라이버 검증 도구 실행
  3. 결과를 보고 분석합니다.

자세한 내용은 정적 드라이버 검증 도구로 드라이버에서 결함 찾기를 참조하세요.