Waarschuwing C26822

Derefereren van een null-pointer 'variable' (lifetime.1)

Remarks

Het derefereren van een null-pointer is een veelvoorkomend probleem in C en C++. De analyse-engine bevat verschillende controles om met dergelijke problemen om te gaan. Zie dit blogbericht voor een vergelijking. Wanneer de analyse-engine bepaalt dat een aanwijzer null is op het punt waar deze wordt gederefereerd, wordt er een waarschuwing C26822 verzonden. De aanwijzer kan bijvoorbeeld expliciet op null worden ingesteld nullptr, of de dereferentie kan optreden op een vertakking waaruit blijkt dat de aanwijzer null is. U kunt C26823 ook inschakelen voor het rapporteren van de dereferenties waarbij een aanwijzer null kan zijn. Deze controle ondersteunt ook SAL-aantekeningen en gsl::not_null om invarianten van de code te beschrijven.

Voorbeeld

void f(int *p) { 
    if (p == nullptr) 
        *p = 42; // warning: C26822
} 

void assign_to_gsl_notnull() { 
    int* p = nullptr; 
    auto q = gsl::make_not_null(p); // C26822 warning 
} 

Als u deze waarschuwing wilt oplossen, moet u ervoor zorgen dat er geen nullpointer-dereferentie in de code is, mogelijk door null-controles toe te voegen. In het geval dat de code correct bleek te zijn, kunnen fout-positieve bevindingen vaak worden opgelost met behulp van gsl::not_null of SAL-aantekeningen. Hieronder ziet u enkele voorbeelden van het gebruik van enkele van deze annotaties:

_Notnull_ int *get_my_ptr(); 
gsl::not_null<int *> get_my_ptr2(); 

void local_analysis(int *p) { 
    _Analysis_assume_(p != nullptr); 
    *p = 42; 
} 

void local_analysis2(_In_ int *p) { 
    int a = *p; 
}