警告 C26823

NULL の可能性があるポインター 'variable' を逆参照する (lifetime.1)

備考

C および C++ では、null ポインターの逆参照が頻繁に問題になります。 分析エンジンには、このような問題に対処するためのいくつかのチェックが含まれています。 比較については、この ブログ記事を参照してください。 逆参照された時点でポインターが null である可能性があると分析エンジンが判断すると、警告 C26823 が出力されます。 一般的な原因としては、null の可能性がある戻り値、一方のパスでポインターが null に設定された後に合流する制御フロー パス、またはアドレスを介してポインターを変更できる呼び出しなどがあります。 C26822 を有効にして、ポインターが null であることがわかっている逆参照のみを報告できます。 このチェックでは SAL 注釈 もサポートされ、コードのインバリアントを gsl::not_null 記述するためのものです。

例

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
}

この警告を解決するには、null チェックを追加することで、コードに null ポインターの逆参照がないことを確認してください。 コードが正しいことがわかった場合は、多くの場合、gsl::not_null または SAL 注釈を使用して誤検出を修正できます。 これらの注釈の一部を使用する方法の例を次に示します。

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