Avertissement C26414

« Déplacer, copier, réaffecter ou réinitialiser un pointeur intelligent local ».

Recommandations principales en C++ :
R.5 : Préférer les objets délimités, ne pas allouer inutilement de tas

Les pointeurs intelligents sont pratiques pour la gestion dynamique des ressources, mais ils ne sont pas toujours nécessaires. Par exemple, il peut être plus facile et plus efficace de gérer une mémoire tampon dynamique locale à l’aide d’un conteneur standard. Vous n’avez peut-être pas besoin d’allocation dynamique du tout pour les objets uniques, par exemple, s’ils n’ont jamais survécu à leur fonction de créateur. Ils peuvent être remplacés par des variables locales. Les pointeurs intelligents deviennent pratiques lorsqu’un scénario nécessite un changement de propriété. Par exemple, lorsque vous réaffectez une ressource dynamique plusieurs fois ou dans plusieurs chemins d’accès. Ils sont également utiles pour les ressources obtenues à partir du code externe. Et, lorsque des pointeurs intelligents sont utilisés pour prolonger la durée de vie d’une ressource.

Notes

Cette case activée reconnaît les types standard std::unique_pointer et std::shared_pointer définis par l’utilisateur qui sont susceptibles d’être des pointeurs intelligents. Ces types sont censés définir les opérations suivantes :

  • les opérateurs d’accès aux membres ou de déréférencement surchargés qui sont publics et qui ne sont pas marqués comme supprimés ;

  • destructeur public qui n’est pas supprimé ou par défaut. Cela inclut les destructeurs explicitement définis comme vides.

Le type Microsoft::WRL::ComPtr se comporte comme pointeur partagé, mais il est souvent utilisé dans des scénarios spécifiques affectés par la gestion de la durée de vie COM. Pour éviter un bruit excessif, ce type est filtré.

Cette case activée recherche des allocations locales explicites affectées à des pointeurs intelligents, afin d’identifier si les variables délimitées peuvent fonctionner comme alternative. Les appels directs à l’opérateur new, ainsi que les fonctions spéciales comme std::make_unique et std::make_shared, sont interprétés comme des allocations directes.

Nom de l’analyse du code : RESET_LOCAL_SMART_PTR

Exemple

Mémoire tampon dynamique :

void unpack_and_send(const frame &f)
{
    auto buffer = std::make_unique<char[]>(f.size()); // C26414
    f.unpack(buffer.get());
    // ...
}

Mémoire tampon dynamique remplacée par le conteneur :

void unpack_and_send(const frame &f)
{
    auto buffer = std::vector<char>(f.size());
    f.unpack(buffer.data());
    // ...
}