Partilhar via


Aviso C26862

Um objeto var de data e hora foi criado a partir de um tipo diferente de objeto de data e hora, mas a conversão foi incompleta: expr

A regra foi adicionada no Visual Studio 2022 17.8.

Comentários

A imposição adequada das regras de tratamento de ano bissexto e dia bissexto requer o acompanhamento da conversão adequada entre objetos de data e hora de diferentes tipos, como o struct Windows SYSTEMTIME e o struct C tm . Diferentes tipos de data e hora podem ter bases diferentes para os campos de ano, mês e dia. Por exemplo, SYSTEMTIME tem um ano baseado em 0, mas campos de mês e dia baseados em 1. Por outro lado, tm tem um ano baseado em 1900, um mês baseado em 0 e um dia baseado em 1 campos. Para converter um objeto de um desses tipos em um objeto de outro tipo, os campos de ano, mês e dia devem ser ajustados adequadamente.

Nome da análise de código: INCOMPLETE_DATETIME_CONVERSION

Exemplo

O código a seguir tenta converter uma instância de tm em uma instância de SYSTEMTIME. Ele faz o ajuste necessário no campo do ano, mas não ajusta corretamente o campo do mês:

#include <Windows.h>
#include <ctime>
  
void ConvertTmToSystemTime1b(const tm& tm) 
{ 
    SYSTEMTIME st; 
    st.wYear = tm.tm_year + 1900; 
    st.wMonth = tm.tm_mon; // C26862, Adjustment is missing 
    st.wDay = tm.tm_mday; 
} 

Para corrigir esse problema, ajuste os campos de mês e ano:

#include <Windows.h> 
#include <ctime> 
  
void ConvertTmToSystemTime(const tm& tm) 
{ 
    SYSTEMTIME st; 
    st.wYear = tm.tm_year + 1900; 
    st.wMonth = tm.tm_mon + 1; 
    st.wDay = tm.tm_mday; 
} 

Heurística

Essa regra reconhece apenas o struct Windows SYSTEMTIME e o struct C tm .

Essa regra é uma regra de aceitação, o que significa que a análise de código deve usar um arquivo de conjunto de regras, e a regra deve ser explicitamente incluída no arquivo de conjunto de regras e habilitada para que ela seja aplicada. Para obter mais informações sobre como criar um conjunto de regras personalizado para análise de código, consulte Usar conjuntos de regras para especificar as C++ regras a serem executadas.

Confira também

C6393
C6394
C26861
C26863
C26864