Partager via


Avertissement C26411

Le paramètre 'parameter' est une référence à un pointeur unique et il n’est jamais réaffecté ou réinitialisé, utiliser T* ou T& remplacer (r.33)

Lorsque vous passez un pointeur unique à une fonction par référence, cela signifie que sa ressource peut être libérée ou transférée à l’intérieur de la fonction. Si la fonction utilise son paramètre uniquement pour accéder à la ressource, il est sûr de passer un pointeur brut ou une référence. Pour plus d’informations, consultez la règle des instructions de base C++ R.33 : Prenez un unique_ptr widget>><pour exprimer qu’une fonction réécrit le widget.

Notes

  • Les limitations de l’avertissement C26410 sont également applicables ici.

  • L’heuristique à détecter release ou reset à accéder au pointeur unique est naïve. Nous détectons uniquement les appels aux opérateurs d’affectation et aux fonctions nommées reset (sans respect de la casse). Évidemment, cette détection ne couvre pas tous les cas possibles de modifications de pointeur intelligent. (Par exemple, il ne détecte std::swappas, ni aucune fonction spéciale non-fonctionconst dans un pointeur intelligent personnalisé). Nous nous attendons à ce que cet avertissement produise de nombreux faux positifs sur des types personnalisés, et dans certains scénarios traitant de pointeurs uniques standard. Nous prévoyons d’améliorer l’heuristique au fur et à mesure que nous implémentons plus de case activée s axés sur les pointeurs intelligents.

  • Le fait que les pointeurs intelligents sont souvent des modèles apporte une limitation intéressante. Le compilateur n’est pas nécessaire pour traiter le code de modèle dans les modèles s’il n’est pas utilisé. Dans le code qui utilise de manière limitée les interfaces de pointeur intelligent, l’case activée er peut produire des résultats inattendus. L’case activée er ne peut pas identifier correctement la sémantique du type de modèle, car certaines fonctions peuvent ne jamais être utilisées. Pour la norme std::unique_ptr, cette limitation est atténuée en reconnaissant le nom du type. Cette analyse peut être étendue à l’avenir pour couvrir des pointeurs intelligents plus connus.

  • Les expressions lambda qui effectuent une capture implicite par référence peuvent entraîner des avertissements surprenants sur les références à des pointeurs uniques. Actuellement, tous les paramètres de référence capturés dans les lambdas sont signalés, qu’ils soient réinitialisés ou non. Une version ultérieure peut étendre l’heuristique pour mettre en corrélation les champs lambda et les paramètres lambda.

Nom de l’analyse du code : NO_REF_TO_UNIQUE_PTR

Exemple : Référence inutile

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