Compartilhar via


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.

Confira também

C6394
C26861
C26862
C26863
C26864