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, utilisezowner<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