Compartir vía


Advertencia C26411

El parámetro 'parameter' es una referencia al puntero único y nunca se reasigna o restablece, use T* o T& en su lugar (r.33)

Cuando se pasa un puntero único a una función por referencia, implica que su recurso se puede lanzar o transferir dentro de la función. Si la función usa su parámetro solo para acceder al recurso, es seguro pasar un puntero básico o una referencia. Para obtener más información, consulte La regla R.33 de directrices principales de C++: Tomar un<unique_ptr widget> y parámetro para expresar que una función vuelve a colocar el widget.

Comentarios

  • Las limitaciones de la advertencia C26410 también se aplican aquí.

  • La heurística para detectar el acceso de release o reset al puntero único es ingenua. Solo detectamos llamadas a operadores de asignación y a funciones denominadas reset (que no distinguen mayúsculas de minúsculas). Obviamente, esta detección no cubre todos los casos posibles de modificaciones de puntero inteligente. (Por ejemplo, no detecta std::swap, ni ninguna función especial que no sea const en un puntero inteligente personalizado). Se espera que esta advertencia genere muchos falsos positivos en tipos personalizados y, en algunos escenarios, se trata de punteros únicos estándar. Esperamos mejorar la heurística a medida que implementamos más comprobaciones centradas en punteros inteligentes.

  • El hecho de que los punteros inteligentes suelen ser plantillas aporta una limitación interesante. El compilador no es necesario para procesar el código de plantilla en plantillas si no se usa. En el código que hace un uso limitado de interfaces de puntero inteligente, el comprobador puede producir resultados inesperados. El comprobador no puede identificar correctamente la semántica del tipo de plantilla, ya que es posible que algunas funciones nunca se usen. Para el estándar std::unique_ptr, esta limitación se mitiga al reconocer el nombre del tipo. Este análisis puede ampliarse en el futuro para cubrir punteros inteligentes más conocidos.

  • Las expresiones lambda que realizan la captura por referencia implícita pueden provocar advertencias sorprendentes sobre las referencias a punteros únicos. Actualmente, se notifican todos los parámetros de referencia capturados en lambda, independientemente de si se restablecen o no. Una versión futura podría ampliar la heurística para correlacionar campos y parámetros lambda.

Nombre del análisis de código: NO_REF_TO_UNIQUE_PTR

Ejemplo: referencia innecesaria

void TraceValid(std::unique_ptr<Slot> &slot)    // C26411
{
    if (!IsDamaged(slot.get()))
        std::cout << *slot.get();
}

void ReleaseValid(std::unique_ptr<Slot> &slot)  // OK
{
    if (!IsDamaged(slot.get()))
        slot.reset(nullptr);
}