Advertencia C26823

Desreferencia de un puntero posiblemente nulo 'variable' (lifetime.1)

Comentarios

La desreferenciación de un puntero nulo es un problema frecuente en C y C++. El motor de análisis incluye varias comprobaciones para tratar estos problemas. Para una comparación, consulte esta entrada del blog. Cuando el motor de análisis determina que un puntero puede ser NULL en el punto donde se desreferencia, emite la advertencia C26823. Entre las causas comunes se incluyen un valor devuelto posiblemente NULL, rutas de acceso de flujo de control que se combinan después de que una ruta de acceso establezca el puntero en null o una llamada que pueda modificar el puntero a través de su dirección. Puede habilitar C26822 para notificar solo desreferencias en las que se sabe que el puntero es NULL. Esta comprobación también admite anotaciones SAL y gsl::not_null para describir las invariantes del código.

Ejemplo

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
}

Para resolver esta advertencia, asegúrese de que no hay ninguna desreferencia de puntero null en el código, potencialmente agregando comprobaciones nulas. En caso de que se descubra que el código es correcto, los resultados de falsos positivos se suelen poder corregir mediante gsl::not_null o Anotaciones SAL. A continuación se muestran algunos ejemplos de cómo usar algunas de esas anotaciones:

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