Compartir vía


Advertencia C26403

Restablecer o eliminar explícitamente un owner<T> puntero "variable" (r.3)

Los punteros de propietario son como punteros únicos: poseen un recurso exclusivamente y administran la versión del recurso o sus transferencias a otros propietarios. Esta comprobación valida que un puntero de propietario local mantenga correctamente su recurso mediante todas las rutas de acceso de ejecución de una función. Si el recurso no se transfirió a otro propietario o no se liberó explícitamente, el comprobador advierte y apunta a la declaración de la variable de puntero.

Para más información, consulte C++ Core Guidelines.

Comentarios

  • Actualmente, esta comprobación no proporciona la ruta de acceso exacta que no puede liberar el recurso. Este comportamiento puede mejorarse en futuras versiones. Puede ser difícil encontrar la ubicación exacta de una corrección. El mejor enfoque es intentar reemplazar punteros sin formato en funciones complejas con punteros únicos para evitar riesgos.

  • La comprobación puede descartar una función demasiado complicada para no bloquear el análisis de código. Por lo general, la complejidad de las funciones debe mantenerse en un umbral razonable. Es posible que consideremos la posibilidad de agregar una comprobación de complejidad local al módulo Directrices básicas de C++ si hay una demanda clara para ella. Esta limitación es aplicable a otras reglas que son confidenciales al flujo de datos.

  • La advertencia puede activarse en casos claramente falsos positivos en los que la memoria se elimina solo después de la comprobación nula de un puntero. Estos falsos positivos son el resultado de una limitación actual de la API de la herramienta, pero puede mejorarse en el futuro.

Nombre del análisis de código: RESET_OR_DELETE_OWNER

Ejemplo

Falta limpieza durante el control de errores:

gsl::owner<int*> sequence = GetRandomSequence(); // C26403

try
{
    StartSimulation(sequence);
}
catch (const std::exception& e)
{
    if (KnownException(e))
        return; // Skipping the path which deletes the owner.

    ReportException(e);
}

delete [] sequence;