Advertencia C26414
"Mover, copiar, reasignar o restablecer un puntero inteligente local ".
C++ Core Guidelines:
R.5: Son preferibles los objetos de ámbito, no debe asignarse por montón innecesariamente
Los punteros inteligentes son prácticos para la administración dinámica de recursos, pero no siempre son necesarios. Por ejemplo, puede ser más fácil y eficaz administrar un búfer dinámico local mediante un contenedor estándar. Es posible que no necesite para nada la asignación dinámica para objetos únicos; por ejemplo, si nunca van a sobrevivir a su función de creador. Se pueden reemplazar por variables locales. Los punteros inteligentes se vuelven útiles cuando un escenario requiere un cambio de propiedad. Por ejemplo, al reasignar un recurso dinámico varias veces o en varias rutas de acceso. También son útiles para los recursos obtenidos del código externo. Y cuando se usan punteros inteligentes para ampliar la duración de un recurso.
Comentarios
Esta comprobación reconoce las plantillas estándar std::unique_pointer
y std::shared_pointer
, y los tipos definidos por el usuario que probablemente están diseñados para ser punteros inteligentes. Se espera que estos tipos definan las operaciones siguientes:
Operadores de acceso de miembros o de desreferencia sobrecargados que son públicos y que no están marcados como eliminados;
Un destructor público que no esté eliminado o sea el predeterminado. Esto incluye destructores definidos explícitamente como vacíos.
El tipo Microsoft::WRL::ComPtr
se comporta como un puntero compartido, pero a menudo se usa en escenarios específicos a los que afecta la administración de la duración COM. Para evitar el ruido excesivo, este tipo se filtra.
Esta comprobación busca asignaciones locales explícitas asignadas a punteros inteligentes, para identificar si las variables con ámbito podrían funcionar como alternativa. Las llamadas directas al operador new
, así como las funciones especiales como std::make_unique
y std::make_shared
, se interpretan como asignaciones directas.
Nombre del análisis de código: RESET_LOCAL_SMART_PTR
Ejemplo
Búfer dinámico:
void unpack_and_send(const frame &f)
{
auto buffer = std::make_unique<char[]>(f.size()); // C26414
f.unpack(buffer.get());
// ...
}
Búfer dinámico reemplazado por contenedor:
void unpack_and_send(const frame &f)
{
auto buffer = std::vector<char>(f.size());
f.unpack(buffer.data());
// ...
}