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*
ouT&
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
oureset
à accéder au pointeur unique est naïve. Nous détectons uniquement les appels aux opérateurs d’affectation et aux fonctions nomméesreset
(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étectestd::swap
pas, 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 davantage de vérifications axées 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, le vérificateur peut produire des résultats inattendus. Le vérificateur 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);
}