Partager via


Avertissement C26400

N’affectez pas le résultat d’une allocation ou d’un appel de fonction avec une owner<T> valeur de retour à un pointeur brut, utilisez owner<T> plutôt (i.11)

Notes

Cette vérification permet d’appliquer la *règle I.11 : Ne jamais transférer la propriété par un pointeur brut (T*), qui est un sous-ensemble de la règle R.3 : un pointeur brut (a T*) n’est pas propriétaire. Plus précisément, il avertit sur n’importe quel appel à operator new, ce qui enregistre son résultat dans une variable de type de pointeur brut. Il avertit également les appels aux fonctions qui retournent gsl::owner<T> si leurs résultats sont affectés à des pointeurs bruts. L’idée est que vous devez clairement indiquer la propriété des ressources mémoire. Pour plus d’informations, consultez les instructions de base C++.

Le moyen le plus simple de corriger cet avertissement consiste à utiliser auto la déclaration si la ressource est affectée immédiatement à la déclaration de variable. Si ce correctif n’est pas possible, nous vous suggérons d’utiliser le type gsl::owner<T>. Les auto déclarations initialisées avec l’opérateur new sont des « propriétaires », car nous partons du principe que le résultat d’une allocation est implicitement un pointeur de propriétaire. Nous transférons cette hypothèse à la auto variable et la traitons comme owner<T>.

Si cette vérification signale un appel à une fonction qui retourne owner<T>, il peut s’agir d’une indication d’un bogue légitime dans le code. En fait, il pointe vers un endroit où le code fuite une notion explicite de propriété (et peut-être la ressource elle-même).

Cette règle vérifie actuellement uniquement les variables locales. Si vous attribuez une allocation à un paramètre formel, une variable globale, un membre de classe, et ainsi de suite, il n’est pas marqué. Une couverture appropriée de ces scénarios est prévue pour le travail futur.

Nom de l’analyse du code : NO_RAW_POINTER_ASSIGNMENT

Exemple 1 : Allocation simple

char *buffer = nullptr;
if (useCache)
    buffer = GetCache();
else
    buffer = new char[bufferSize];  // C26400

Exemple 2 : Allocation simple (fixe avec gsl::owner<T>)

gsl::owner<char*> buffer = nullptr;
if (useCache)
    buffer = GetCache();
else
    buffer = new char[bufferSize];  // OK

Exemple 3 : Allocation simple (fixe avec auto)

auto buffer = useCache ? GetCache() : new char[bufferSize]; // OK