Aviso C26437
Não fatiar.
Diretrizes Principais do C++: ES.63: não fatiar
A linguagem permite o fatiamento e pode ser vista como um caso especial de um elenco implícito perigoso. Mesmo que seja feito intencionalmente e não leve a problemas imediatos, ainda é altamente desencorajado. Isso torna o código mais difícil de alterar, forçando requisitos extras em tipos de dados relacionados. É especialmente verdadeiro se os tipos são polimórficos ou envolvem gerenciamento de recursos.
Comentários
Essa regra adverte não apenas sobre atribuições explícitas, mas também sobre fatiamento implícito. O fatiamento implícito acontece quando um resultado é retornado da função atual ou quando os dados são passados para outras funções.
A regra também sinaliza casos em que uma atribuição não envolve fatiamento de dados real (por exemplo, se os tipos estiverem vazios ou não fizerem manipulações de dados perigosas). Esses avisos ainda devem ser corrigidos para evitar regressões indesejáveis se os tipos de dados ou comportamentos mudarem no futuro.
Exemplo
No próximo exemplo de código, lemos id_ex
, mas o chamador da função obterá apenas uma fatia do objeto:
struct id {
int value;
};
struct id_ex : id {
int extension;
};
bool read_id(stream &s, id &v) {
id_ex tmp{};
if (!s.read(tmp.value) || !s.read(tmp.extension))
return false;
v = tmp; // C26437
return true;
}
Para corrigir o problema, atualize a função para usar os tipos corretos:
// ...
bool read_id(stream &s, id_ex &v) {
// ...