Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Não fatiar.
Diretrizes Principais do C++: ES.63: não fatiar
A linguagem permite fatiar 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. Isso é especialmente verdadeiro se os tipos forem polimórficos ou envolverem gerenciamento de recursos.
Comentários
Essa regra avisa não apenas sobre atribuições explícitas, mas também sobre fatiamento implícito. A divisão implícita 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 forem alterados 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) {
// ...