Aviso C6393
Uma tabela de pesquisa de tamanho 365 não é suficiente para lidar com anos bissextos
Essa regra foi adicionada no Visual Studio 2022 17.8.
Comentários
No calendário gregoriano, cada ano exatamente divisível por quatro é um ano bissexto - exceto para anos que são exatamente divisíveis por 100. Os anos centuriais também são anos bissextos se forem exatamente divisíveis por 400.
Um bug de ano bissexto ocorre quando o software não dá conta dessa lógica de ano bissexto ou usa lógica falha. Isso pode afetar a confiabilidade, a disponibilidade ou até mesmo a segurança do sistema afetado.
Tabelas de pesquisa de tamanho 365 são frequentemente usadas para encontrar rapidamente o mês ao qual um determinado dia corresponde. No entanto, não é correto porque um ano bissexto tem 366 dias.
Nome da análise de código: LEAP_YEAR_INVALID_DATE_KEYED_LOOKUP
Exemplo
O código a seguir cria uma tabela de pesquisa para o dia do ano, supondo 365 dias por ano. No entanto, isso não funciona se o ano for bissexto:
#include <vector>
void foo(int year)
{
const std::vector<int> items(365); // C6393
// Initialize items and use it...
}
Para corrigir o problema, ajuste o tamanho da tabela de pesquisa à medida que a tabela é criada de acordo com o resultado da verificação de ano bissexto apropriada:
#include <vector>
void foo(int year)
{
bool isLeapYear = year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
const std::vector<int> items(isLeapYear ? 366 : 365);
// Initialize items and use it...
}
Heurística
Essa regra é imposta verificando se uma tabela de pesquisa constante está dimensionada para 365 elementos. A violação desta regra faz com que um aviso de alta confiança seja relatado.