Aracılığıyla paylaş


Uyarı C26823

Büyük olasılıkla null bir "değişken" işaretçisini geri alma (ömür.1)

Açıklamalar

Null işaretçinin başvuruyu kaldırma işlemi C ve C++'da sık karşılaşılan bir sorundur. Bu tür sorunlarla başa çıkmak için birkaç denetimimiz var. Karşılaştırma için bu blog gönderisini inceleyin. Çözümleme altyapısı bir işaretçinin değerinin null olabileceğini ve işaretçinin başvurulduğunu gördüğünde bir C26823 uyarı gönderir. C26822'yi yalnızca daha izinli bir analiz için etkinleştirebilirsiniz. Bu denetim, SAL ek açıklamalarını ve gsl::not_null kodun sabitlerini açıklamayı da destekler.

Örnek

void invalidate(int **pp);
void condition_null_dereference_invalidated(int* p)
{
    if (p)
        return;

    invalidate(&p);
    // The call above could reset the value of `p`, thus the low confidence warning.
    *p = 5; // warning: C26823
}

Bu uyarıyı çözmek için, büyük olasılıkla null denetimler ekleyerek kodda null işaretçi başvurusunun olmadığından emin olun. Kodun doğru bulunması durumunda hatalı pozitif bulgular genellikle veya SAL ek açıklamaları kullanılarak gsl::not_null düzeltilebilir. Aşağıda bu ek açıklamalardan bazılarının nasıl kullanılacağına dair bazı örnekler verilmiştir:

_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; 
}