Compartir vía


Advertencia C26400

No asigne el resultado de una asignación o una llamada de función con un owner<T> valor devuelto a un puntero sin procesar, use owner<T> en su lugar (i.11)

Comentarios

Esta comprobación ayuda a aplicar la *regla I.11: Nunca transferir la propiedad por un puntero sin procesar (T*), que es un subconjunto de la regla R.3: un puntero sin formato (un T*) no es propietario. En concreto, advierte sobre cualquier llamada a operator new, que guarda su resultado en una variable de tipo de puntero básico. También advierte sobre las llamadas a funciones que devuelven gsl::owner<T> si sus resultados se asignan a punteros básicos. La idea es que debe indicar claramente la propiedad de los recursos de memoria. Para más información, consulte C++ Core Guidelines.

La manera más fácil de corregir esta advertencia es usar la declaración auto si el recurso se asigna inmediatamente en la declaración de variable. Si esta solución no es posible, se recomienda usar el tipo gsl::owner<T>. Las declaraciones auto inicializadas con el operador new son "propietarias" porque se supone que el resultado de cualquier asignación es implícitamente un puntero propietario. Transferimos esta suposición a la variable auto y la tratamos como owner<T>.

Si esta comprobación marca una llamada a una función que devuelve owner<T>, puede ser señal de un error legítimo en el código. Básicamente, apunta a un lugar donde el código filtra una noción explícita de propiedad (y quizás el propio recurso).

Actualmente, esta regla solo comprueba las variables locales. Si realiza una asignación a un parámetro formal, variable global, miembro de clase, etc., no se marca. Está prevista la cobertura adecuada de estos escenarios para futuros trabajos.

Nombre del análisis de código: NO_RAW_POINTER_ASSIGNMENT

Ejemplo 1: Asignación simple

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

Ejemplo 2: Asignación simple (corregida con gsl::owner<T>)

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

Ejemplo 3: Asignación simple (corregida con auto)

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