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